分享方式:


使用密碼存放區延伸模組來擷取密碼,以在已啟用 Azure Arc 的 Kubernetes 叢集中離線存取

Kubernetes 的 Azure Key Vault 密碼存放區延伸模組 (「密碼存放區」) 會自動將密碼從 Azure Key Vault 同步至已啟用 Azure Arc 的 Kubernetes 叢集供離線存取。 這表示您可以使用 Azure Key Vault 來儲存、維護及輪替您的密碼,即使在半中斷連線的狀態下執行 Kubernetes 叢集時也是如此。 同步的密碼會儲存在叢集密碼存放區中,讓它們以 Kubernetes 密碼的形式提供,以便以一般方式使用:掛接為資料磁碟區,或公開為 Pod 中的容器的環境變數。

同步的密碼是重要的商務資產,因此密碼存放區會透過隔離的命名空間和節點、角色型存取控制 (RBAC) 原則,以及密碼同步器的有限權限來保護它們。 如需額外的保護, 請加密 叢集上的 Kubernetes 秘密存放區。

提示

針對需要離線存取的案例,或如果您需要將密碼同步至 Kubernetes 密碼存放區,建議使用密碼存放區延伸模組。 如果您不需要這些功能,您可以在已啟用 Arc 的 Kubernetes 叢集中,使用 Azure Key Vault 密碼提供者延伸模組進行密碼管理。 不建議在叢集中並行執行線上 Azure Key Vault 密碼提供者延伸模組和離線密碼存放區延伸模組。

本文說明如何安裝密碼存放區,並將其設定為已啟用 Azure Arc 的 Kubernetes 延伸模組

重要

密碼存放區目前處於預覽。 請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。

必要條件

  • 連線到 Azure Arc 的叢集,執行 Kubernetes 1.27 版或更新版本,並在其中一個支援的區域 (美國東部、美國東部 2、美國西部、美國西部 2、美國西部 3、西歐、北歐)。 區域是由用來建立 Arc 叢集的資源群組區域定義。
  • 本指南中的範例會使用 K3s 叢集。
  • 確保您符合叢集延伸模組的一般必要條件,包括最新版的 k8s-extension Azure CLI 延伸模組。
  • 需要 cert-manager 才能支援 TLS 進行內追蹤記錄通訊。 本指南稍後的範例會引導您進行安裝。 如需 cert-manager 的詳細資訊,請參閱 cert-manager.io

開始之前,請先設定要用於設定 Azure 和叢集資源的環境變數。 如果您已經有受控識別、Azure Key Vault 或此處所列的其他資源,請更新環境變數中的名稱以反映這些資源。

az login
export RESOURCE_GROUP="oidc-issuer"
export LOCATION="westus2"
export AZURE_STORAGE_ACCOUNT="oidcissuer$(openssl rand -hex 4)"
export AZURE_STORAGE_CONTAINER="oidc-test"
export SUBSCRIPTION="$(az account show --query id --output tsv)"
export AZURE_TENANT_ID="$(az account show -s $SUBSCRIPTION --query tenantId --output tsv)"
export CURRENT_USER="$(az ad signed-in-user show --query userPrincipalName --output tsv)"
export KEYVAULT_NAME="azwi-kv-$(openssl rand -hex 4)"
export KEYVAULT_SECRET_NAME="my-secret"
export USER_ASSIGNED_IDENTITY_NAME="myIdentity"
az account set --subscription "${SUBSCRIPTION}"
export SERVICE_ACCOUNT_ISSUER="https://$AZURE_STORAGE_ACCOUNT.blob.core.windows.net/${AZURE_STORAGE_CONTAINER}"
export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity"
export KUBERNETES_NAMESPACE="default"
export SERVICE_ACCOUNT_NAME="workload-identity-sa"

設定身分識別以存取密碼

