2021年4月18日日曜日

Gitlab helm chart で Gitaly Cluster を構成してデプロイする方法

Gitlab helm chart で Gitaly Cluster を構成してデプロイする方法

概要

デフォルトのデプロイ方式だと Praefect がデプロイされず Gitaly もシングル構成でデプロイされます
今回は Praefect を有効にして Gitlab helm chart を使って Gitaly Cluster を構築してみました
なお、現在の Gitlab helm chart (4.10.3) では Gitaly Cluster 単体でデプロイすることはできないので必ず Gitlab と合わせてデプロイする必要があります

環境

  • kubernetes 1.20.4
  • helm 3.5.2
  • Gitlab helm chart 4.10.3

コマンド全体

helm install gitlab gitlab/gitlab --namespace gitlab --timeout 600s \
--set global.hosts.domain=gitlab.example.com \
--set global.gitlabVersion=13.10.2 \
--set nginx-ingress.controller.hostNetwork=true \
--set nginx-ingress.controller.service.type="" \
--set nginx-ingress.controller.kind=DaemonSet \
--set nginx-ingress.controller.service.externalTrafficPolicy="" \
--set global.praefect.enabled=true \
--set global.praefect.virtualStorages[0].name=default \
--set global.praefect.virtualStorages[0].gitalyReplicas=4 \
--set global.praefect.virtualStorages[0].maxUnavailable=2

hostNetwork を使う設定にしていますが不要であれば削除してください

Gitaly Cluster を構築するためのパラメータ

今回の肝となるパラメータは以下の 4 つです
まず praefect を ON にする必要があるので enabled=true は必須です
他の 3 つパラメータはクラスタ内にデプロイする gitaly の Pod の数になります
今回は 4 つデプロイする設定にしています
Gitaly Cluster では virtualStorages 名を決める必要があります
default という virtualStorages が必ず 1 つは必要になるので今回は default だけ作成しています
virtualStorages を追加したい場合は配列のインデックスを 1 にして name=vs2 などにして gitalyReplicas と maxUnavailable の値を設定すれば OK です

--set global.praefect.enabled=true \
--set global.praefect.virtualStorages[0].name=default \
--set global.praefect.virtualStorages[0].gitalyReplicas=4 \
--set global.praefect.virtualStorages[0].maxUnavailable=2

Postgres データベースに必要な値を投入する

Gitaly Cluster をデプロイすると最初は sql open: pq: password authentication failed for user "praefect" となり Gitaly Cluster は起動しません
これは Postgres に praefect 用のユーザとロールが存在しないためで現在の helm chart だとユーザとロール情報は手動で設定する必要があります
また Postgres が VM や RDS などで外部にある場合はコマンドが多少変わるので完了に合わせてユーザやロールを作成してください
以下は Pod でデプロイした Postgres に対してユーザとロールを追加する場合のコマンドです

直接コンテナにログインして SQL コマンドを実行する感じになります

# kubectl get secret gitlab-praefect-dbsecret -n gitlab -o jsonpath="{.data.secret}" | base64 --decode
# kubectl exec -it $(kubectl get pods -n gitlab -l app=postgresql -o custom-columns=NAME:.metadata.name --no-headers) -n gitlab -- bash
Defaulting container name to gitlab-postgresql.
Use 'kubectl describe pod/gitlab-postgresql-0 -n gitlab' to see all of the containers in this pod.
I have no name!@gitlab-postgresql-0:/$ PGPASSWORD=$(cat $POSTGRES_POSTGRES_PASSWORD_FILE) psql -U postgres -d template1
psql (11.9)
Type "help" for help.

template1=# CREATE ROLE praefect WITH LOGIN;
CREATE ROLE
template1=# \password praefect
Enter new password:
Enter it again:
template1=# CREATE DATABASE praefect WITH OWNER praefect;
CREATE DATABASE
template1=# \q
I have no name!@gitlab-postgresql-0:/$ exit
exit

動作確認

  • kubectl get pod -n gitlab

gitlab-gitaly-default-0 から gitlab-gitaly-default-3 までが問題なく起動しているのと gitlab-praefect-0, gitlab-praefect-1 が起動していれば Gitaly Cluster の構築が完了していることになります

あとは Gitlab にアクセスして git push ができるのも確認しても良いと思います

最後に

Gitaly の helm chart が Gitlab の helm chart から完全に分離されて個別にデプロイできるようになるともっと便利になるかなと思いました

参考サイト

0 件のコメント:

コメントを投稿