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。您應定期輪換這些憑證。
建立服務帳戶 Secret
為了存取此服務帳戶,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
移動到叢集資源命名空間
,預設為cert-manager
。如果您正在設定Issuer
,則Secret
應儲存在與Issuer
資源相同的命名空間中。
建立使用 CloudDNS 的簽發者
接下來,建立一個具有 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
是服務帳戶的名稱。
將 KSA 連結到 Kubernetes 中的 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
是服務帳戶的名稱。
如果您是使用其 Helm 圖表部署 cert-manager,您可以使用 serviceAccount.annotations
組態參數,將上述工作負載身分註解新增至 cert-manager KSA。
建立使用 CloudDNS 的簽發者
接下來,建立一個帶有 clouddns
提供者的 Issuer
(或 ClusterIssuer
)。具有註解的 Issuer
清單範例如下。請注意,簽發者不包含 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
的更多詳細資訊,請參閱使用方式。