管理憑證

選擇文件版本:

自訂憑證核發機構可讓您管理 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-cert

local-webhook-server-cert
Operator 命名空間 1440h0m0s (60 天)
每個執行個體的控制層代理憑證 由個別執行個體資料庫代理程式、Node Manager 和備份 daemon 用於控制層連線。 dbs-al-cert-dbd-INSTANCE_ID-DB_CLUSTER_NAME

dbs-al-cert-al-INSTANCE_ID-DB_CLUSTER_NAME-nm

dbs-al-cert-backup-daemon-BACKUP_REPO_NAME
資料庫叢集命名空間 1440h0m0s (60 天)
備份憑證 備份服務會使用這個角色,建立備份和還原連線。 dbs-al-cert-backup-client

dbs-al-cert-backup-client-DATA_PLANE_ISSUER_NAME

dbs-al-cert-backup-server-INSTANCE_ID-DB_CLUSTER_NAME

dbs-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-operator

dbs-al-ca-DB_CLUSTER_NAME

dbs-al-ca-dbd-INSTANCE_ID-DB_CLUSTER_NAME

dbs-al-ca-backup-server

dbs-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 筆記錄中的 get
    • Pod資源有 get和 list
    • dbs-al-cert-l2-operator Secret 的 get 和 delete (以及 create 和 patch,用於還原備份的 Secret)
    • local-controller-manager 部署作業的 get 和 patch
    • CertificateRequest 資源的 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-operator Secret
    • 等待 cert-manager 核發新的憑證序號,並更新 dbs-al-cert-request-l2-operator Certificate 資源
    • 重新啟動 local-controller-manager Deployment
    • 檢查新 Pod 的記錄,並輸出新的到期日

如要檢查及輪替運算子用戶端憑證,請按照下列步驟操作:

  1. 將下列指令碼儲存至名為 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
    
  2. 在 check 模式中執行 rotate_cert.sh 指令碼,檢查目前的憑證到期日、建議的輪替日期,以及運算子記憶體內狀態:

    ./rotate_cert.sh check
    
  3. 選用:在輪替憑證前,請先備份 dbs-al-cert-l2-operator Secret:

    kubectl get secret dbs-al-cert-l2-operator -n alloydb-omni-system \
      -o yaml > dbs-al-cert-l2-operator-backup.yaml
    
  4. 如果 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),檢查運算子記錄。

  5. 選用:如果您在步驟 3 建立了備份檔案,請在確認輪替成功後刪除本機備份檔案,因為該檔案包含舊的私密金鑰:

    rm -f dbs-al-cert-l2-operator-backup.yaml
    

還原備份的憑證

如果 cert-manager 在輪替期間無法核發新憑證,而您需要復原至未過期的 dbs-al-cert-l2-operator-backup.yaml 檔案,請按照下列步驟操作:

  1. 刪除 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
    
  2. 從 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 -
    
  3. 重新啟動 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
    
  4. 在 check 模式下執行 rotate_cert.sh 指令碼,確認 Certificate Serial 值與備份的憑證序號相符,且指令碼回報 [OK]:

    ./rotate_cert.sh check
    

    還原的憑證會保留原始到期日,因此您仍須在 Recommended Rotate By當天或之前輪替憑證。

  5. 確認還原後,請刪除本機備份檔案:

    rm -f dbs-al-cert-l2-operator-backup.yaml