GitLab 차트의 TLS 구성

Tier: Free, Premium, Ultimate Offering: Self-managed

이 차트는 NGINX Ingress Controller를 사용하여 TLS 종료를 수행할 수 있습니다. 배포를 위한 TLS 인증서를 획득하는 방법을 선택할 수 있습니다. 전역 인그레스 설정에서 자세한 내용을 확인할 수 있습니다.

옵션 1: cert-manager 및 Let’s Encrypt

Let’s Encrypt는 무료이자 자동화된 오픈 인증 기관입니다. 인증서는 다양한 도구를 사용하여 자동으로 요청될 수 있습니다. 이 차트는 인기 있는 선택인 cert-manager와 통합할 수 있도록 준비되어 있습니다.

이미 cert-manager를 사용 중인 경우, global.ingress.annotations를 사용하여 cert-manager 배포에 대한 적절한 주석을 구성할 수 있습니다.

클러스터에 cert-manager가 설치되어 있지 않은 경우, 이 차트의 종속성으로 설치하고 구성할 수 있습니다.

내부 cert-manager 및 발급자

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

cert-manager 설치는 certmanager.install 설정에 의해 제어되며, 차트에서의 사용은 global.ingress.configureCertmanager 설정에 의해 제어됩니다. 이 두 설정은 기본적으로 true이므로 기본적으로 발급자 이메일만 제공하면 됩니다.

외부 cert-manager 및 내부 발급자

외부 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-manager 및 발급자 (외부)

외부 cert-managerIssuer 리소스를 사용하려면 여러 항목을 제공해야 하며, 이를 통해 Self-Signed 인증서가 활성화되지 않도록 해야 합니다.

  1. 외부 cert-manager를 활성화하는 주석(자세한 내용은 문서를 참조)
  2. 각 서비스에 대한 TLS 비밀 이름 (이것은 Self-Signed 동작 비활성화를 비활성화합니다)
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을 사용하여 와일드카드 인증서를 생성하는 경우, 인증서를 다운로드할 수 없기 때문에 비밀을 통해 지정할 수 없습니다.
대신, 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

노트:
GitLab 인스턴스가 다른 서비스와 통신하도록 구성하는 경우, 해당 서비스를 GitLab에 Helm 차트를 통해 인증서 체인을 제공해야 할 수 있습니다.

옵션 4: 자동 생성된 자체 서명된 와일드카드 인증서 사용

이 차트는 자동 생성된 자체 서명된 와일드카드 인증서를 제공할 수 있는 기능도 제공합니다.
이는 Let’s Encrypt가 옵션이 아닌 환경에서 유용하지만, SSL을 통한 보안이 여전히 필요합니다.
이 기능은 shared-secrets 작업에 의해 제공됩니다.

노트:
gitlab-runner 차트는 자체 서명된 인증서와 함께 제대로 작동하지 않습니다.
아래와 같이 비활성화하는 것이 좋습니다.

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

shared-secrets 작업은 CA 인증서, 와일드카드 인증서 및 모든 외부에서 접근 가능한 서비스에 사용할 인증서 체인을 생성합니다.
이들을 포함하는 비밀은 RELEASE-wildcard-tls, RELEASE-wildcard-tls-ca, 및 RELEASE-wildcard-tls-chain이 됩니다.
RELEASE-wildcard-tls-ca에는 배포된 GitLab 인스턴스에 접근할 사용자 및 시스템에 배포할 수 있는 공개 CA 인증서가 포함되어 있습니다.
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에 의해 자동으로 생성될 수 없습니다.
따라서 기본적으로 GitLab Pages에 대해 cert-manager가 비활성화되어 있습니다 (gitlab-pages.ingress.configureCertmanager를 통해),
따라서 와일드카드 인증서를 포함하는 K8s 비밀을 제공해야 합니다.
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 리소스 제거 후 cert-manager를 재설치하는 것을 고려하세요. 내부 cert-manager를 사용 중이라면, 이름에 certmanager가 포함된 배포를 삭제하고 Helm Chart를 다시 설치하세요. 예를 들어, gitlab이라는 이름의 릴리스를 가정할 경우:

    kubectl -n <namespace> delete deployment gitlab-certmanager gitlab-certmanager-cainjector gitlab-certmanager-webhook
    helm upgrade --install -n <namespace> gitlab gitlab/gitlab