Certmanager 跨项目 DNS01 挑战失败

Certmanager Cross Project DNS01 Challenge Fail

Project Prod 和 Project Staging 已设置,每个 运行 一个 GKE 集群。如官方文档中所述,已安装证书管理器以自动执行证书颁发过程。

Project Prod 具有映射到 prod 和临时集群 istio 网关 IP 地址的 DNS。

在 Project Prod 集群的 DNS01 质询中,设法通过身份验证,并成功颁发证书。

但是 Project Staging 中的集群 运行 无法获得证书,因为没有足够的权限通过 Project Prod 中的 Cloud DNS 设置进行身份验证和验证。

在 Project Prod 中,有一个具有 dns/admin 角色的服务帐户,它是通过 GKE 秘密设置的,并在 clusterissuer 中访问,就像这样

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod-clusterissuer
  namespace: cert-manager
spec:
  acme:
    # The ACME server URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: name@name.com
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-prod-clusterissuer
    solvers:
    # ACME DNS-01 provider configurations
    - dns01:
        # Google Cloud DNS
        cloudDNS:
          # Secret from the google service account key
          serviceAccountSecretRef:
            name: cloud-dns-key
            key: key.json
          # The project in which to update the DNS zone
          project: iprocure-server-prod

在 Project Prod GKE 集群中成功颁发证书。

Project Staging GKE 集群,clusterissuer 的服务帐户具有 dns/admin 角色,就像在 Project Prod 中一样,但无法在 Project Prod DNS 中执行 dns01 challenge

kubectl describe challenge

时出现以下错误
Type     Reason        Age                     From          Message
----     ------        ----                    ----          -------
Warning  PresentError  2m56s (x19 over 7h14m)  cert-manager  Error presenting challenge: GoogleCloud API call failed: googleapi: Error 403: Forbidden, forbidden

应该对 Project Staging 服务帐户执行哪些操作才能使 dns01 challenge 在 Project Prod Clous DNS

中执行

我也遇到过这个问题。我必须将具有 DNS ADMIN 权限的 Prod 项目中的服务帐户复制到 Staging 项目,以便 Staging 中的 GKE 集群可以有足够的权限通过 Prod 项目中的 Cloud DNS 设置进行身份验证和验证

您必须在具有 DNS ADMIN 权限的 Prod 项目中创建一个 SA 并掌握该 SA 的电子邮件,然后转到项目 B 并通过将其添加为成员来使该 SA 电子邮件成为成员 DNS ADMIN许可。

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: {{ .Values.app.certificate.issuer.name }}
  namespace: {{ .Values.app.namespace }}
  labels:
    app.kubernetes.io/managed-by: "Helm"
spec:
  acme:
    email: {{ .Values.app.certificate.acme.email }}
    privateKeySecretRef:
      name: {{ .Values.app.certificate.issuer.name }}
    server: {{ .Values.app.certificate.acme.server }}
    solvers:
      - dns01:
          cloudDNS:
            project: {{ .Values.app.project_id }} ## Make sure this is the project of where DNS is e.g Prod Project
            serviceAccountSecretRef:
              name: {{ .Values.secrets.name }}
              # Secret from the google service account key
              key: key.json