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のリポジトリを作成します。
以下のようにchartsが表示されますので、gitlabを選択します。
こう表示されるとなかなかいいですね。
今回事前に作成したgitlabの名前空間を選びます。
yamlの差分は以下の通り。
なくていいものは色々インストールしないようにしています。
global.ingress.tls.secretNameで先ほど作成したsecretを指定します。
他のオプションはこちら を参考にしてください。
以下のようなリソースができると思います。
$ 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 agent server for Kubernetes (KAS)を使ってみる
こちら を参考にさせていただきました。
空の設定ファイルを作ります。
Add Kubernetes Clusterをクリックします。
Connect a clusterをクリックします。
ドロップボックスで選択し、Registerをクリックします。
helmコマンドが表示されます。
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-ci.ymlを作成します。
今までの手順でGitLabを構築していたらRunnerもデプロイできていると思います。
良さそうですね!
ラズパイで構築したクラスタにデプロイしましたが、arm64でも動くようですね。