GitLabチャートのTLS設定

このChartはNGINX Ingress Controllerを使ってTLSターミネーションを行うことができます。デプロイ用に TLS 証明書を取得する方法を選択できます。詳細はIngressのグローバル設定に記載されています。

オプション 1: cert-manager と Let’s Encrypt

Let’s Encrypt は無料で自動化されたオープンな作成者です。証明書は様々なツールを使って自動的に要求することができます。このChartは、一般的な選択肢であるcert-managerとインテグレーションする準備ができています。

すでにcert-managerを使用している場合は、global.ingress.annotations 、cert-managerのデプロイに適切なアノテーションを設定できます。

クラスターにまだcert-managerがインストールされていない場合は、このChartの依存関係としてインストールして設定できます。

内部cert-managerとIssuer

helm repo update
helm dep update
helm install gitlab gitlab/gitlab \
  --set certmanager-issuer.email=you@example.com

cert-manager のインストールはcertmanager.install 設定で制御され、Chart での使用はglobal.ingress.configureCertmanager 設定で制御されます。どちらもデフォルトではtrue 、デフォルトでは発行者の電子メールのみを提供する必要があります。

外部cert-managerと内部Issuer

このChartの一部として、外部cert-manager 、発行者を提供することも可能です。

helm install gitlab gitlab/gitlab \
  --set certmanager.install=false \
  --set certmanager-issuer.email=you@example.com \
  --set global.ingress.annotations."kubernetes\.io/tls-acme"=true

外部の証明書管理者と発行者(外部)

外部のcert-managerIssuer リソースを利用するには、自己署名証明書が有効にならないように、いくつかの項目を提供する必要があります。

  1. 外部cert-manager をアクティブにするためのアノテーション(詳しくはドキュメントをご覧ください)
  2. 各サービスのTLSシークレットの名前(これは自己署名ビヘイビアを非アクティブにします)
helm install gitlab gitlab/gitlab \
  --set certmanager.install=false \
  --set global.ingress.configureCertmanager=false \
  --set global.ingress.annotations."kubernetes\.io/tls-acme"=true \
  --set gitlab.webservice.ingress.tls.secretName=RELEASE-gitlab-tls \
  --set registry.ingress.tls.secretName=RELEASE-registry-tls \
  --set minio.ingress.tls.secretName=RELEASE-minio-tls \
  --set gitlab.kas.ingress.tls.secretName=RELEASE-kas-tls

オプション2:独自のワイルドカード証明書を使用

フルチェーン証明書と鍵をSecret としてクラスターに追加します:

kubectl create secret tls <tls-secret-name> --cert=<path/to-full-chain.crt> --key=<path/to.key>

以下のオプションを含めます。

helm install gitlab gitlab/gitlab \
  --set certmanager.install=false \
  --set global.ingress.configureCertmanager=false \
  --set global.ingress.tls.secretName=<tls-secret-name>

証明書の管理にAWS ACMを使用

AWS ACM を使用してワイルドカード証明書を作成する場合、ACM 証明書はダウンロードできないため、シークレットで指定することはできません。代わりにnginx-ingress.controller.service.annotations で指定します:

nginx-ingress:
  controller:
    service:
      annotations:
        ...
        service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:{region}:{user id}:certificate/{id}

オプション 3: サービスごとに個別の証明書を使用

フルチェーン証明書をシークレットとしてクラスターに追加し、そのシークレット名を各Ingressに渡します。

helm install gitlab gitlab/gitlab \
  --set certmanager.install=false \
  --set global.ingress.configureCertmanager=false \
  --set global.ingress.tls.enabled=true \
  --set gitlab.webservice.ingress.tls.secretName=RELEASE-gitlab-tls \
  --set registry.ingress.tls.secretName=RELEASE-registry-tls \
  --set minio.ingress.tls.secretName=RELEASE-minio-tls \
  --set gitlab.kas.ingress.tls.secretName=RELEASE-kas-tls
note
GitLabインスタンスが他のサービスと通信するように設定している場合は、それらのサービスの証明書チェーンをHelmチャートを通してGitLabに提供する必要があるかもしれません。

オプション4:自動生成された自己署名ワイルドカード証明書を使う

これらのChartは、自動生成された自己署名ワイルドカード証明書を提供する機能も提供します。これは、Let’s Encryptは使えないがSSLによるセキュリティが必要な環境で有用です。この機能はshared-secretsジョブによって提供されます。

注意:gitlab-runner Chart は自己署名証明書では正しく機能しません。以下に示すように、無効にすることをお勧めします。

helm install gitlab gitlab/gitlab \
  --set certmanager.install=false \
  --set global.ingress.configureCertmanager=false \
  --set gitlab-runner.install=false

shared-secrets ジョブは、CA 証明書、ワイルドカード証明書、およびすべての外部アクセス可能なサービスで使用する証明書チェーンを生成します。これらを含むシークレットはRELEASE-wildcard-tlsRELEASE-wildcard-tls-caRELEASE-wildcard-tls-chain となります。RELEASE-wildcard-tls-ca には公開CA証明書が含まれ、デプロイされたGitLabインスタンスにアクセスするユーザーやシステムに配布することができます。RELEASE-wildcard-tls-chain には CA 証明書とワイルドカード証明書の両方が含まれており、gitlab-runner.certsSecretName=RELEASE-wildcard-tls-chainを介して GitLab Runner に直接使用することもできます。

GitLab PagesのTLS要件

TLSをサポートするGitLab Pagesでは*.<pages domain><pages domain> のデフォルト値はpages.<base domain> )に該当するワイルドカード証明書が必要です。

ワイルドカード証明書が必要なため、cert-managerやLet’s Encryptでは自動的に作成することができません。そのため、cert-managerはGitLab Pagesではデフォルトで無効になっています(gitlab-pages.ingress.configureCertmanager )。そのため、ワイルドカード証明書を含むk8s Secretを自分で用意する必要があります。global.ingress.annotations を使って外部の cert-manager を設定している場合は、gitlab-pages.ingress.annotations でそのようなアノテーションを上書きする必要があります。

デフォルトでは、このシークレットの名前は<RELEASE>-pages-tls です。gitlab.gitlab-pages.ingress.tls.secretName の設定で別の名前を指定できます:

helm install gitlab gitlab/gitlab \
  --set global.pages.enabled=true \
  --set gitlab.gitlab-pages.ingress.tls.secretName=<secret name>

トラブルシューティング

このセクションでは、遭遇する可能性のある問題の解決策を説明します。

SSL終了エラー

Let’s EncryptをTLSプロバイダとして使用していて、証明書関連のエラーに直面した場合、デバッグするためのいくつかのオプションがあります:

  1. letsdebugを使ってドメインにエラーがないか確認してください。
  2. letsdebugがエラーを返さない場合は、cert-managerに関連する問題があるかどうかを確認してください:

    kubectl describe certificate,order,challenge --all-namespaces
    

    エラーが表示された場合は、証明書オブジェクトを削除して、新しい証明書を強制的に要求してみてください。

  3. 上記のいずれもうまくいかない場合は、cert-managerの再インストールを検討してください。