概要
Let’sEncrypt などで取得したワイルドカード SSL 証明書を使って Gitlab の helm chart に SSL 設定をする方法を紹介します
内部的には kubernetes の nginx-ingress が使われているのでそれの tls 機能を使います
環境
- kubernetes 1.19.3
- helm 3.5.2
- Gitlab helm chart 4.9.3
- kubernetes nginx-ingress-controller 0.41.2
手順
とりあえず先に手順を紹介します
そのあとでポイントなどを紹介します
証明書登録
Let’sEncrypt などで取得したワイルドカード証明書を secret に登録します
kubectl create secret tls gitlab-tls --cert=/path/to/tls.crt --key=/path/to/tls.key
デプロイ
helm chart をデプロイします
ワイルドカードを使って動作させる場合の最低限のオプションを指定しています
global.hosts.domain
は自身で登録した DNS の FQDN を指定してください
helm install gitlab gitlab/gitlab \
--timeout 600s \
--set global.hosts.domain=your.domain.com \
--set nginx-ingress.controller.service.type=NodePort \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false \
--set global.ingress.tls.secretName=gitlab-tls
説明
Let’sEncrypt の SSL ワイルドカード証明書取得時に指定したコモンネームと同じコモンネームを global.hosts.domain
に指定します
ワイルドカードドメインだからと言って例えばサブドメイン (global.hosts.domain=sub.your.domain.com
) を指定したりするとエラーになります
nginx-ingress-controller の Pod のログを見るとわかりますが証明書に設定されているコモンネームと global.hosts.domain
で指定されているコモンネームが異なっているというエラーが出ているとうまく設定できていないことになります
必ず取得時と同じコモンネームを指定しましょう
nginx-ingress.controller.service.type=NodePort
は今回オンプレミス環境にデプロイするので指定しています
デフォルトだと type=Loadbalancer
でデプロイされてしまいます
特に type=Loadbalancer
でも問題ないのですが気持ち悪いので NodePort に変えておきます
certmanager.install=false
と global.ingress.configureCertmanager=false
と global.ingress.tls.secretName=gitlab-tls
はワイルドカード SSL を使うのに必須の設定になります
secretName の部分は事前に secret に登録した際の名前を指定しましょう
動作確認
Pod がすべて動作しているか確認します
gitlab-webservice-default が動作していれば OK だと思います
kubectl get pod
あとは svc を調べてアクセスするポートを確認します
kubectl get svc
IP は nginx-ingress-controller Pod がデプロイされているノードの IP にアクセスします
調べ方は -o wide
を使うと Pod が乗っているノードが確認できるのでそこからノードの一覧を使って IP を確認しましょう
kubectl get pod -o wide
kubectl get node -o wide
あとは IP を DNS にレコードに登録して gitlab.your.domain.com:port
という感じでアクセスすれば Gitlab にアクセスできるはずです
補足
Gitlab 公式の helm chart の場合 nginx-ingress-controller の Pod は 2 つデプロイされます
デフォルトだとどのノードで動作するかは完全にランダムになるので再デプロイなどをすると nginx-ingress-controller の Pod の場所が変わりアクセスする IP も変わるので注意しましょう
特に DNS などを設定している場合はレコード情報を書き換えることになるのでそこも注意しましょう
解決策としては nginx-ingress-controller の Pod をノードの数と同じだけデプロイするように変更するか (もしくは Damonset を使うか) nodeSelector を使って nginx-ingress-controller の Pod を必ず特定のノードにデプロイするようにすれば IP を固定することができると思います
トラブルシューティング
再度やり直す場合は helm の delete と delete では削除されないリソースも削除してからやり直しましょう
helm delete gitlab
- for i in `kubectl get all,cm,secret,ing,job,pvc -A -o name | grep gitlab`; do kubectl delete ${i}; done;
最後に
ワイルドカード証明書のコモンネームと global.hosts.domain
の指定は必ず一致するようにしましょう
0 件のコメント:
コメントを投稿