セルフホスト版GitLab(Amazon EKS)からGitaly(Amazon EC2)に接続してみた
前提条件
- Amazon EKS上にGitLabが構築済みであること
- Amazon EC2上にGitalyが構築済みであること
- Amazon EKSマネージドノードグループにGitalyサーバーと疎通可能なSecurity Groupがアタッチされていること
なぜ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アドレスを登録しました。
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アカウント作成の手順を省くために、パブリックリポジトリにしました。
ローカルで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)でした。