2021年3月18日木曜日

Gitlab 公式の helm chart でワイルドカード SSL 証明書を設定する方法

概要

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=falseglobal.ingress.configureCertmanager=falseglobal.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 件のコメント:

コメントを投稿