自訂憑證核發機構可讓您管理 Kubernetes AlloyDB Omni 資料庫叢集的傳輸層安全標準 (TLS) 憑證。
根據預設,AlloyDB Omni Kubernetes 運算子會使用 cert-manager,為每個資料庫叢集佈建一組 TLS 憑證。除了資料庫伺服器憑證外,運算子也會為控制層元件建立憑證,確保內部連線安全無虞。根據預設,每份憑證都會由操作者管理的核發者簽署。
如果您希望所有憑證 (包括控制層元件的憑證) 都鏈結回您信任的根憑證授權單位 (CA),可以將運算子設為使用您選擇的核發者。這樣一來,您就能將所有憑證 (包括用於控制層功能的憑證) 鏈結至自己的公用金鑰基礎架構 (PKI),而不必公開每個內部實體的實作詳細資料。
預設憑證效期
根據預設,AlloyDB Omni operator 會使用 cert-manager,為 operator、控制層和資料庫執行個體核發及自動更新 TLS 憑證。
下表列出 AlloyDB Omni operator 管理的憑證預設效期:
| 憑證類型 | 憑證說明 | Secret 名稱 | 命名空間 | 預設持續時間 |
|---|---|---|---|---|
| 運算子 mTLS 用戶端憑證 | local-controller-manager 部署作業會使用這個通訊埠,進行高可用性 (HA) 健康狀態檢查,以及建立運算子與控制層代理程式之間的連線。 |
dbs-al-cert-l2-operator |
Operator 命名空間 | 1440h0m0s (60 天) |
| 運算子 Webhook 伺服器憑證 | 由運算子許可 Webhook 伺服器使用,用於驗證及變更自訂資源。 | fleet-webhook-server-certlocal-webhook-server-cert |
Operator 命名空間 | 1440h0m0s (60 天) |
| 每個執行個體的控制層代理憑證 | 由個別執行個體資料庫代理程式、Node Manager 和備份 daemon 用於控制層連線。 | dbs-al-cert-dbd-INSTANCE_ID-DB_CLUSTER_NAMEdbs-al-cert-al-INSTANCE_ID-DB_CLUSTER_NAME-nmdbs-al-cert-backup-daemon-BACKUP_REPO_NAME |
資料庫叢集命名空間 | 1440h0m0s (60 天) |
| 備份憑證 | 備份服務會使用這個角色,建立備份和還原連線。 | dbs-al-cert-backup-clientdbs-al-cert-backup-client-DATA_PLANE_ISSUER_NAMEdbs-al-cert-backup-server-INSTANCE_ID-DB_CLUSTER_NAMEdbs-al-cert-standby-backup-server-INSTANCE_ID-DB_CLUSTER_NAME |
資料庫叢集命名空間 | 1440h0m0s (60 天) |
| 資料庫伺服器憑證 | 保護資料層用戶端與資料庫執行個體的連線。 | dbs-al-cert-DB_CLUSTER_NAME |
資料庫叢集命名空間 | 87600h0m0s (10 年) |
| PgBouncer 驗證查詢憑證 | PgBouncer 部署作業使用的資料庫用戶端憑證,用於連線至資料庫及執行連線集區。只有在您建立 PgBouncer 資源時才會建立。 |
dbs-al-pgb-cert-PGBOUNCER_NAME |
資料庫叢集命名空間 | 87600h0m0s (10 年) |
| 操作員管理的自行簽署 CA 憑證 | 運算子預設自行簽署核發者使用的根 CA 憑證,用於簽署運算子、控制層代理程式、備份和資料庫伺服器憑證。 | dbs-al-ca-l2-operatordbs-al-ca-DB_CLUSTER_NAMEdbs-al-ca-dbd-INSTANCE_ID-DB_CLUSTER_NAMEdbs-al-ca-backup-serverdbs-al-ca-backup-daemon-BACKUP_REPO_NAME |
運算子命名空間和資料庫叢集命名空間 | 87600h0m0s (10 年) |
在這個表格中,Secret 名稱使用下列預留位置:
INSTANCE_ID:為資料庫執行個體產生的 4 個字元 ID。DB_CLUSTER_NAME:DBCluster資源的名稱。DATA_PLANE_ISSUER_NAME:在spec.primarySpec.tls.dataPlaneCertIssuer.name中設定的自訂 cert-manager 核發者名稱 (如有指定)。BACKUP_REPO_NAME:BackupRepository資源的名稱 (如有設定)。PGBOUNCER_NAME:PgBouncer資源的名稱。
設定自訂核發者
您可以為資料庫叢集、AlloyDB Omni operator 和 PgBouncer 設定自訂憑證核發機構。
如要設定憑證核發者,您必須先建立 ClusterIssuer 或 Issuer 類型的 cert-manager 核發者,並與要簽署憑證的 CA 建立關聯。AlloyDB Omni operator 建立憑證時,會參照這個核發者。
資料庫叢集憑證
有兩個資料庫叢集規格欄位可用於設定憑證核發者:
spec.primarySpec.tls.dataPlaneCertIssuer:參照提供資料層憑證的 cert-manager 核發者。資料庫用戶端可信任核發者 CA,在 TLS 連線期間驗證資料庫。spec.primarySpec.tls.controlPlaneAgentsCertIssuer:參照提供控制層憑證的 cert-manager 核發者。這些憑證用於內部連線。
spec:
primarySpec:
tls:
dataPlaneCertIssuer:
name: DATA_PLANE_ISSUER_NAME
kind: DATA_PLANE_ISSUER_KIND
controlPlaneAgentsCertIssuer:
name: CONTROL_PLANE_ISSUER_NAME
kind: CONTROL_PLANE_ISSUER_KIND
更改下列內容:
DATA_PLANE_ISSUER_NAME:佈建資料層憑證 (例如資料庫伺服器憑證) 的 cert-manager 核發者名稱。DATA_PLANE_ISSUER_KIND:cert-manager 核發者的 API 種類,必須是Issuer或ClusterIssuer。預設值為Issuer。CONTROL_PLANE_ISSUER_NAME:cert-manager 核發者的名稱,負責為內部元件佈建控制層憑證。CONTROL_PLANE_ISSUER_KIND:cert-manager 核發者的 API 種類,必須是Issuer或ClusterIssuer。預設值為Issuer。
運作資源憑證
設定 operator 憑證的 cert-manager 核發者時,步驟會因安裝 AlloyDB Omni operator 的方法而異。
使用 Helm 進行設定
如果是首次安裝 AlloyDB Omni operator,請使用 helm install 並設定適當的值。這項操作假設您已按照操作說明使用 Helm 部署運算子。
helm install alloydbomni-operator alloydbomni-operator-OPERATOR_VERSION.tgz \
--create-namespace \
--namespace alloydb-omni-system \
--set operatorCertIssuer.certManagerIssuerName="OPERATOR_CERT_ISSUER_NAME" \
--set operatorCertIssuer.certManagerIssuerKind="OPERATOR_CERT_ISSUER_KIND" \
--atomic \
--timeout 5m
如果您已安裝運算子,且需要設定憑證核發者,請使用 helm upgrade 設定適當的值:
helm upgrade alloydbomni-operator alloydbomni-operator-OPERATOR_VERSION.tgz \
--create-namespace \
--namespace alloydb-omni-system \
--set operatorCertIssuer.certManagerIssuerName="OPERATOR_CERT_ISSUER_NAME" \
--set operatorCertIssuer.certManagerIssuerKind="OPERATOR_CERT_ISSUER_KIND" \
--atomic \
--timeout 5m
更改下列內容:
OPERATOR_VERSION:要安裝的 AlloyDB Omni operator 版本。OPERATOR_CERT_ISSUER_NAME:cert-manager 核發者的名稱,用於佈建運算子憑證,該憑證用於內部連線。OPERATOR_CERT_ISSUER_KIND:cert-manager 核發者的 API 種類,必須是Issuer或ClusterIssuer。預設值為Issuer。
使用 Operator Lifecycle Manager 進行設定
如果您使用 Operator Lifecycle Manager (OLM) 安裝 AlloyDB Omni operator,可以修改 Subscription 資源 spec.config.env 欄位,設定 operator Deployment 的 CERT_MANAGER_ISSUER_NAME 和 CERT_MANAGER_ISSUER_KIND 環境變數。
spec:
config:
env:
- name: CERT_MANAGER_ISSUER_NAME
value: OPERATOR_CERT_ISSUER_NAME
- name: CERT_MANAGER_ISSUER_KIND
value: OPERATOR_CERT_ISSUER_KIND
更改下列內容:
OPERATOR_CERT_ISSUER_NAME:cert-manager 核發者的名稱,用於佈建運算子憑證,該憑證用於內部連線。OPERATOR_CERT_ISSUER_KIND:cert-manager 核發者的 API 種類,必須是Issuer或ClusterIssuer。預設值為Issuer。
PgBouncer 憑證
為支援自訂簽發者,PgBouncer 控制器會檢查 DBCluster
spec.primarySpec.tls.dataPlaneCertIssuer 欄位,並使用該欄位佈建 PgBouncer 憑證。PgBouncer 控制器也會使用 spec.primarySpec.tls.dataPlaneCertRequest 中設定的屬性,佈建 PgBouncer 憑證。這有助於確保 PgBouncer 使用的憑證,與資料庫來自同一個 CA,且具有相同屬性。
設定自訂憑證屬性
您可以自訂運算子產生的 TLS 憑證屬性,例如憑證效期、續約時間、主體別名 (SAN)、通用名稱和私密金鑰設定。
您可以在 DBCluster 資訊清單中設定自訂憑證屬性:
spec.primarySpec.tls.dataPlaneCertRequest:指定資料層憑證的屬性,包括 pgBackRest 伺服器、PgBouncer 驗證查詢和資料庫伺服器憑證。spec.primarySpec.tls.controlPlaneAgentsCertRequest:指定佈建控制層憑證的屬性。這些憑證用於內部連線。
設定憑證要求
請以下列格式指定要求屬性:
spec:
primarySpec:
tls:
dataPlaneCertRequest:
commonName: DATABASE_COMMON_NAME
dnsNames:
- DATABASE_DNS_NAME_1
- DATABASE_DNS_NAME_2
duration: DATA_PLANE_DURATION
renewBefore: DATA_PLANE_RENEW_BEFORE
privateKey:
algorithm: DATA_PLANE_ALGORITHM
size: DATA_PLANE_KEY_SIZE
rotationPolicy: DATA_PLANE_ROTATION_POLICY
controlPlaneAgentsCertRequest:
duration: CONTROL_PLANE_DURATION
renewBefore: CONTROL_PLANE_RENEW_BEFORE
privateKey:
algorithm: CONTROL_PLANE_ALGORITHM
size: CONTROL_PLANE_KEY_SIZE
rotationPolicy: CONTROL_PLANE_ROTATION_POLICY
更改下列內容:
DATABASE_COMMON_NAME:(選用,僅限資料層) 資料庫憑證的 一般名稱。DATABASE_DNS_NAME_1、DATABASE_DNS_NAME_2:(選用,僅限資料層) 資料庫憑證的主體別名 (SAN) 清單。DATA_PLANE_DURATION和CONTROL_PLANE_DURATION:要求的憑證有效期限,以字串表示,例如720h0m0s代表自訂 30 天。在每個憑證要求區塊中,您必須同時指定duration和renewBefore(renewBefore小於duration),或省略這兩個欄位。如果省略這兩個欄位,控制層和備份憑證的預設效期為1440h0m0s(60 天),資料庫伺服器和 PgBouncer 驗證查詢憑證的預設效期則為87600h0m0s(10 年)。DATA_PLANE_RENEW_BEFORE和CONTROL_PLANE_RENEW_BEFORE:cert-manager 必須在到期前多久開始嘗試更新,例如120h0m0s表示到期前五天。在每個憑證要求區塊中,您必須同時指定duration和renewBefore(renewBefore小於duration),或省略這兩個欄位。如果省略這兩個欄位,控制層和備份憑證的預設續約時間範圍為120h0m0s(5 天),資料庫伺服器和 PgBouncer 驗證查詢憑證則為1440h0m0s(60 天)。DATA_PLANE_ALGORITHM和CONTROL_PLANE_ALGORITHM:私密金鑰演算法。有效值為RSA、ECDSA或Ed25519。DATA_PLANE_KEY_SIZE和CONTROL_PLANE_KEY_SIZE:私密金鑰大小 (以位元為單位)。如果演算法為RSA,有效值為4096或8192(預設值為4096)。如果演算法為ECDSA,有效值為384或521(預設值為384)。如果演算法為Ed25519,則會忽略大小。DATA_PLANE_ROTATION_POLICY和CONTROL_PLANE_ROTATION_POLICY:控制私密金鑰重新產生的政策。有效值為Always或Never。
操作員和備份用戶端憑證
如要自訂運算子和備份用戶端的憑證屬性 (這些屬性由命名空間中的所有執行個體共用,不受資料庫叢集規格管理),請修改 Certificate 自訂資源。運算子會保留這些手動修改內容。
清除憑證 Secret
刪除 DBCluster 資源時,AlloyDB Omni operator 會刪除相關聯的 Certificate 資源,但 cert-manager 預設不會清除憑證 Secret 資源。如要設定 cert-manager 控制器,在刪除憑證時清除 Secret,請參閱 cert-manager 說明文件中的「Cleaning up secrets when certificates are deleted」(在刪除憑證時清除 Secret)。
如果您已刪除 DBCluster 資源,但未設定自動清理功能,請手動刪除懸置的憑證密鑰:
kubectl delete secret CERTIFICATE_SECRET_NAME -n NAMESPACE
更改下列內容:
CERTIFICATE_SECRET_NAME:要刪除的憑證 Secret 名稱。NAMESPACE:資料庫叢集的命名空間。
驗證
如要確認運算子 Deployment 運作正常,且環境變數 CERT_MANAGER_ISSUER_NAME 和 CERT_MANAGER_ISSUER_KIND 已設定,請執行下列指令:
kubectl get deployments local-controller-manager -n alloydb-omni-system -o yaml
如要確認是否使用正確的核發者,請按照下列步驟檢查 Certificate 物件:
kubectl get certificate -n NAMESPACE
將 NAMESPACE 替換為資料庫叢集的命名空間,或將 alloydb-omni-system 替換為運算子憑證。
檢查每個憑證輸出內容中的 issuerRef 欄位,確認是否與自訂核發者相符。
在 1.8.2 之前的運算子版本中,緩解運算子用戶端憑證到期問題
在 1.8.2 之前的 AlloyDB Omni operator 版本中,local-controller-manager Deployment 會將 60 天的 dbs-al-cert-l2-operator mTLS 用戶端憑證快取至記憶體,用於與控制層代理的高可用性健康狀態檢查連線。雖然 cert-manager 會在到期前五天自動更新 dbs-al-cert-l2-operator Secret,但 local-controller-manager Deployment 要等到運算子 Pod 重新啟動後,才會重新載入更新後的憑證。快取的憑證在第 60 天到期時,後續的健康狀態檢查重新連線會失敗,並顯示 tls: expired certificate 錯誤,可能觸發非預期的高可用性容錯移轉。
如要永久解決這個問題,請將 AlloyDB Omni operator 升級至 1.8.2 以上版本。
如果無法立即升級至 1.8.2 以上版本的運算子,請在憑證到期前至少 10 天輪替 dbs-al-cert-l2-operator Secret,並重新啟動 local-controller-manager Deployment。這項程序不會重新啟動資料庫 Pod,也不會中斷資料庫流量。
事前準備
執行 rotate_cert.sh 指令碼前,請確認環境符合下列需求:
- 在
PATH中安裝bash、kubectl、openssl和base64。 - 設定 Kubernetes 叢集的存取權,並將有效的
kubectl內容設為目標叢集。如要確認有效情境,請執行kubectl config current-context。針對執行 1.8.2 以下運算子版本的每個叢集,重複執行這項程序。 - 確認您的帳戶在運算子命名空間 (預設為
alloydb-omni-system) 中具備 Kubernetes 角色式存取控管 (RBAC) 權限:Certificate項資源和Pod筆記錄中的getPod資源有get和listdbs-al-cert-l2-operatorSecret 的get和delete(以及create和patch,用於還原備份的 Secret)local-controller-manager部署作業的get和patchCertificateRequest資源的delete(用於還原備份的 Secret)
輪替運算子用戶端憑證
rotate_cert.sh 指令碼支援兩種模式和一個選用的命名空間引數,預設為 alloydb-omni-system:
./rotate_cert.sh check:執行唯讀檢查,並列印下列資訊:- 目前的憑證序號和有效日期
- 建議的輪替期限,設為到期日前 10 天
local-controller-manager容器啟動時間- 記憶體內憑證狀態:
[OK]或[WARNING] kubectl備份指令
./rotate_cert.sh rotate:執行下列動作:- 刪除
dbs-al-cert-l2-operatorSecret - 等待 cert-manager 核發新的憑證序號,並更新
dbs-al-cert-request-l2-operatorCertificate資源 - 重新啟動
local-controller-managerDeployment - 檢查新 Pod 的記錄,並輸出新的到期日
- 刪除
如要檢查及輪替運算子用戶端憑證,請按照下列步驟操作:
將下列指令碼儲存至名為
rotate_cert.sh的檔案,然後將檔案設為可執行:cat << 'EOF' > rotate_cert.sh #!/usr/bin/env bash set -euo pipefail MODE="${1:-}" NS="${2:-alloydb-omni-system}" SECRET="dbs-al-cert-l2-operator" CERT="dbs-al-cert-request-l2-operator" DEPLOY="local-controller-manager" get_cert_info() { kubectl get secret "$SECRET" -n "$NS" -o jsonpath='{.data.tls\.crt}' 2>/dev/null \ | base64 -d 2>/dev/null | openssl x509 -noout -serial -enddate 2>/dev/null || true } calc_rotate_by() { date -u -d "$1 - 10 days" +"%Y-%m-%d" 2>/dev/null \ || date -u -j -v-10d -f "%Y-%m-%dT%H:%M:%SZ" "$1" +"%Y-%m-%d" 2>/dev/null || echo "unknown" } get_container_name() { local names names="$(kubectl get pods -n "$NS" -l local-control-plane=controller-manager \ --field-selector=status.phase=Running --sort-by=.metadata.creationTimestamp \ -o jsonpath='{.items[-1].spec.containers[*].name}' 2>/dev/null || true)" if [[ " $names " == *" local-manager "* ]]; then echo "local-manager" else echo "manager" fi } case "$MODE" in check) INFO="$(get_cert_info)" SERIAL="$(echo "$INFO" | sed -n 's/^serial=//p')" ENDDATE="$(echo "$INFO" | sed -n 's/^notAfter=//p')" NOT_BEFORE="$(kubectl get certificate "$CERT" -n "$NS" -o jsonpath='{.status.notBefore}')" NOT_AFTER="$(kubectl get certificate "$CERT" -n "$NS" -o jsonpath='{.status.notAfter}')" CONTAINER="$(get_container_name)" STARTED_AT="$(kubectl get pods -n "$NS" -l local-control-plane=controller-manager \ --field-selector=status.phase=Running --sort-by=.metadata.creationTimestamp \ -o jsonpath="{.items[-1].status.containerStatuses[?(@.name==\"$CONTAINER\")].state.running.startedAt}")" echo "Certificate Serial : $SERIAL" echo "Certificate Start Date : $NOT_BEFORE" echo "Certificate End Date : $ENDDATE ($NOT_AFTER)" echo "Recommended Rotate By : $(calc_rotate_by "$NOT_AFTER") (10 days before expiry)" echo "Operator Started At : $STARTED_AT" if [[ "$STARTED_AT" < "$NOT_BEFORE" ]]; then echo "[WARNING] Operator started ($STARTED_AT) BEFORE current cert was issued ($NOT_BEFORE). It is still caching the old cert in memory! Run './rotate_cert.sh rotate $NS' now." else echo "[OK] Operator is running with the current certificate in memory." fi echo "Optional Backup Command : kubectl get secret $SECRET -n $NS -o yaml > $SECRET-backup.yaml" ;; rotate) OLD_SERIAL="$(get_cert_info | sed -n 's/^serial=//p')" OLD_REV="$(kubectl get certificate "$CERT" -n "$NS" -o jsonpath='{.status.revision}' 2>/dev/null || true)" echo "Current Certificate Serial: ${OLD_SERIAL:-none}" kubectl delete secret "$SECRET" -n "$NS" --ignore-not-found NEW_SERIAL="" NOT_AFTER="" for _ in {1..30}; do sleep 2 NEW_SERIAL="$(get_cert_info | sed -n 's/^serial=//p')" NEW_REV="$(kubectl get certificate "$CERT" -n "$NS" -o jsonpath='{.status.revision}' 2>/dev/null || true)" READY_COND="$(kubectl get certificate "$CERT" -n "$NS" -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}' 2>/dev/null || true)" NOT_AFTER="$(kubectl get certificate "$CERT" -n "$NS" -o jsonpath='{.status.notAfter}' 2>/dev/null || true)" [[ -n "$NEW_SERIAL" && "$NEW_SERIAL" != "$OLD_SERIAL" && "$NEW_REV" != "$OLD_REV" && "$READY_COND" == "True" && -n "$NOT_AFTER" ]] && break done [[ -n "$NEW_SERIAL" && "$NEW_SERIAL" != "$OLD_SERIAL" && "$READY_COND" == "True" ]] || { echo "[ERROR] Timed out waiting for new cert."; exit 1; } kubectl rollout restart "deployment/$DEPLOY" -n "$NS" kubectl rollout status "deployment/$DEPLOY" -n "$NS" --timeout=180s NEW_POD="$(kubectl get pods -n "$NS" -l local-control-plane=controller-manager \ --field-selector=status.phase=Running --sort-by=.metadata.creationTimestamp -o jsonpath='{.items[-1].metadata.name}')" CONTAINER="$(get_container_name)" READY=false for _ in {1..40}; do LOGS="$(kubectl logs "pod/$NEW_POD" -n "$NS" -c "$CONTAINER" 2>/dev/null || true)" grep -q "tls: expired certificate" <<<"$LOGS" && { echo "[ERROR] Found 'tls: expired certificate' in operator logs!"; exit 1; } grep -q "L2 controller cert generation completed successfully" <<<"$LOGS" && { READY=true; break; } sleep 3 done [[ "$READY" == "true" ]] || { echo "[ERROR] Timed out waiting for L2 controller cert generation log."; exit 1; } echo "[SUCCESS] New Serial: $NEW_SERIAL | End Date: $NOT_AFTER | Next Rotate By: $(calc_rotate_by "$NOT_AFTER") (10 days before expiry)" ;; *) echo "Usage: $0 <check|rotate> [namespace]" echo " check : Validate current certificate status and operator start time." echo " rotate : Trigger immediate certificate rotation and restart the operator." echo " [namespace] : Namespace of the operator (defaults to 'alloydb-omni-system')." exit 1 ;; esac EOF chmod +x rotate_cert.sh在
check模式中執行rotate_cert.sh指令碼,檢查目前的憑證到期日、建議的輪替日期,以及運算子記憶體內狀態:./rotate_cert.sh check選用:在輪替憑證前,請先備份
dbs-al-cert-l2-operatorSecret:kubectl get secret dbs-al-cert-l2-operator -n alloydb-omni-system \ -o yaml > dbs-al-cert-l2-operator-backup.yaml如果
check輸出顯示[WARNING],或目前日期在Recommended Rotate By日期當天或之前,請在rotate模式下執行rotate_cert.sh指令碼:./rotate_cert.sh rotate確認輸出內容結尾為
[SUCCESS],並顯示新的憑證序號、到期日和下一個建議輪替日期。如果輸出內容顯示[ERROR],或指令碼以非零狀態結束,請重新執行./rotate_cert.sh check,並執行kubectl logs deployment/local-controller-manager -n alloydb-omni-system -c local-manager(或在 1.6.0 之前的運算子版本中執行-c manager),檢查運算子記錄。選用:如果您在步驟 3 建立了備份檔案,請在確認輪替成功後刪除本機備份檔案,因為該檔案包含舊的私密金鑰:
rm -f dbs-al-cert-l2-operator-backup.yaml
還原備份的憑證
如果 cert-manager 在輪替期間無法核發新憑證,而您需要復原至未過期的 dbs-al-cert-l2-operator-backup.yaml 檔案,請按照下列步驟操作:
刪除
dbs-al-cert-request-l2-operator憑證待處理或失敗的CertificateRequest資源,這樣 cert-manager 就不會以SecretMismatch原因拒絕還原的私密金鑰,並覆寫還原的 Secret:REV="$(kubectl get certificate dbs-al-cert-request-l2-operator -n alloydb-omni-system -o jsonpath='{.status.revision}')" kubectl delete certificaterequest \ "dbs-al-cert-request-l2-operator-$((REV + 1))" \ -n alloydb-omni-system --ignore-not-found從
dbs-al-cert-l2-operator-backup.yaml檔案中移除頂層metadata.resourceVersion和metadata.uid欄位,然後使用伺服器端套用功能套用 Secret:grep -vE '^ (resourceVersion|uid):' dbs-al-cert-l2-operator-backup.yaml \ | kubectl apply --server-side --force-conflicts -f -重新啟動
local-controller-manager部署作業,將還原的憑證載入記憶體:kubectl rollout restart deployment/local-controller-manager -n alloydb-omni-system kubectl rollout status deployment/local-controller-manager -n alloydb-omni-system --timeout=180s在
check模式下執行rotate_cert.sh指令碼,確認Certificate Serial值與備份的憑證序號相符,且指令碼回報[OK]:./rotate_cert.sh check還原的憑證會保留原始到期日,因此您仍須在
Recommended Rotate By當天或之前輪替憑證。確認還原後,請刪除本機備份檔案:
rm -f dbs-al-cert-l2-operator-backup.yaml