セルフホスト版GitLab(Amazon EKS)からGitaly(Amazon EC2)に接続してみた

セルフホスト版GitLab(Amazon EKS)からGitaly(Amazon EC2)に接続してみた

Clock Icon2025.03.06

前提条件

  • Amazon EKS上にGitLabが構築済みであること
  • Amazon EC2上にGitalyが構築済みであること
  • Amazon EKSマネージドノードグループにGitalyサーバーと疎通可能なSecurity Groupがアタッチされていること

https://dev.classmethod.jp/articles/gitlab-eks-helm-tutorial/
https://dev.classmethod.jp/articles/ec2-gitlab-gitaly-single/

なぜGitalyをAmazon EKSクラスター外に構築するのか

GitLab公式ドキュメントにて、本番環境ではクラスター外に配置することが推奨されているからです。

In a production deployment:
The stateful components, like PostgreSQL or Gitaly (a Git repository storage dataplane), must run outside the cluster on PaaS or compute instances. This configuration is required to scale and reliably service the variety of workloads found in production GitLab environments.

Installing GitLab by using Helm | GitLab Docsから引用。

GitLabをAmazon EKSにデプロイすると、デフォルトでAmazon EKSクラスター上にGitalyがデプロイされます。

Gitalyはリポジトリストレージのため、ステートフルなデータを持つ必要があります。

KubernetesのStatefulSetを使っていて、PVにEBSを使います。

EKSクラスター内にステートフルなデータを持つと、ノードの更新時の考慮事項が増えます。

上記の観点からも、GitLabをEKSでデプロイする際はGitalyはEKSクラスター外で構築するのがお勧めです。

Gitaly Tokenの設定

GitLabからGitalyにアクセスするためにGitaly Tokenが必要です。

Gitalyインストール時に作成したTokenを、GitLab EKSクラスターにSecretsとして登録します。

kubectl -n gitlab create secret generic external-gitaly-token \
  --from-literal=token=<your-gitaly-token>

helmチャートを修正

values.yamlに以下の記述を追加します。

gitaly.gitlab.internalの部分は各自の環境に合わせて置き換えてください。

私の環境では、Route53のプライベートホストゾーンでGitaly EC2サーバーのPrivate IPアドレスを登録しました。

values.yaml
global:
  gitaly:
    enabled: false
    external:
      - name: default
        hostname: gitaly.gitlab.internal # 要置き換え
        port: 8075
    authToken:
      secret: external-gitaly-token
      key: token
    tls:
      enabled: false

記述の追加後、helm upgradeでリリースを更新します。

helm upgrade gitlab gitlab/gitlab -n gitlab -f values.yaml

参考: Configure the chart | External Gitaly | GitLab Docs

これで準備は完了です。

動作確認

GitLab -> Gitaly疎通確認

まずはGitLabからGitalyに疎通ができる確認します。

kubectl exec -it <toolbox-pod> -- gitlab-rake gitlab:gitaly:check

疎通が成功したら以下のような出力になります。

出力例
figure (init)

Checking Gitaly ...

Gitaly: ... default ... OK

Checking Gitaly ... Finished

参考: Test that GitLab can connect to Gitaly | External Gitaly | GitLab Docs

GitリポジトリのClone

When you tail the Gitaly logs on your Gitaly server, you should see requests coming in. One sure way to trigger a Gitaly request is to clone a repository from GitLab over HTTP or HTTPS.

Configure Gitaly | GitLab Docsから引用

リポジトリをHTTPかHTTPSでCloneすると、Gitalyリクエストをトリガーできるみたいです。

リポジトリをCloneして、Gitaly上にログが出力されることを確認します。

まずはGitLabにログインして、リポジトリを作成します。

GitLabアカウント作成の手順を省くために、パブリックリポジトリにしました。

vscode-drop-1741239018027-0hi7lqojyk1k.png

ローカルでgit cloneします。

git clone https://<GitLab URL>/root/test.git

Gitalyサーバーのログも見てみましょう。

Gitaly用のEC2に接続して、コマンドを実行します。

sudo gitlab-ctl tail gitaly

以下のようなログが出ていればOKです。

出力例
{"grpc.method":"InfoRefsUploadPack","grpc.service":"gitaly.SmartHTTPService","level":"info","msg":"finished streaming call with code OK","time":"2025-03-06T05:42:24.221Z"}

おわりに

EKSクラスターデプロイしたGitLabから、EC2にデプロイしたGitalyへ接続してみました。

意外とHelm側の追加は少なくできました。Gitaly Clusterの場合は、追加で記述は必要そうです。

以上、AWS事業本部の佐藤(@chari7311)でした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.