若要存取並同步指定的 Azure Key Vault 密碼,密碼存放區需要存取具有適當 Azure 權限的 Azure 受控識別,才能存取該密碼。 受控識別必須透過同盟連結至 Kubernetes 服務帳戶。 Kubernetes 服務帳戶可供您在 Kubernetes Pod 或其他工作負載中用來存取來自 Kubernetes 密碼存放區的密碼。 密碼存放區延伸模組會使用相關聯的同盟 Azure 受控識別,將密碼從 Azure Key Vault 提取到 Kubernetes 密碼存放區。 下列各節描述如何設定。

裝載叢集服務帳戶簽發者的相關 OIDC 公開資訊

使用同盟身分識別目前需要您設定雲端儲存體,以裝載關於叢集服務帳戶簽發者公開金鑰的 OIDC 格式資訊。 在本節中,您會使用 Azure Blob 儲存體設定安全的公用 Open ID Connect (OIDC) 簽發者 URL,然後將最小探索文件上傳至儲存體帳戶。 如需背景,請參閱自我管理叢集的 OIDC 設定

  1. 建立 Azure 儲存體帳戶。

    az group create --name "${RESOURCE_GROUP}" --location "${LOCATION}"
    az storage account create --resource-group "${RESOURCE_GROUP}" --name "${AZURE_STORAGE_ACCOUNT}" --allow-blob-public-access true
    az storage container create --name "${AZURE_STORAGE_CONTAINER}" --public-access blob
    

    注意

    如果您的 Azure 執行個體未啟用 "Microsoft.Storage" 服務,'az storage account create' 可能會失敗。 如果您遇到失敗,請在訂用帳戶中註冊 Microsoft.Storage 資源提供者

  2. 產生探索文件。 將它上傳至儲存體帳戶,然後驗證其可公開存取。

    cat <<EOF > openid-configuration.json
    {
      "issuer": "https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_STORAGE_CONTAINER}/",
      "jwks_uri": "https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_STORAGE_CONTAINER}/openid/v1/jwks",
      "response_types_supported": [
        "id_token"
      ],
      "subject_types_supported": [
        "public"
      ],
      "id_token_signing_alg_values_supported": [
        "RS256"
      ]
    }
    EOF
    
    az storage blob upload --container-name "${AZURE_STORAGE_CONTAINER}" --file openid-configuration.json --name .well-known/openid-configuration
    curl -s "https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_STORAGE_CONTAINER}/.well-known/openid-configuration"
    
  3. 取得叢集服務帳戶簽發者的公開金鑰 (從其私密金鑰)。 您將可能需要以超級使用者身分執行此命令。 下列範例適用於 k3s。 您的叢集可能會將服務帳戶簽發者私密金鑰儲存在不同的位置。

    sudo openssl rsa -in /var/lib/rancher/k3s/server/tls/service.key -pubout -out sa.pub
    
  4. 下載最新的 azwi 命令列工具,您可以使用此工具從公開金鑰建立 JWKS 文件,並將它解壓縮:

    tar -xzf <path to downloaded azwi tar.gz>
    
  5. 產生 JWKS 文件。 將它上傳至儲存體帳戶,然後驗證其可公開存取。

    ./azwi jwks --public-keys sa.pub --output-file jwks.json
    az storage blob upload --container-name "${AZURE_STORAGE_CONTAINER}" --file jwks.json --name openid/v1/jwks
    curl -s "https://${AZURE_STORAGE_ACCOUNT}.blob.core.windows.net/${AZURE_STORAGE_CONTAINER}/openid/v1/jwks"
    

使用託管 URL 設定叢集的服務帳戶權杖簽發者

您的叢集也必須設定為使用簽發者 URL (service-account-issuer) 欄位核發服務帳戶權杖,其會指向您在上一節中建立的儲存體帳戶。 如需同盟設定的詳細背景,請參閱 OIDC 簽發者的叢集設定

