GitLabをHelmで構築する

GitLabのKASを使ってみようと思ったのですが、
いつも使っているsameersbn/docker-gitlabはまだ対応していない ようですね。
公式の方は対応していそうでしたので、ついでにHelmで構築してみました。
公式ドキュメントはこちら ですかね。
ちなみにプロダクション向けではないようです。

今回はRancherのRKEで構築したシングルノードクラスタを使います。
以下のような状態です。
追加でmetalLBを入れています。

$ kubectl get node -o wide
NAME      STATUS   ROLES                      AGE   VERSION    INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
example   Ready    controlplane,etcd,worker   43h   v1.24.15   192.168.0.205   <none>        Ubuntu 20.04.6 LTS   5.4.0-153-generic   docker://24.0.4
$ kubectl get pod -A
NAMESPACE             NAME                                      READY   STATUS      RESTARTS      AGE
cattle-fleet-system   fleet-agent-7468ff4fb4-ws7pv              1/1     Running     1 (52m ago)   43h
cattle-system         cattle-cluster-agent-5c68d5549b-jvbvh     1/1     Running     9 (48m ago)   43h
cattle-system         cattle-node-agent-qww55                   1/1     Running     1 (51m ago)   43h
cattle-system         kube-api-auth-lwjxv                       1/1     Running     1 (52m ago)   43h
ingress-nginx         ingress-nginx-admission-create-jc9xq      0/1     Completed   0             43h
ingress-nginx         ingress-nginx-admission-patch-qm9dm       0/1     Completed   0             43h
ingress-nginx         nginx-ingress-controller-4nhwb            1/1     Running     1 (51m ago)   43h
kube-system           coredns-59499769fb-r2j2w                  1/1     Running     1 (52m ago)   43h
kube-system           coredns-autoscaler-67cbd4599c-dqzdd       1/1     Running     1 (52m ago)   43h
kube-system           kube-flannel-8ffq7                        2/2     Running     2 (51m ago)   43h
kube-system           metrics-server-b5b7d5fbc-9t2cw            1/1     Running     1 (52m ago)   43h
kube-system           rke-coredns-addon-deploy-job-pf7kb        0/1     Completed   0             43h
kube-system           rke-ingress-controller-deploy-job-xvdqr   0/1     Completed   0             43h
kube-system           rke-metrics-addon-deploy-job-2rp4q        0/1     Completed   0             43h
kube-system           rke-network-plugin-deploy-job-hv4zh       0/1     Completed   0             43h
metallb-system        metallb-controller-6c46576fd9-wndxr       1/1     Running     1 (52m ago)   43h
metallb-system        metallb-speaker-nqd4d                     4/4     Running     6 (52m ago)   43h

事前準備

普通にデプロイしても動きません。

まずPVを準備しないといけません。
今回はNFSサーバーを準備したので以下のようなPVを作成しました。
どのPVにBOUNDされるかわからないので名前は適当。

$ cat gitlab_pvs.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlab-pv-10g-1
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /nfs/gitlab/pv-10G-1
    server: 192.168.0.206
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlab-pv-10g-2
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /nfs/gitlab/pv-10G-2
    server: 192.168.0.206
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlab-pv-10g-3
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /nfs/gitlab/pv-10G-3
    server: 192.168.0.206
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlab-pv-10g-4
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /nfs/gitlab/pv-10G-4
    server: 192.168.0.206
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gitlab-pv-50g-1
spec:
  capacity:
    storage: 50Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /nfs/gitlab/pv-50G-1
    server: 192.168.0.206

作成します。

$ kubectl apply -f gitlab_pvs.yaml 
persistentvolume/gitlab-pv-10g-1 created
persistentvolume/gitlab-pv-10g-2 created
persistentvolume/gitlab-pv-10g-3 created
persistentvolume/gitlab-pv-10g-4 created
persistentvolume/gitlab-pv-50g-1 created
ubuntu@example:~$ kubectl get pv
NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
gitlab-pv-10g-1   10Gi       RWO            Retain           Available                                   86s
gitlab-pv-10g-2   10Gi       RWO            Retain           Available                                   86s
gitlab-pv-10g-3   10Gi       RWO            Retain           Available                                   86s
gitlab-pv-10g-4   10Gi       RWO            Retain           Available                                   86s
gitlab-pv-50g-1   50Gi       RWO            Retain           Available                                   85s

