2021年3月4日木曜日

Gitlab 公式の helm chart を試してみた

概要

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.secretglobal.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 件のコメント:

コメントを投稿