- 옵션 1: cert-manager 및 Let’s Encrypt
- 옵션 2: 사용자 정의 와일드카드 인증서 사용
- 옵션 3: 서비스별 개별 인증서 사용
- 옵션 4: 자동 생성된 자체 서명된 와일드카드 인증서 사용
- GitLab Pages를 위한 TLS 요구사항
- 문제 해결
GitLab 차트의 TLS 구성
이 차트는 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-manager
및 Issuer
리소스를 사용하려면 여러 항목을 제공해야 하며, 이를 통해 Self-Signed 인증서가 활성화되지 않도록 해야 합니다.
- 외부
cert-manager
를 활성화하는 주석(자세한 내용은 문서를 참조) - 각 서비스에 대한 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 공급자로 사용하고 있고 인증서 관련 오류에 직면하고 있다면, 다음과 같은 몇 가지 디버깅 옵션이 있습니다:
-
letsdebug를 사용하여 도메인에 대한 가능한 오류를 확인하세요.
-
letsdebug에서 오류가 발생하지 않으면 cert-manager와 관련된 문제가 있는지 확인하세요:
kubectl describe certificate,order,challenge --all-namespaces
오류가 발생하는 경우, 인증서 객체를 제거하여 새로운 인증서를 요청하도록 강제하세요.
-
위의 어떠한 방법도 효과가 없으면, 기존 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