次にhttps通信するためのLet’s Encrypt証明書を使います。
最初は自己証明書で頑張ってみましたが辛いので諦めました。
デプロイする名前空間をここで作成します。
Let’s Encrypt証明書の作り方は こちら が参考になると思います。

$ kubectl create ns gitlab
namespace/gitlab created
$ kubectl create secret tls my-secret --namespace gitlab --cert fullchain.pem --key privkey.pem --dry-run=client -o yaml > my-secret.yaml
$ kubectl apply -f my-secret.yaml 
secret/my-secret created

デプロイ

せっかくRancherを使っているのでGUIでインストールします。
GitLabのリポジトリを作成します。

gitlab_helm_01.png

以下のようにchartsが表示されますので、gitlabを選択します。
こう表示されるとなかなかいいですね。

gitlab_helm_02.png

今回事前に作成したgitlabの名前空間を選びます。

gitlab_helm_03.png

yamlの差分は以下の通り。
なくていいものは色々インストールしないようにしています。

gitlab_helm_04.png

global.ingress.tls.secretNameで先ほど作成したsecretを指定します。

gitlab_helm_05.png

他のオプションはこちら を参考にしてください。

以下のようなリソースができると思います。

$ kubectl get all -n gitlab
NAME                                                                READY   STATUS      RESTARTS       AGE
pod/gitlab-7-1689586586-gitaly-0                                    1/1     Running     0              5m32s
pod/gitlab-7-1689586586-gitlab-exporter-5944897749-rn2cz            1/1     Running     0              5m33s
pod/gitlab-7-1689586586-gitlab-runner-76944c97f5-2rrbz              1/1     Running     0              5m33s
pod/gitlab-7-1689586586-gitlab-shell-6f8d7bc788-gd4jp               1/1     Running     0              5m18s
pod/gitlab-7-1689586586-gitlab-shell-6f8d7bc788-njk77               1/1     Running     0              5m32s
pod/gitlab-7-1689586586-kas-97d6486bd-k7kxc                         1/1     Running     3 (5m7s ago)   5m32s
pod/gitlab-7-1689586586-kas-97d6486bd-znmgk                         1/1     Running     2 (5m7s ago)   5m17s
pod/gitlab-7-1689586586-migrations-1-lwbqz                          0/1     Completed   0              5m32s
pod/gitlab-7-1689586586-minio-88c9489d9-tqn28                       1/1     Running     0              5m32s
pod/gitlab-7-1689586586-minio-create-buckets-1-qr4nx                0/1     Completed   0              5m32s
pod/gitlab-7-1689586586-nginx-ingress-controller-86484b7c85-2qffs   1/1     Running     0              5m33s
pod/gitlab-7-1689586586-nginx-ingress-controller-86484b7c85-t2wzb   1/1     Running     0              5m32s
pod/gitlab-7-1689586586-postgresql-0                                2/2     Running     0              5m32s
pod/gitlab-7-1689586586-redis-master-0                              2/2     Running     0              5m32s
pod/gitlab-7-1689586586-registry-5f8b48cbdc-6mlfn                   1/1     Running     0              5m17s
pod/gitlab-7-1689586586-registry-5f8b48cbdc-dhzmk                   1/1     Running     0              5m33s
pod/gitlab-7-1689586586-sidekiq-all-in-1-v2-5f5bb54fff-klrm5        1/1     Running     0              5m32s
pod/gitlab-7-1689586586-toolbox-65c74bc6c4-rbhj6                    1/1     Running     0              5m33s
pod/gitlab-7-1689586586-webservice-default-6bdd5c8dd4-gqv5n         2/2     Running     0              5m32s
pod/gitlab-7-1689586586-webservice-default-6bdd5c8dd4-r8jll         2/2     Running     0              5m17s

