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
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