最新:获取项目更新 推特Mastodon

Google CloudDNS

本指南介绍如何设置一个 IssuerClusterIssuer,以使用 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-id
gcloud 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.com
kubectl 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 foundSecret 可能位于错误的命名空间中。如果您正在配置 ClusterIssuer,请将 Secret 移动到 Cluster Resource Namespace,默认情况下为 cert-manager。如果您正在配置 IssuerSecret 应该存储在与 Issuer 资源相同的命名空间中。

创建一个使用 CloudDNS 的 Issuer

接下来,创建一个具有 cloudDNS 提供程序的 Issuer(或 ClusterIssuer)。下面是一个示例 Issuer 清单,其中包含注释。

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: example-issuer
spec:
acme:
...
solvers:
- dns01:
cloudDNS:
# The ID of the GCP project
project: $PROJECT_ID
# This is the secret used to access the service account
serviceAccountSecretRef:
name: clouddns-dns01-solver-svc-acct
key: key.json

有关 IssuersClusterIssuers 的更多信息,请参见 配置

一旦 Issuer(或 ClusterIssuer)成功创建,就可以添加一个 Certificate 来验证一切是否正常。

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-com
namespace: default
spec:
secretName: example-com-tls
issuerRef:
# The issuer created previously
name: example-issuer
dnsNames:
- 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 标志。

需要修改 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 是服务帐户的名称。

部署 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/v1
kind: Issuer
metadata:
name: example-issuer
spec:
acme:
...
solvers:
- dns01:
cloudDNS:
# The ID of the GCP project
project: $PROJECT_ID

有关 IssuersClusterIssuers 的更多信息,请参见 配置

一旦 Issuer(或 ClusterIssuer)成功创建,就可以添加一个 Certificate 来验证一切是否正常。

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-com
namespace: default
spec:
secretName: example-com-tls
issuerRef:
# The issuer created previously
name: example-issuer
dnsNames:
- example.com
- www.example.com

有关 Certificates 的更多详细信息,请参见 使用