NAME                                                           TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                                   AGE
service/gitlab-7-1689586586-gitaly                             ClusterIP      None            <none>          8075/TCP,9236/TCP                         5m33s
service/gitlab-7-1689586586-gitlab-exporter                    ClusterIP      10.43.103.186   <none>          9168/TCP                                  5m33s
service/gitlab-7-1689586586-gitlab-shell                       ClusterIP      10.43.3.180     <none>          22/TCP                                    5m33s
service/gitlab-7-1689586586-kas                                ClusterIP      10.43.134.219   <none>          8150/TCP,8153/TCP,8154/TCP,8151/TCP       5m33s
service/gitlab-7-1689586586-minio-svc                          ClusterIP      10.43.139.100   <none>          9000/TCP                                  5m33s
service/gitlab-7-1689586586-nginx-ingress-controller           LoadBalancer   10.43.46.130    192.168.0.225   80:32072/TCP,443:32518/TCP,22:30743/TCP   5m33s
service/gitlab-7-1689586586-nginx-ingress-controller-metrics   ClusterIP      10.43.175.93    <none>          10254/TCP                                 5m33s
service/gitlab-7-1689586586-postgresql                         ClusterIP      10.43.206.206   <none>          5432/TCP                                  5m33s
service/gitlab-7-1689586586-postgresql-hl                      ClusterIP      None            <none>          5432/TCP                                  5m33s
service/gitlab-7-1689586586-postgresql-metrics                 ClusterIP      10.43.154.91    <none>          9187/TCP                                  5m33s
service/gitlab-7-1689586586-redis-headless                     ClusterIP      None            <none>          6379/TCP                                  5m33s
service/gitlab-7-1689586586-redis-master                       ClusterIP      10.43.202.175   <none>          6379/TCP                                  5m33s
service/gitlab-7-1689586586-redis-metrics                      ClusterIP      10.43.147.201   <none>          9121/TCP                                  5m33s
service/gitlab-7-1689586586-registry                           ClusterIP      10.43.100.111   <none>          5000/TCP                                  5m33s
service/gitlab-7-1689586586-webservice-default                 ClusterIP      10.43.197.56    <none>          8080/TCP,8181/TCP,8083/TCP                5m33s

NAME                                                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/gitlab-7-1689586586-gitlab-exporter            1/1     1            1           5m33s
deployment.apps/gitlab-7-1689586586-gitlab-runner              1/1     1            1           5m33s
deployment.apps/gitlab-7-1689586586-gitlab-shell               2/2     2            2           5m33s
deployment.apps/gitlab-7-1689586586-kas                        2/2     2            2           5m33s
deployment.apps/gitlab-7-1689586586-minio                      1/1     1            1           5m33s
deployment.apps/gitlab-7-1689586586-nginx-ingress-controller   2/2     2            2           5m33s
deployment.apps/gitlab-7-1689586586-registry                   2/2     2            2           5m33s
deployment.apps/gitlab-7-1689586586-sidekiq-all-in-1-v2        1/1     1            1           5m33s
deployment.apps/gitlab-7-1689586586-toolbox                    1/1     1            1           5m33s
deployment.apps/gitlab-7-1689586586-webservice-default         2/2     2            2           5m33s

NAME                                                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/gitlab-7-1689586586-gitlab-exporter-5944897749            1         1         1       5m33s
replicaset.apps/gitlab-7-1689586586-gitlab-runner-76944c97f5              1         1         1       5m33s
replicaset.apps/gitlab-7-1689586586-gitlab-shell-6f8d7bc788               2         2         2       5m33s
replicaset.apps/gitlab-7-1689586586-kas-97d6486bd                         2         2         2       5m32s
replicaset.apps/gitlab-7-1689586586-minio-88c9489d9                       1         1         1       5m32s
replicaset.apps/gitlab-7-1689586586-nginx-ingress-controller-86484b7c85   2         2         2       5m33s
replicaset.apps/gitlab-7-1689586586-registry-5f8b48cbdc                   2         2         2       5m33s
replicaset.apps/gitlab-7-1689586586-sidekiq-all-in-1-v2-5f5bb54fff        1         1         1       5m32s
replicaset.apps/gitlab-7-1689586586-toolbox-65c74bc6c4                    1         1         1       5m33s
replicaset.apps/gitlab-7-1689586586-webservice-default-6bdd5c8dd4         2         2         2       5m32s