您可以選擇性地設定 OwnerReferencesPermissionEnforcement 許可控制器,將密碼存放區擁有的權限限制設定為在控制平面中執行的特殊權限資源。 此許可控制器會限制密碼存放區可以變更叢集中其他物件的程度。

Kubernetes 叢集必須執行 Kubernetes 1.27 版或更新版本。

  1. 使用簽發者 URL 欄位和權限強制執行來設定 kube-apiserver。 下列範例適用 k3s 叢集。 您的叢集可能使用不同的方法來變更 API 伺服器引數:--kube-apiserver-arg="--service-account-issuer=${SERVICE_ACCOUNT_ISSUER}" and --kube-apiserver-arg="--enable-admission-plugins=OwnerReferencesPermissionEnforcement"

    • 取得服務帳戶簽發者 URL。

      echo $SERVICE_ACCOUNT_ISSUER
      
    • 開啟 K3s 伺服器設定檔。

      sudo nano /etc/systemd/system/k3s.service
      
    • 編輯伺服器設定以,看使其類似下列範例,將 <SERVICE_ACCOUNT_ISSUER> 取代為來自 echo $SERVICE_ACCOUNT_ISSUER 的輸出。

      ExecStart=/usr/local/bin/k3s \
        server --write-kubeconfig-mode=644 \
           --kube-apiserver-arg="--service-account-issuer=<SERVICE_ACCOUNT_ISSUER>" \
           --kube-apiserver-arg="--enable-admission-plugins=OwnerReferencesPermissionEnforcement"
      
  2. 重新啟動 kube-apiserver。

    sudo systemctl daemon-reload
    sudo systemctl restart k3s
    

建立 Azure Key Vault

建立 Azure Key Vault 並新增密碼。 如果您已經有 Azure Key Vault 和密碼,可以略過本節。

  1. 建立 Azure Key Vault:

    az keyvault create --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --name "${KEYVAULT_NAME}" --enable-rbac-authorization
    
  2. 為自己提供保存庫的「密碼長」權限,以便建立密碼:

    az role assignment create --role "Key Vault Secrets Officer" --assignee ${CURRENT_USER} --scope /subscriptions/${SUBSCRIPTION}/resourcegroups/${RESOURCE_GROUP}/providers/Microsoft.KeyVault/vaults/${KEYVAULT_NAME}
    
  3. 建立密碼並加以更新,以便您有兩個版本:

    az keyvault secret set --vault-name "${KEYVAULT_NAME}" --name "${KEYVAULT_SECRET_NAME}" --value 'Hello!'
    az keyvault secret set --vault-name "${KEYVAULT_NAME}" --name "${KEYVAULT_SECRET_NAME}" --value 'Hello2'
    

建立使用者指派的受控識別

接下來,建立使用者指派的受控識別,並授與其存取 Azure Key Vault 的權限。 如果您已經有具有 Azure Key Vault 的 Key Vault 讀者和 Key Vault 密碼使用者權限的受控識別,您可以略過本節。 如需詳細資訊,請參閱建立使用者指派的受控識別搭配 Key Vault 使用 Azure RBAC 密碼、金鑰和憑證權限

  1. 建立使用者指派的受控識別:

    az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"
    
  2. 提供身分識別 Key Vault 讀者和 Key Vault 密碼使用者權限。 您可能需要稍微等候,讓身分識別建立複寫,這些命令才會成功:

    export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -otsv)"
    az role assignment create --role "Key Vault Reader" --assignee "${USER_ASSIGNED_CLIENT_ID}" --scope /subscriptions/${SUBSCRIPTION}/resourcegroups/${RESOURCE_GROUP}/providers/Microsoft.KeyVault/vaults/${KEYVAULT_NAME}
    az role assignment create --role "Key Vault Secrets User" --assignee "${USER_ASSIGNED_CLIENT_ID}" --scope /subscriptions/${SUBSCRIPTION}/resourcegroups/${RESOURCE_GROUP}/providers/Microsoft.KeyVault/vaults/${KEYVAULT_NAME}
    

