新訊:在TwitterMastodon取得專案更新

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。您應定期輪換這些憑證。

建立服務帳戶 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.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 found,則 Secret 可能在錯誤的命名空間中。如果您正在設定 ClusterIssuer,請將 Secret 移動到 叢集資源命名空間,預設為 cert-manager。如果您正在設定 Issuer,則 Secret 應儲存在與 Issuer 資源相同的命名空間中。

建立使用 CloudDNS 的簽發者

接下來,建立一個具有 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 是服務帳戶的名稱。

如果您是使用其 Helm 圖表部署 cert-manager,您可以使用 serviceAccount.annotations 組態參數,將上述工作負載身分註解新增至 cert-manager KSA。

建立使用 CloudDNS 的簽發者

接下來,建立一個帶有 clouddns 提供者的 Issuer(或 ClusterIssuer)。具有註解的 Issuer 清單範例如下。請注意,簽發者不包含 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 的更多詳細資訊,請參閱使用方式