NAME                                                READY   AGE
statefulset.apps/gitlab-7-1689586586-gitaly         1/1     5m33s
statefulset.apps/gitlab-7-1689586586-postgresql     1/1     5m32s
statefulset.apps/gitlab-7-1689586586-redis-master   1/1     5m32s

NAME                                                                          REFERENCE                                            TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/gitlab-7-1689586586-gitlab-shell          Deployment/gitlab-7-1689586586-gitlab-shell          5m/100m    2         10        2          5m33s
horizontalpodautoscaler.autoscaling/gitlab-7-1689586586-kas                   Deployment/gitlab-7-1689586586-kas                   1m/100m    2         10        2          5m33s
horizontalpodautoscaler.autoscaling/gitlab-7-1689586586-registry              Deployment/gitlab-7-1689586586-registry              2%/75%     2         10        2          5m33s
horizontalpodautoscaler.autoscaling/gitlab-7-1689586586-sidekiq-all-in-1-v2   Deployment/gitlab-7-1689586586-sidekiq-all-in-1-v2   45m/350m   1         10        1          5m33s
horizontalpodautoscaler.autoscaling/gitlab-7-1689586586-webservice-default    Deployment/gitlab-7-1689586586-webservice-default    11m/1      2         10        2          5m33s

NAME                                                   COMPLETIONS   DURATION   AGE
job.batch/gitlab-7-1689586586-migrations-1             1/1           2m1s       5m32s
job.batch/gitlab-7-1689586586-minio-create-buckets-1   1/1           30s        5m32s
$ kubectl get pv,pvc -n gitlab
NAME                               CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                                  STORAGECLASS   REASON   AGE
persistentvolume/gitlab-pv-10g-1   10Gi       RWO            Retain           Bound       gitlab/gitlab-7-1689586586-minio                                               18m
persistentvolume/gitlab-pv-10g-2   10Gi       RWO            Retain           Bound       gitlab/redis-data-gitlab-7-1689586586-redis-master-0                           18m
persistentvolume/gitlab-pv-10g-3   10Gi       RWO            Retain           Bound       gitlab/data-gitlab-7-1689586586-postgresql-0                                   18m
persistentvolume/gitlab-pv-10g-4   10Gi       RWO            Retain           Available                                                                                  18m
persistentvolume/gitlab-pv-50g-1   50Gi       RWO            Retain           Bound       gitlab/repo-data-gitlab-7-1689586586-gitaly-0                                  18m

NAME                                                                  STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/data-gitlab-7-1689586586-postgresql-0           Bound    gitlab-pv-10g-3   10Gi       RWO                           8m25s
persistentvolumeclaim/gitlab-7-1689586586-minio                       Bound    gitlab-pv-10g-1   10Gi       RWO                           8m26s
persistentvolumeclaim/redis-data-gitlab-7-1689586586-redis-master-0   Bound    gitlab-pv-10g-2   10Gi       RWO                           8m25s
persistentvolumeclaim/repo-data-gitlab-7-1689586586-gitaly-0          Bound    gitlab-pv-50g-1   50Gi       RWO                           8m25s

ingressは以下のようなホスト名で作成されます。
これらにアクセスするためにDNSで名前解決できるようにしてください。