建立同盟身分識別認證

為需要存取密碼的工作負載建立 Kubernetes 服務帳戶。 然後,建立同盟身分識別認證,以在受控識別、OIDC 服務帳戶簽發者和 Kubernetes 服務帳戶之間建立連結。

  1. 建立將與受控識別建立同盟的 Kubernetes Service 帳戶。 以相關聯使用者指派的受控識別的詳細資料標註它。

    kubectl create ns ${KUBERNETES_NAMESPACE}
    
    cat <<EOF | kubectl apply -f -
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: ${SERVICE_ACCOUNT_NAME}
        namespace: ${KUBERNETES_NAMESPACE}
    EOF
    
  2. 建立同盟身分識別認證:

    az identity federated-credential create --name ${FEDERATED_IDENTITY_CREDENTIAL_NAME} --identity-name ${USER_ASSIGNED_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --issuer ${SERVICE_ACCOUNT_ISSUER} --subject system:serviceaccount:${KUBERNETES_NAMESPACE}:${SERVICE_ACCOUNT_NAME}
    

安裝和使用密碼存放區

密碼存放區可以 Azure Arc 延伸模組形式取得。 已啟用 Azure Arc 的 Kubernetes 叢集可以使用已啟用 Azure Arc 的 Kubernetes 延伸模組來延伸。 延伸模組可在連線的叢集上啟用 Azure 功能,並為延伸模組安裝和生命週期管理提供 Azure Resource Manager 驅動的體驗。

密碼存放區會以 Azure Arc 延伸模組形式安裝

安裝 cert-manager 和 trust-manager

需要 cert-managertrust-manager ,才能在叢集服務之間安全地通訊記錄,而且必須在 Arc 延伸模組之前安裝。

  1. 安裝 cert-manager。

    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.15.3/cert-manager.yaml
    
  2. 安裝 trust-manager。

    helm repo add jetstack https://charts.jetstack.io
    helm repo update
    helm upgrade trust-manager jetstack/trust-manager --install --namespace cert-manager --wait
    

安裝密碼存放區 Azure Arc 延伸模組

在安裝延伸模組之前,請確定 Kubernetes 叢集已連線到 Azure Arc

  1. 針對連線叢集的資源群組和名稱設定兩個環境變數。 如果您遵循稍早連結的快速入門,分別是 'AzureArcTest' 和 'AzureArcTest1'。

    export ARC_RESOURCE_GROUP="AzureArcTest"
    export ARC_CLUSTER_NAME="AzureArcTest1"
    
  2. 使用下列命令,將密碼存放區延伸模組安裝到已啟用 Arc 的叢集:

    az k8s-extension create \
      --cluster-name ${ARC_CLUSTER_NAME} \
      --cluster-type connectedClusters \
      --extension-type microsoft.azure.secretstore \
      --resource-group ${ARC_RESOURCE_GROUP} \
      --release-train preview \
      --name ssarcextension \
      --scope cluster 
    

    如有需要,您可以選擇性地藉由新增 --configuration-settings rotationPollIntervalInSeconds=<time_in_seconds> 來修改預設的輪替輪詢間隔:

    參數名稱 描述 預設值
    rotationPollIntervalInSeconds 指定密碼存放區檢查或更新其管理密碼的速度。 3600 (1 小時)

設定密碼存放區

藉由定義 Kubernetes 自訂資源的執行個體,設定已安裝的延伸模組,其中包含 Azure Key Vault 的相關資訊,以及要同步至叢集的密碼。 您可以建立兩個類型的自訂資源:

  • SecretProviderClass 物件,用來定義 Key Vault 的連線。
  • SecretSync 物件,於要同步的每個密碼。

建立 SecretProviderClass 資源

資源 SecretProviderClass 可用來定義 Azure Key Vault 的連線、用來存取保存庫的身分識別、要同步的密碼,以及要保留在本機的每個密碼的版本數目。

針對您想要同步的每個 Azure Key Vault、用於存取 Azure Key Vault 的每個身分識別,以及用於每個目標 Kubernetes 命名空間的身分識別,都需要個別的 SecretProviderClass

遵循此範例,為您的 Key Vault 和密碼建立具有適當值的一或多個 SecretProviderClass YAML 檔案。

cat <<EOF > spc.yaml
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: secret-provider-class-name                      # Name of the class; must be unique per Kubernetes namespace
  namespace: ${KUBERNETES_NAMESPACE}                    # Kubernetes namespace to make the secrets accessible in
spec:
  provider: azure
  parameters:
    clientID: "${USER_ASSIGNED_CLIENT_ID}"               # Managed Identity Client ID for accessing the Azure Key Vault with.
    keyvaultName: ${KEYVAULT_NAME}                       # The name of the Azure Key Vault to synchronize secrets from.
    objects: |
      array:
        - |
          objectName: ${KEYVAULT_SECRET_NAME}            # The name of the secret to sychronize.
          objectType: secret
          objectVersionHistory: 2                       # [optional] The number of versions to synchronize, starting from latest.
    tenantID: "${AZURE_TENANT_ID}"                       # The tenant ID of the Key Vault 
EOF

建立 SecretSync 物件

每個同步的密碼也需要 SecretSync 物件,才能定義叢集特定資訊。 在這裡,您會指定資訊,例如叢集中的密碼名稱,以及儲存在您叢集中之每個密碼版本的名稱。

為每個密碼建立一個 SecretSync 物件 YAML 檔案,遵循此範本。 Kubernetes 命名空間應該符合相符 SecretProviderClass 的命名空間。

cat <<EOF > ss.yaml
apiVersion: secret-sync.x-k8s.io/v1alpha1
kind: SecretSync
metadata:
  name: secret-sync-name                                  # Name of the object; must be unique per Kubernetes namespace
  namespace: ${KUBERNETES_NAMESPACE}                      # Kubernetes namespace
spec:
  serviceAccountName: ${SERVICE_ACCOUNT_NAME}             # The Kubernetes service account to be given permissions to access the secret.
  secretProviderClassName: secret-provider-class-name     # The name of the matching SecretProviderClass with the configuration to access the AKV storing this secret
  secretObject:
    type: Opaque
    data:
    - sourcePath: ${KEYVAULT_SECRET_NAME}/0                # Name of the secret in Azure Key Vault with an optional version number (defaults to latest)
      targetKey: ${KEYVAULT_SECRET_NAME}-data-key0         # Target name of the secret in the Kubernetes Secret Store (must be unique)
    - sourcePath: ${KEYVAULT_SECRET_NAME}/1                # [optional] Next version of the AKV secret. Note that versions of the secret must match the configured objectVersionHistory in the secrets provider class 
      targetKey: ${KEYVAULT_SECRET_NAME}-data-key1         # [optional] Next target name of the secret in the K8s Secret Store
EOF

套用設定 CR

使用 kubectl apply 命令套用設定自訂資源 (CR):

kubectl apply -f ./spc.yaml
kubectl apply -f ./ss.yaml

密碼存放區會自動尋找密碼,並開始將它們同步至叢集。

檢視設定選項

若要檢視這兩個自訂資源類型的其他設定選項,請使用 kubectl describe 命令來檢查叢集中的 CRD:

# Get the name of any applied CRD(s)
kubectl get crds -o custom-columns=NAME:.metadata.name

# View the full configuration options and field parameters for a given CRD
kubectl describe crd secretproviderclass
kubectl describe crd secretsync

觀察同步至叢集的密碼

套用設定之後,密碼就會以安裝密碼存放區時指定的頻率自動同步至叢集。

檢視同步的密碼

執行下列命令來檢視同步至叢集的密碼:

# View a list of all secrets in the namespace
kubectl get secrets -n ${KUBERNETES_NAMESPACE}

# View details of all secrets in the namespace
kubectl get secrets -n ${KUBERNETES_NAMESPACE} -o yaml

檢視上次同步狀態

若要檢視指定密碼的最新同步狀態,請使用 kubectl describe 命令取得 SecretSync 物件。 輸出包含密碼建立時間戳記、密碼版本,以及每個同步事件的詳細狀態訊息。 此輸出可用來診斷連線或設定錯誤,以及觀察密碼值何時變更。

kubectl describe secretsync secret-sync-name -n ${KUBERNETES_NAMESPACE}

檢視密碼值

若要檢視同步的密碼值 (現在儲存在 Kubernetes 密碼存放區中),請使用下列命令:

kubectl get secret secret-sync-name -n ${KUBERNETES_NAMESPACE} -o jsonpath="{.data.${KEYVAULT_SECRET_NAME}-data-key0}" | base64 -d
kubectl get secret secret-sync-name -n ${KUBERNETES_NAMESPACE} -o jsonpath="{.data.${KEYVAULT_SECRET_NAME}-data-key1}" | base64 -d

疑難排解

密碼存放區是一個 Kubernetes 部署,其中包含具有兩個容器的 Pod:控制器,其會管理將密碼儲存在叢集中,以及提供者,其會管理存取以及從 Azure Key Vault 提取密碼。 每個同步的密碼都有一個 SecretSync 物件,其包含該密碼從 Azure Key Vault 同步至叢集密碼存放區的狀態。

若要針對問題進行疑難排解,請從查看 SecretSync 物件的狀態開始,如檢視上次同步狀態中所述。 下表列出常見的狀態類型、其意義,以及解決錯誤的潛在疑難排解步驟。

SecretSync 狀態類型 詳細資料 進一步修正/調查的步驟
CreateSucceeded 已成功建立密碼。 n/a
CreateFailedProviderError 密碼建立失敗,因為提供者發生一些問題 (與 Azure Key Vault 的連線)。 此失敗可能是因為網際網路連線、同步密碼的身分識別權限不足、SecretProviderClass 設定錯誤或其他問題所造成。 使用下列命令查看提供者的記錄,以進一步調查:
kubectl get pods -n azure-secret-store
kubectl logs <secret-sync-controller-pod-name> -n azure-secret-store --container='provider-azure-installer'
CreateFailedInvalidLabel 密碼建立失敗,因為密碼已存在,但沒有密碼存放區用來管理其密碼的正確 Kubernetes 標籤。 移除現有的標籤和密碼,並允許密碼存放區重新建立密碼:kubectl delete secret <secret-name>
若要強制密碼存放區較已設定的輪替輪詢間隔更快重新建立密碼,請刪除 SecretSync 物件 (kubectl delete secretsync <secret-name>) 並重新套用密碼同步類別 (kubectl apply -f <path_to_secret_sync>)。
CreateFailedInvalidAnnotation 密碼建立失敗,因為密碼已存在,但沒有密碼存放區用來管理其密碼的正確 Kubernetes 註釋。 移除現有的註釋和密碼,並允許密碼存放區重新建立密碼:kubectl delete secret <secret-name>
若要強制密碼存放區較已設定的輪替輪詢間隔更快重新建立密碼,請刪除 SecretSync 物件 (kubectl delete secretsync <secret-name>) 並重新套用密碼同步類別 (kubectl apply -f <path_to_secret_sync>)。
UpdateNoValueChangeSucceeded 密碼存放區會在設定的輪詢間隔結束時檢查 Azure Key Vault 是否有更新,但對同步沒有變更。 n/a
UpdateValueChangeOrForceUpdateSucceeded 密碼存放區已檢查 Azure Key Vault 是否有更新,並已成功更新此值。 n/a
UpdateFailedInvalidLabel 密碼更新失敗,因為密碼存放區用來管理其密碼的標籤已修改。 移除現有的標籤和密碼,並允許密碼存放區重新建立密碼:kubectl delete secret <secret-name>
若要強制密碼存放區較已設定的輪替輪詢間隔更快重新建立密碼,請刪除 SecretSync 物件 (kubectl delete secretsync <secret-name>) 並重新套用密碼同步類別 (kubectl apply -f <path_to_secret_sync>)。
UpdateFailedInvalidAnnotation 密碼更新失敗,因為密碼存放區用來管理其密碼的註釋已修改。 移除現有的註釋和密碼,並允許密碼存放區重新建立密碼:kubectl delete secret <secret-name>
若要強制密碼存放區較已設定的輪替輪詢間隔更快重新建立密碼,請刪除 SecretSync 物件 (kubectl delete secretsync <secret-name>) 並重新套用密碼同步類別 (kubectl apply -f <path_to_secret_sync>)。
UpdateFailedProviderError 密碼更新失敗,因為提供者發生一些問題 (與 Azure Key Vault 的連線)。 此失敗可能是因為網際網路連線、同步密碼的身分識別權限不足、SecretProviderClass 的設定或其他問題所造成。 使用下列命令查看提供者的記錄,以進一步調查:
kubectl get pods -n azure-secret-store
kubectl logs <secret-sync-controller-pod-name> -n azure-secret-store --container='provider-azure-installer'
UserInputValidationFailed 密碼更新失敗,因為密碼同步類別設定不正確 (例如無效的密碼類型)。 檢閱密碼同步類別定義,並更正任何錯誤。 然後,刪除 SecretSync 物件 (kubectl delete secretsync <secret-name>)、刪除密碼同步類別 (kubectl delete -f <path_to_secret_sync>),然後重新套用密碼同步類別 (kubectl apply -f <path_to_secret_sync>)。
ControllerSpcError 密碼更新失敗,因為密碼存放區無法取得提供者類別或提供者類別設定錯誤。 檢閱提供者類別並更正任何錯誤。 然後,刪除 SecretSync 物件 (kubectl delete secretsync <secret-name>)、刪除提供者類別 (kubectl delete -f <path_to_provider>),然後重新套用提供者類別 (kubectl apply -f <path_to_provider>)。
ControllerInternalError 由於密碼存放區中發生內部錯誤,密碼更新失敗。 如需詳細資訊,請檢查密碼存放區記錄或事件:
kubectl get pods -n azure-secret-store
kubectl logs <secret-sync-controller-pod-name> -n azure-secret-store --container='manager'
SecretPatchFailedUnknownError 修補 Kubernetes 密碼值期間密碼更新失敗。 如果密碼存放區以外的人員修改密碼,或密碼存放區更新期間發生問題,就可能發生此失敗。 嘗試刪除密碼和 SecretSync 物件,然後重新套用密碼同步 CR 來讓密碼存放區重新建立密碼:
kubectl delete secret <secret-name>
kubectl delete secretsync <secret-name>
kubectl apply -f <path_to_secret_sync>

移除密碼存放區

若要移除密碼存放區並停止同步密碼,請使用 az k8s-extension delete 命令將其解除安裝:

az k8s-extension delete --name ssarcextension --cluster-name $ARC_CLUSTER_NAME  --resource-group $RESOURCE_GROUP  --cluster-type connectedClusters    

解除安裝延伸模組不會從叢集移除密碼、SecretSync 物件或 CRD。 這些物件必須使用 kubectl 直接移除。

刪除 SecretSync CRD 會移除所有 SecretSync 物件,且預設會移除所有擁有的密碼,但如果發生下列狀況,可能會保存密碼:

在上述情況下,必須使用 kubectl 直接刪除密碼。

下一步