概要
Gitlab 公式の helm chart を使って k8s 上に Gitlab を構築してみました
当然ですがそのままだと全く動かなかったのでポイントなどを紹介します
今回使用する k8s 環境は kubeadm で構築した独自の k8s 環境になります
環境
- Ubuntu 18.04
- k8s v1.20.4
- helm 3.5.2
- gitlab chart 4.9.1
事前準備
そもそも公式でいろいろ足りていなかったりバグがあるのでそれの準備をします
PersistentVolume の作成
公式の chart は PersistentVolumeClaim は作成してくれますが PersistentVolume は作成してくれません
おそらく環境によって StorageClass が違うので仕方ないのですがないので作成します
なお今回はローカルストレージをマウントして PersistenVolume を作成します
当然ノードが固定されてしまうので作成する Pod もそのノードに固定されてしまいます
vim pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
claimRef:
namespace: gitlab
name: gitlab-minio
storageClassName: local-storage
local:
path: /mnt/pv2
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv3
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
claimRef:
namespace: gitlab
name: gitlab-prometheus-server
storageClassName: local-storage
local:
path: /mnt/pv3
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv4
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
claimRef:
namespace: gitlab
name: redis-data-gitlab-redis-master-0
storageClassName: local-storage
local:
path: /mnt/pv4
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv5
spec:
capacity:
storage: 50Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
claimRef:
namespace: gitlab
name: repo-data-gitlab-gitaly-0
storageClassName: local-storage
local:
path: /mnt/pv5
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
ポイントは claimRef
を使っている点です
こうすることで chart が自動で作成する pvc とこちらが手動で作成する pv を紐付けて使えるようにしてくれます
例えば name: repo-data-gitlab-gitaly-0
は chart をデプロイしてみるとわかりますがその名前で pvc がデプロイされます
必要なマウント先のディレクトリを作成して apply します
mkdir /mnt/pv1 /mnt/pv2 /mnt/pv3 /mnt/pv4 /mnt/pv5
kubectl apply -f pv.yml
kubectl get pv
PostgreSQL の作成
コンテナで動作させています
gitlab ユーザと gitlabhq_production データベースの作成をしましょう
過去に紹介した手順で作成すれば問題ありません
gitlab ユーザに設定するパスワードはあとで k8s の secret に登録するのでメモしておきましょう
secret の登録
postgres に接続する gitlab ユーザのパスワードを事前に登録しておきます
chart などを事前にデプロイしておりすでに作成してある場合は削除しましょう
kubectl delete secret gitlab-postgresql-password -n gitlab
kubectl create secret generic gitlab-postgresql-password \
--namespace gitlab \
--from-literal postgresql-password='xxxxx' \
--from-literal postgresql-postgres-password='xxxxx'
xxxxx の部分は好きなパスワードを入力してください
namespace は後述しているのでない場合は作成しましょう
helm のインストール
今回は Ubuntu にインストールするので apt を使う手順でインストールしました
curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
apt-get install apt-transport-https --yes
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
apt-get -y update
apt-get -y install helm
gitlab chart の取得
準備ができたら chart をデプロイしていきます
helm repo add gitlab https://charts.gitlab.io/
namespace の作成
gitlab 用の namespace を作成します
kubectl create namespace gitlab
デプロイ
ではデプロイしていきます
オプションがいくつかあるのであとで説明します
helm install gitlab gitlab/gitlab \
--namespace gitlab \
--timeout 600s \
--set global.hosts.domain=gitlab.example.com \
--set global.hosts.externalIP=192.168.100.10 \
--set certmanager-issuer.email=name@domain.com \
--set postgresql.install=false \
--set global.psql.host=192.168.100.11 \
--set global.psql.password.secret=gitlab-postgresql-password \
--set global.psql.password.key=postgresql-password
global.hosts.domain
, global.hosts.externalIP
, certmanager-issuer.email
は内部的に使用している external_url と SSL 証明書取得に必要なパラメータになります
postgresql.install
, global.psql.host
, global.psql.password.secret
, global.psql.password.key
が外部に構築した PostgreSQL の情報を設定するオプションになります
postgresql.install=false
にすることで chart での postgres の構築はしなくなります
global.psql.host
は postgres が LISTEN している IP を指定します
ポートも指定できますが今回はポートは 5432 から変更していないので指定していません
global.psql.password.secret
と global.psql.password.key
は k8s に登録した secret の情報になります
前者が secret 自体の名前で後者が from-literal
で登録した key/value の key の部分を指定します
動作確認
まずは Pods がすべて正常に動作しているか確認しましょう
kubectl get pod -n gitlab
NAME READY STATUS RESTARTS AGE
gitlab-cainjector-5c6477876c-wtndw 1/1 Running 0 7m44s
gitlab-cert-manager-795fc9bc98-dkwcj 1/1 Running 0 7m44s
gitlab-gitaly-0 1/1 Running 0 7m44s
gitlab-gitlab-exporter-7d48bc7647-fggj2 1/1 Running 0 7m44s
gitlab-gitlab-runner-57748568f7-78m6f 0/1 CrashLoopBackOff 2 7m44s
gitlab-gitlab-shell-57b945dc6d-9jd57 0/1 Pending 0 7m29s
gitlab-gitlab-shell-57b945dc6d-tc2ks 1/1 Running 0 7m44s
gitlab-issuer-1-jbzc8 0/1 Completed 0 7m44s
gitlab-migrations-1-wvnzf 0/1 Completed 0 7m44s
gitlab-minio-7754b8d9d9-tnvcm 1/1 Running 0 7m44s
gitlab-minio-create-buckets-1-9t46l 0/1 Completed 0 7m44s
gitlab-nginx-ingress-controller-87dcb7cc4-7dpkz 0/1 Pending 0 7m43s
gitlab-nginx-ingress-controller-87dcb7cc4-nm7r5 1/1 Running 0 7m44s
gitlab-nginx-ingress-default-backend-d66cb657-qfzpb 1/1 Running 0 7m43s
gitlab-prometheus-server-6878cb55d4-htmjr 2/2 Running 0 7m43s
gitlab-redis-master-0 2/2 Running 0 7m44s
gitlab-registry-7bd7d55766-bf8xw 1/1 Running 0 7m43s
gitlab-registry-7bd7d55766-k69ql 1/1 Running 0 7m43s
gitlab-sidekiq-all-in-1-v1-77b676769c-xtbbp 1/1 Running 0 7m44s
gitlab-task-runner-65b5dc5764-897hp 1/1 Running 0 7m44s
gitlab-webservice-default-f7f7cbc5f-8474w 2/2 Running 0 7m44s
gitlab-webservice-default-f7f7cbc5f-v47np 2/2 Running 0 7m44s
gitlab-runner は dind 環境が必要で今回はセットアップしません
gitlab-webservice-default
が Running になっていれば OK です
gitlab の chart では nginx-ingress-controller が動作しており Host 名ごとに gitlab や registry, minio をバランシングしています
kubectl get ingress -n gitlab
AME CLASS HOSTS ADDRESS PORTS AGE
gitlab-minio <none> minio.k8s.jp-east-1.devops.teamops.nifcloud.net 80, 443 12m
gitlab-registry <none> registry.k8s.jp-east-1.devops.teamops.nifcloud.net 80, 443 12m
gitlab-webservice-default <none> gitlab.k8s.jp-east-1.devops.teamops.nifcloud.net 80, 443 12m
Service で LISTEN しているポートがわかるので確認します
Type は Loadbalancer ですが実際は NodePort でアクセスします
kubectl get svc gitlab-nginx-ingress-controller -n gitlab
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gitlab-nginx-ingress-controller LoadBalancer 10.108.0.100 <pending> 80:31657/TCP,443:32332/TCP,22:31328/TCP 15m
https://gitlab.example.com:32332/
にアクセスすると root のログイン画面が表示されます
証明書は certmanager という Pods が作成しているのですが自己証明書なのでブラウザで警告が表示されると思います
パスワードは k8s の secret に保存されているので secret から取得します
kubectl get secret gitlab-gitlab-initial-root-password -n gitlab -ojsonpath='{.data.password}' | base64 --decode ; echo
ここで表示されたパスワードで root ログインすると Gitlab にログインできます
トラブルシューティング
PV の作成がうまくできてない場合に発生しました
PV を作成してうまく redis や gitaly が上がってきて migration Pod がうまく成功すればいいのですが migration が失敗する場合に出ます
MountVolume.SetUp failed for volume "init-webservice-secrets" : failed to sync secret cache: timed out waiting for the condition
no persistent volumes available for this claim and no storage class is set
最後に
やはりというか嵌りポイントは多かったです
そもそも k8s についてかなりの知識がないとトラブルシューティングもできないので Omnibus Install の Gitlab や docker イメージの Gitlab に比べるとかなりハードルの高いデプロイ方法かなと思います
0 件のコメント:
コメントを投稿