$ kubectl get ingress -n gitlab
NAME                                     CLASS                       HOSTS                                  ADDRESS         PORTS     AGE
gitlab-7-1689586586-kas                  gitlab-7-1689586586-nginx   kas.example.tsuchinokometal.com        192.168.0.205   80, 443   77m
gitlab-7-1689586586-minio                gitlab-7-1689586586-nginx   minio.example.tsuchinokometal.com      192.168.0.205   80, 443   77m
gitlab-7-1689586586-registry             gitlab-7-1689586586-nginx   registry.example.tsuchinokometal.com   192.168.0.205   80, 443   77m
gitlab-7-1689586586-webservice-default   gitlab-7-1689586586-nginx   gitlab.example.tsuchinokometal.com     192.168.0.205   80, 443   77m

とりあえず動けばいいので今回はcorednsのhostsで解決します。

$ kubectl get configmap -n kube-system coredns -o jsonpath='{.data.Corefile}'
.:53 {
    errors
    health {
      lameduck 5s
    }
    hosts {
      192.168.0.202 rancher.tsuchinokometal.com
      192.168.0.225 kas.example.tsuchinokometal.com
      192.168.0.225 minio.example.tsuchinokometal.com
      192.168.0.225 registry.example.tsuchinokometal.com
      192.168.0.225 gitlab.example.tsuchinokometal.com
      fallthrough
    }
    ready
    kubernetes cluster.local in-addr.arpa ip6.arpa {
      pods insecure
      fallthrough in-addr.arpa ip6.arpa
    }
    prometheus :9153
    #forward . "/etc/resolv.conf"
    forward . 8.8.8.8 8.8.4.4
    cache 30
    loop
    reload
    loadbalance
} # STUBDOMAINS - Rancher specific change

うまくデプロイできていたらログイン画面が表示されると思います。
パスワードは以下のコマンドで確認します。

$ kubectl get secret gitlab-7-1689586586-gitlab-initial-root-password -n gitlab -ojsonpath='{.data.password}' | base64 --decode ; echo
zg7BC7ItOZgEP2Jff5ofcguDCxcjP0Z8yj46f1OvRnC6gmSNdESa8n4kQoQyRrK3
gitlab_helm_06.png

GitLab agent server for Kubernetes (KAS)を使ってみる

こちら を参考にさせていただきました。

空の設定ファイルを作ります。

gitlab_kas_01.png

Add Kubernetes Clusterをクリックします。

gitlab_kas_02.png

Connect a clusterをクリックします。

gitlab_kas_03.png

ドロップボックスで選択し、Registerをクリックします。

gitlab_kas_04.png

helmコマンドが表示されます。

gitlab_kas_05.png

GUIめんどくさいので、 ここではコマンド実行でインストールします。

$ helm repo add gitlab https://charts.gitlab.io
"gitlab" has been added to your repositories
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "gitlab" chart repository
Update Complete. ⎈Happy Helming!⎈
$ helm upgrade --install my-agent gitlab/gitlab-agent \
>     --namespace gitlab-agent-my-agent \
>     --create-namespace \
>     --set image.tag=v16.1.3 \
>     --set config.token=HD8DnsoyoxXzV8qsmgdWQyhkBXnZdqzGiVUbiccgTPxt8iiyEQ \
>     --set config.kasAddress=wss://kas.example.tsuchinokometal.com
Release "my-agent" does not exist. Installing it now.
NAME: my-agent
LAST DEPLOYED: Wed Jul 19 21:18:55 2023
NAMESPACE: gitlab-agent-my-agent
STATUS: deployed
REVISION: 1
TEST SUITE: None
$ kubectl get pod -n gitlab-agent-my-agent
NAME                                       READY   STATUS    RESTARTS   AGE
my-agent-gitlab-agent-v1-7648b9659-dmhp6   1/1     Running   0          56s

うまくいけばConnectedになると思います。

gitlab_kas_06.png

テストしてみます。
.gitlab-ci.ymlを作成します。
今までの手順でGitLabを構築していたらRunnerもデプロイできていると思います。

gitlab_kas_07.png

良さそうですね!

gitlab_kas_08.png

ラズパイで構築したクラスタにデプロイしましたが、arm64でも動くようですね。