Google CloudDNS
本指南介绍如何设置一个 Issuer
或 ClusterIssuer
,以使用 Google CloudDNS 来解决 DNS01 ACME 挑战。建议您先阅读 DNS01 挑战提供商 页面,以更全面地了解 cert-manager 如何处理 DNS01 挑战。
本指南假定您的集群托管在 Google Cloud Platform (GCP) 上,并且您已经使用 CloudDNS 设置了一个域名。
您需要使用 **公共 DNS 区域**,以便 ACME 挑战检查器能够访问 cert-manager 将创建的 DNS 记录。
设置服务帐户
cert-manager 需要能够将记录添加到 CloudDNS 才能解决 DNS01 挑战。为了实现这一点,必须创建一个具有 dns.admin
角色的 GCP 服务帐户。
注意:在本指南中,将使用
gcloud
命令来设置服务帐户。在输入命令之前,请确保gcloud
使用了正确的项目和区域。这些步骤也可以使用 Cloud Console 完成。
PROJECT_ID=myproject-idgcloud iam service-accounts create dns01-solver --display-name "dns01-solver"
在上面的命令中,将 myproject-id
替换为您的项目的 ID。
gcloud projects add-iam-policy-binding $PROJECT_ID \--member serviceAccount:dns01-solver@$PROJECT_ID.iam.gserviceaccount.com \--role roles/dns.admin
**注意**:本示例角色中使用
dns.admin
角色是为了方便起见。如果您想要确保 cert-manager 在最小权限服务帐户下运行,则需要创建一个具有以下权限的自定义角色
dns.resourceRecordSets.*
dns.changes.*
dns.managedZones.list
如果您没有使用
dns.admin
角色,您还需要确保您的 GKE 集群使用的服务帐户(例如 Compute Engine 默认服务帐户)具有https://www.googleapis.com/auth/cloud-platform
访问范围分配给它。请参见 GKE 中的访问范围。
使用静态凭据
按照以下部分中的说明使用您创建的服务帐户的静态凭据部署 cert-manager。您应该定期轮换这些凭据。
创建服务帐户密钥
为了访问此服务帐户,cert-manager 使用存储在 Kubernetes Secret
中的密钥。首先,为服务帐户创建一个密钥并将其下载为 JSON 文件,然后根据此文件创建一个 Secret
。
请妥善保管密钥文件,不要与他人分享,因为该文件可能被用来访问您的云资源。一旦密钥文件用于生成 Secret
,就可以将其删除。
如果您之前没有创建服务帐户 dns01-solver
,则需要先创建它。
gcloud iam service-accounts create dns01-solver
将 $PROJECT_ID
的实例替换为您的项目的 ID。
gcloud iam service-accounts keys create key.json \--iam-account dns01-solver@$PROJECT_ID.iam.gserviceaccount.comkubectl create secret generic clouddns-dns01-solver-svc-acct \--from-file=key.json
注意:如果您已经添加了
Secret
但收到错误:...due to error processing: error getting clouddns service account: secret "XXX" not found
,Secret
可能位于错误的命名空间中。如果您正在配置ClusterIssuer
,请将Secret
移动到Cluster Resource Namespace
,默认情况下为cert-manager
。如果您正在配置Issuer
,Secret
应该存储在与Issuer
资源相同的命名空间中。
创建一个使用 CloudDNS 的 Issuer
接下来,创建一个具有 cloudDNS
提供程序的 Issuer
(或 ClusterIssuer
)。下面是一个示例 Issuer
清单,其中包含注释。
apiVersion: cert-manager.io/v1kind: Issuermetadata:name: example-issuerspec:acme:...solvers:- dns01:cloudDNS:# The ID of the GCP projectproject: $PROJECT_ID# This is the secret used to access the service accountserviceAccountSecretRef:name: clouddns-dns01-solver-svc-acctkey: key.json
有关 Issuers
和 ClusterIssuers
的更多信息,请参见 配置。
一旦 Issuer
(或 ClusterIssuer
)成功创建,就可以添加一个 Certificate
来验证一切是否正常。
apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: example-comnamespace: defaultspec:secretName: example-com-tlsissuerRef:# The issuer created previouslyname: example-issuerdnsNames:- example.com- www.example.com
有关 Certificates
的更多详细信息,请参见 使用。
GKE 工作负载身份
如果您将 cert-manager 部署到启用了工作负载身份的 Google Container Engine (GKE) 集群 中,您可以利用工作负载身份来避免创建和管理静态服务帐户凭据。有关工作负载身份功能的更多详细信息,请参见 工作负载身份操作指南,但简而言之,工作负载身份允许您将 Google 服务帐户 (GSA) 与 Kubernetes 服务帐户 (KSA) 关联。这种 GSA/KSA 关联是双向的,即您必须在 GCP 和 Kubernetes 中建立关联。配置完成后,工作负载身份允许在 KSA 下运行的 Kubernetes Pod 使用关联的 GSA 的权限访问 GCP API。工作负载身份操作指南还提供了有关如何在 GKE 集群中启用工作负载身份的详细说明。以下部分中的说明假设您将 cert-manager 部署到已启用工作负载身份的 GKE 集群中。
启用环境凭据使用
“环境凭据”是从环境、元数据服务或本地文件(未在 ClusterIssuer API 对象中明确配置)中获取的凭据。当启用此标志时,Cert-Manager 将访问 GKE 元数据服务器以获取凭据。默认情况下,它在 ClusterIssuer 资源中启用,但在 Issuer 资源中禁用。要为 Issuer 资源启用它,请设置 --issuer-ambient-credentials
标志。
在 GCP 中将 KSA 与 GSA 关联
需要修改 DNS 记录的 cert-manager 组件是作为 cert-manager 部署的一部分创建的 Pod。 部署 cert-manager 到 Kubernetes 的标准方法 在 cert-manager 命名空间中创建 cert-manager 部署,并且它的 Pod 规范指定它在 cert-manager 服务帐户下运行。要将您上面创建的 GSA 与 GKE 集群中 cert-manager 命名空间中的 cert-manager KSA 关联,请运行以下命令。
gcloud iam service-accounts add-iam-policy-binding \--role roles/iam.workloadIdentityUser \--member "serviceAccount:$PROJECT_ID.svc.id.goog[cert-manager/cert-manager]" \dns01-solver@$PROJECT_ID.iam.gserviceaccount.com
如果您的 cert-manager Pod 在不同的服务帐户下运行,请将 goog[cert-manager/cert-manager]
替换为 goog[NAMESPACE/SERVICE_ACCOUNT]
,其中 NAMESPACE
是服务帐户的命名空间,而 SERVICE_ACCOUNT
是服务帐户的名称。
在 Kubernetes 中将 KSA 与 GSA 关联
部署 cert-manager 后,将适当的工作负载身份注释添加到 cert-manager 服务帐户。
kubectl annotate serviceaccount --namespace=cert-manager cert-manager \"iam.gke.io/gcp-service-account=dns01-solver@$PROJECT_ID.iam.gserviceaccount.com"
同样,如果您的 cert-manager Pod 在不同的服务帐户下运行,请将 --namespace=cert-manager cert-manager
替换为 --namespace=NAMESPACE SERVICE_ACCOUNT
,其中 NAMESPACE
是服务帐户的命名空间,而 SERVICE_ACCOUNT
是服务帐户的名称。
如果您使用 cert-manager 的 helm 图表部署 cert-manager,您可以使用 serviceAccount.annotations
配置参数将上述工作负载身份注释添加到 cert-manager KSA。
创建使用 CloudDNS 的颁发者
接下来,创建一个带有 clouddns
提供程序的 颁发者
(或 集群颁发者
)。下面是一个带有注释的 颁发者
清单示例。请注意,颁发者不包含 serviceAccountSecretRef
属性。排除此属性指示 cert-manager 使用 GKE 工作负载身份提供的默认凭据。
apiVersion: cert-manager.io/v1kind: Issuermetadata:name: example-issuerspec:acme:...solvers:- dns01:cloudDNS:# The ID of the GCP projectproject: $PROJECT_ID
有关 Issuers
和 ClusterIssuers
的更多信息,请参见 配置。
一旦 Issuer
(或 ClusterIssuer
)成功创建,就可以添加一个 Certificate
来验证一切是否正常。
apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: example-comnamespace: defaultspec:secretName: example-com-tlsissuerRef:# The issuer created previouslyname: example-issuerdnsNames:- example.com- www.example.com
有关 Certificates
的更多详细信息,请参见 使用。