- 选项 1: cert-manager and Let’s Encrypt
- 选项 2: 使用自己的通配符证书
- 选项 3: 每个服务使用单独的证书
- 选项 4: 使用自动生成的自签名通配符证书
- GitLab Pages 的 TLS 要求
- 故障排查
为极狐GitLab chart 配置 TLS
此 chart 能够使用 NGINX Ingress Controller 进行 TLS 终止。您可以选择如何为您的部署获取 TLS 证书。可以在全局 Ingress 设置 中找到更多信息。
选项 1: cert-manager and Let’s Encrypt
Let’s Encrypt 是一个免费、自动化和开放的证书颁发机构。可以使用各种工具自动请求证书。此 chart 已准备好与流行的 cert-manager 集成。
如果您已经在使用cert-manager,您可以为您的 cert-manager 部署使用 global.ingress.annotations
来配置适当的 annotation。
如果您的集群中尚未安装 cert-manager,您可以将其安装并配置为此 chart 的依赖项。
内部 cert-manager and Issuer
helm repo update
helm dep update
helm install gitlab gitlab-jh/gitlab \
--set certmanager-issuer.email=you@example.com
安装 cert-manager
由 certmanager.install
设置控制,在 chart 中使用它由 global.ingress.configureCertmanager
设置控制。默认值都是 true
,因此默认情况下只需要提供 issuer 电子邮件。
外部 cert-manager 和内部 Issuer
可以使用外部 cert-manager
,但需要提供 issuer 作为此 chart 的一部分。
helm install gitlab gitlab-jh/gitlab \
--set certmanager.install=false \
--set certmanager-issuer.email=you@example.com \
--set global.ingress.annotations."kubernetes\.io/tls-acme"=true
外部 cert-manager and 外部 Issuer
要使用外部 cert-manager
和 Issuer
资源,您必须提供几项配置,以便不激活自签名证书。
helm install gitlab gitlab-jh/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-jh/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: 每个服务使用单独的证书
将您的完整链证书作为 secret 添加到集群中,然后将这些机密名称传递给每个 Ingress。
helm install gitlab gitlab-jh/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
选项 4: 使用自动生成的自签名通配符证书
这些 chart 还提供了自动生成的自签名通配符证书的功能。
这在无法选择 Let’s Encrypt 但仍需要通过 SSL 提供安全性的环境中很有用。此功能由 shared-secrets 作业提供。
Note:
gitlab-runner
chart 在使用自签名证书时无法正常运行。我们建议禁用它,如下所示。
helm install gitlab gitlab-jh/gitlab \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false \
--set gitlab-runner.install=false
shared-secrets
作业将生成一个 CA 证书、通配符证书和一个证书链,供所有外部访问服务使用。 包含这些的 secret 是 RELEASE-wildcard-tls
、RELEASE-wildcard-tls-ca
和 RELEASE-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 自动创建。因此,默认情况下 GitLab Pages 禁用了 cert-manager(通过gitlab-pages.ingress.configureCertmanager
),因此您必须提供自己的包含通配符证书的 k8s Secret。如果您有一个使用 global.ingress.annotations
配置的外部 cert-manager,您可能想要覆盖 gitlab-pages.ingress.annotations
中的 annotation。
默认情况下,这个 secret 的名称是 <RELEASE>-pages-tls
。可以使用 gitlab.gitlab-pages.ingress.tls.secretName
设置指定不同的名称:
helm install gitlab gitlab-jh/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-manger。如果您使用的是内部 cert-manger,使用
certmanger
的名称来删除 deployments,然后重新安装 Helm Chart。比如,假设有一个 release 的名称为gitlab-jh
:kubectl -n <namespace> delete deployment gitlab-certmanager gitlab-certmanager-cainjector gitlab-certmanager-webhook helm upgrade --install -n <namespace> gitlab-jh gitlab-jh/gitlab