为极狐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-managercertmanager.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-managerIssuer 资源,您必须提供几项配置,以便不激活自签名证书。

  1. 用于激活外部 cert-manager 的 annotation(有关更多详细信息,请参阅 文档
  2. 每个服务的 TLS secret 名称(这会停用 自签名行为
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
note 如果您将 GitLab 实例配置为与其他服务通信,则可能还需要通过 Helm chart 向 GitLab 提供这些服务的证书链

选项 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-tlsRELEASE-wildcard-tls-caRELEASE-wildcard-tls-chainRELEASE-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 提供程序并且您面临与证书相关的错误,您有几个选项来调试它:

  1. 使用 letsdebug 检查您的域是否有任何可能的错误。
  2. 如果 letsdebug 没有返回错误,查看 cert-manager 是否有问题:

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

    如果您看到任何错误,请尝试删除证书对象以强制请求一个新的。

  3. 如果上述方法均无效,请考虑移除既有的 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