Istio 服務網格附加元件外掛程式 CA 憑證疑難解答

本文討論 Istio 附加元件外掛程式證書頒發機構單位 (CA) 憑證功能的常見疑難解答問題,並提供修正這些問題的解決方案。 本文也會檢閱為服務網格附加元件設定外掛程式 CA 憑證的一般程式。

注意

本文假設 Istio 修訂 asm-1-21 部署在叢集上。

必要條件

一般設定程式

  • 啟用 Istio 附加元件以使用外掛程式 CA 憑證功能之前,您必須在叢集上啟用秘密存放區附加元件 Azure 金鑰保存庫 提供者。 請確定 Azure 金鑰保存庫 和叢集位於相同的 Azure 租使用者上。

  • 啟用 Azure 金鑰保存庫 秘密提供者附加元件之後,您必須為附加元件所建立的使用者指派受控識別設定 Azure 金鑰保存庫 的存取權。

  • 將使用者指派的受控識別許可權授與存取 Azure 金鑰保存庫 之後,您就可以搭配 Istio 附加元件使用外掛程式 CA 憑證功能。 如需詳細資訊,請參閱 啟用 Istio 附加元件以使用外掛程式 CA 憑證 一節。

  • 若要讓叢集在 Azure 金鑰保存庫 秘密中自動偵測變更,您必須為 Azure 金鑰保存庫 秘密提供者附加元件啟用自動輪替

  • 雖然自動套用中繼憑證的變更,但在部署由附加元件所部署的cronjob重新啟動之後istiod,只有控制平面才會挑選跟證書的變更,如 [已部署的資源] 區段所述。 此cronjob會以10分鐘的間隔執行。

啟用 Istio 附加元件以使用外掛程式 CA 憑證

Istio 附加 元件外掛程式 CA 憑證 功能可讓您設定網格的外掛程式根和中繼憑證。 若要在啟用附加元件時提供外掛程式憑證資訊,請在 Azure CLI 中指定 az aks mesh enable 命令的下列參數。

參數 描述
--key-vault-id<resource-id> Azure 金鑰保存庫 資源標識符。 此資源應該位於與受控叢集相同的租使用者中。 此資源識別碼必須是 Azure Resource Manager 範本 (ARM 範本) 資源識別碼格式
--root-cert-object-name<root-cert-obj-name> Azure 金鑰保存庫 中的跟證書物件名稱。
--ca-cert-object-name<inter-cert-obj-name> Azure 金鑰保存庫 中的中繼憑證物件名稱。
--ca-key-object-name<inter-key-obj-name> Azure 金鑰保存庫 中的中繼憑證私鑰物件名稱。
--cert-chain-object-name<cert-chain-obj-name> Azure 金鑰保存庫 中的憑證鏈結物件名稱。

如果您想要使用外掛程式 CA 憑證功能,您必須指定所有五個參數。 所有 Azure 金鑰保存庫 物件必須是 Secret 類型

如需詳細資訊,請參閱 在 Azure Kubernetes Service 上插入 Istio 型服務網格附加元件 CA 憑證。

部署的資源

作為外掛程式憑證功能的附加元件部署的一部分,下列資源會部署到叢集:

  • cacerts Kubernetes 秘密會在附加元件部署時在命名空間中aks-istio-system建立。 此秘密包含同步處理的 Azure 金鑰保存庫 秘密:

    kubectl describe secret cacerts --namespace aks-istio-system
    
    Name:         cacerts
    Namespace:    aks-istio-system
    Labels:       secrets-store.csi.k8s.io/managed=true
    Annotations:  <none>
    
    Type:  opaque
    
    Data
    ====
    ca-cert.pem:     1968 bytes
    ca-key.pem:      3272 bytes
    cert-chain.pem:  3786 bytes
    root-cert.pem:   3636 bytes
    
  • istio-spc-asm-1-21 SecretProviderClass 物件會在附加元件部署時在命名空間中aks-istio-system建立。 此資源包含秘密存放區容器記憶體介面 (CSI) 驅動程式的 Azure 特定參數:

    kubectl get secretproviderclass --namespace aks-istio-system
    
    NAME                 AGE
    istio-spc-asm-1-21   14h
    
  • istio-ca-root-cert configmap 會在命名空間和所有使用者管理的命名空間中aks-istio-system建立。 此 configmap 包含證書頒發機構單位使用的跟證書,而且命名空間中的工作負載會使用此跟證書來驗證工作負載對工作負載通訊,如下所示:

    kubectl describe configmap istio-ca-root-cert --namespace aks-istio-system
    
    Name:         istio-ca-root-cert
    Namespace:    aks-istio-system
    Labels:       istio.io/config=true
    Annotations:  <none>
    
    Data
    ====
    root-cert.pem:
    ----
    -----BEGIN CERTIFICATE-----
    <certificate data>
    -----END CERTIFICATE-----
    
  • istio-cert-validator-cronjob-asm-1-21 cronjob 物件是在 命名空間中建立的aks-istio-system。 此cronjob會排定每10分鐘執行一次,以檢查跟證書上的更新。 如果 Kubernetes 秘密中的 cacerts 跟證書不符合 istio-ca-root-cert 命名空間中的 aks-istio-system configmap,則會重新啟動 istiod-asm-1-21 部署:

    kubectl get cronjob --namespace aks-istio-system
    
    NAME                                    SCHEDULE       SUSPEND   ACTIVE
    istio-cert-validator-cronjob-asm-1-21   */10 * * * *   False     0     
    

    您可以執行下列命令來檢查上次執行的 cronjob 記錄:

    kubectl logs --namespace aks-istio-system $(kubectl get pods --namespace aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
    

    此指令會根據是否偵測到跟證書更新,產生下列其中一個輸出訊息:

    Root certificate update not detected.
    
    Root certificate update detected. Restarting deployment...
    deployment.apps/istiod-asm-1-21 restarted
    Deployment istiod-asm-1-21 restarted.
    

判斷部署記錄中的憑證類型

您可以檢視 istiod 部署記錄,以判斷您是否擁有自我簽署的 CA 憑證或外掛程式 CA 憑證。 若要檢視記錄,請執行下列命令:

kubectl logs deploy/istiod-asm-1-21 --container discovery --namespace aks-istio-system | grep -v validationController

每個憑證記錄專案緊接在描述該憑證類型的另一個記錄專案之前。 對於自我簽署的 CA 憑證,專案會指出「在 etc/cacerts/ca-key.pem 上沒有插入式憑證;使用自我簽署憑證。」針對外掛程式憑證,專案會指出「在etc/cacerts/ca-key.pem上使用插入式憑證」。下表顯示與憑證相關的範例記錄專案。

  • 自我簽署 CA 憑證的記錄專案

    時間戳記 記錄層級 訊息
    2023-11-20T23:27:36.649019Z 資訊 使用 istiod 檔案格式簽署 ca 檔案
    2023-11-20T23:27:36.649032Z 資訊 在etc/cacerts/ca-key.pem 沒有插入式憑證;使用自我簽署憑證
    2023-11-20T23:27:36.649536Z 資訊 x509 憑證 - 憑證 - <憑證詳細數據>
    2023-11-20T23:27:36.649552Z 資訊 Istiod 憑證會重載
    2023-11-20T23:27:36.649613Z 資訊 spiffe 已將 1 個憑證新增至信任對等憑證驗證器中的網域 cluster.local
  • 外掛程式 CA 憑證的記錄專案

    時間戳記 記錄層級 訊息
    2023-11-21T00:20:25.808396Z 資訊 使用 istiod 檔案格式簽署 ca 檔案
    2023-11-21T00:20:25.808412Z 資訊 在 etc/cacerts/ca-key.pem 使用插入式憑證
    2023-11-21T00:20:25.808731Z 資訊 x509 憑證 - 憑證 - <憑證詳細數據>
    2023-11-21T00:20:25.808764Z 資訊 x509 憑證 - 憑證 - <憑證詳細數據>
    2023-11-21T00:20:25.808799Z 資訊 x509 憑證 - 憑證 - <憑證詳細數據>
    2023-11-21T00:20:25.808803Z 資訊 Istiod 憑證會重載
    2023-11-21T00:20:25.808873Z 資訊 spiffe 已將 1 個憑證新增至信任對等憑證驗證器中的網域 cluster.local

記錄專案中的憑證詳細數據會顯示為簽發者、主體、序號(SN—長十六進位字串)的逗號分隔值,以及憑證有效時定義的開頭和結束時間戳值。

針對自我簽署的 CA 憑證,有一個詳細數據專案。 下表顯示此憑證的範例值。

Issuer 主體 SN NotBefore NotAfter
“O=cluster.local” "" <32-digit-hex-value> “2023-11-20T23:25:36Z” “2033-11-17T23:27:36Z”

針對外掛程式 CA 憑證,有三個詳細數據專案。 其他兩個專案用於跟證書更新,以及中繼憑證的變更。 下表顯示這些專案的範例值。

Issuer 主體 SN NotBefore NotAfter
CN=Intermediate CA - A1,O=Istio,L=cluster-A1” "" <32-digit-hex-value> “2023-11-21T00:18:25Z” “2033-11-18T00:20:25Z”
CN=Root A,O=Istio” “CN=Intermediate CA - A1,O=Istio,L=cluster-A1” <40-digit-hex-value> “2023-11-04T01:40:22Z” “2033-11-01T01:40:22Z”
CN=Root A,O=Istio” “CN=Root A,O=Istio” <40-digit-hex-value> “2023-11-04T01:38:27Z” “2033-11-01T01:38:27Z”

常見問題疑難排解

問題 1:Azure 金鑰保存庫 的存取設定不正確

啟用 Azure 金鑰保存庫 秘密提供者附加元件之後,您必須將附加元件的使用者指派受控識別存取權授與 Azure 金鑰保存庫。 設定 Azure 金鑰保存庫 存取權不正確會導致附加元件安裝停滯。

kubectl get pods --namespace aks-istio-system

在 Pod 清單中,您可以看到 istiod-asm-1-21 Pod 卡在 Init:0/2 狀態中。

NAME 就緒 狀態 重新啟動 年齡
istiod-asm-1-21-6fcfd88478-2x95b 0/1 正在終止 0 5m55s
istiod-asm-1-21-6fcfd88478-6x5hh 0/1 正在終止 0 5m40s
istiod-asm-1-21-6fcfd88478-c48f9 0/1 Init:0/2 0 54s
istiod-asm-1-21-6fcfd88478-wl8mw 0/1 Init:0/2 0 39s

若要確認 Azure 金鑰保存庫 存取問題,請執行 kubectl get pods 命令來找出命名空間中具有secrets-store-provider-azure標籤的 kube-system Pod:

kubectl get pods --selector app=secrets-store-provider-azure --namespace kube-system --output name | xargs -I {} kubectl logs --namespace kube-system {}

下列範例輸出顯示發生「403 禁止」錯誤,因為您在 金鑰保存庫 上沒有秘密的「取得」許可權:

“failed to process mount request” err=“failed to get objectType:secret, objectName:<secret-object-name>, objectVersion:: keyvault.BaseClient#GetSecret:回應要求失敗:StatusCode=403 -- 原始錯誤:autorest/azure:服務傳回錯誤。 Status=403 Code=\“禁止\” Message=\“使用者、群組或應用程式 'appid=<appid>;oid=<oid>;iss=<iss>' 沒有密鑰保存庫 'MyAzureKeyVault' 的秘密取得許可權;location=eastus'。 如需解決此問題的說明,請參閱 https://go.microsoft.com/fwlink/?linkid=2125287\“ InnerError={\”code\“:\”AccessDenied\“}”

若要修正此問題,請取得 Azure 金鑰保存庫 秘密的取得和清單許可權,然後重新安裝 Istio 附加元件,以設定 Azure 金鑰保存庫 秘密提供者附加元件的使用者指派受控識別存取權。 首先,執行 az aks show 命令,以取得 Azure 金鑰保存庫 秘密提供者附加元件的使用者指派受控識別物件識別碼:

OBJECT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId')

若要設定存取原則,請指定您取得的物件標識符,以執行下列 az keyvault set-policy 命令:

az keyvault set-policy --name $AKV_NAME --object-id $OBJECT_ID --secret-permissions get list

注意

您是否針對許可權模型使用 Azure RBAC 授權,而不是使用保存庫存取原則來建立您的 金鑰保存庫? 在此情況下,請參閱使用 Azure 角色型存取控制提供 金鑰保存庫 金鑰、憑證和秘密的存取權,以建立受控識別的許可權。 針對附加元件的使用者指派受控識別,為 金鑰保存庫 讀者新增 Azure 角色指派。

問題 2:未設定自動偵測 金鑰保存庫 秘密變更

若要讓叢集在 Azure 金鑰保存庫 秘密中自動偵測變更,您必須為 Azure 金鑰保存庫 提供者附加元件啟用自動輪替。 自動輪替可以自動偵測中繼和跟證書中的變更。 針對啟用 Azure 金鑰保存庫 提供者附加元件之叢集,請執行下列az aks show命令來檢查是否已啟用自動輪替:

az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.enableSecretRotation'

如果叢集已啟用 Azure 金鑰保存庫 提供者附加元件,請執行下列az aks show命令來判斷輪替輪詢間隔:

az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.rotationPollInterval'

當輪詢間隔時間在上一次同步處理之後經過時,Azure 金鑰保存庫 秘密會與叢集同步處理。 默認間隔值為兩分鐘。

問題 3:憑證值遺失或設定不正確

如果 Azure 金鑰保存庫 遺漏秘密物件,或這些物件設定不正確,istiod-asm-1-21Pod 可能會卡在Init:0/2狀態中,延遲安裝附加元件。 若要找出此問題的根本原因,請針對istiod部署執行下列kubectl describe命令並檢視輸出:

kubectl describe deploy/istiod-asm-1-21 --namespace aks-istio-system

命令會顯示類似下列輸出數據表的事件。 在此範例中,遺漏的秘密是問題的原因。

類型 原因 年齡 訊息
Normal 已排程 3m9s default-scheduler 成功將 aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjjj 指派給 aks-userpool-24672518-vmss000000
警告 FailedMount 66s kubelet 無法連結或掛接磁碟區:未掛接的磁碟區=[cacerts],未連結的磁碟區=[],無法處理磁碟區=[]:等待條件逾時
警告 FailedMount 61s (x9 超過 3m9s) kubelet 磁碟區 「cacerts」 的 MountVolume.SetUp 失敗:rpc 錯誤:程序代碼 = 未知的 desc = 無法掛接 Pod aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdj 的秘密存放區物件, err: rpc error: code = Unknown desc = failed to mount objects, error: failed to get objectType:secret, objectName:test-cert-chain, objectVersion:: keyvault.BaseClient#GetSecret:回應要求失敗:StatusCode=404 -- 原始錯誤:autorest/azure:服務傳回錯誤。 Status=404 Code=“SecretNotFound” Message=“此密鑰保存庫中找不到具有 (name/id) test-cert-chain 的秘密。 如果您最近刪除此秘密,您可以使用正確的修復命令來復原它。 如需解決此問題的說明,請參閱 https://go.microsoft.com/fwlink/?linkid=2125182

資源

協力廠商資訊免責聲明

本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。

第三方聯繫人免責聲明

Microsoft提供第三方連絡資訊,協助您尋找本主題的其他資訊。 此連絡資訊可能會變更而不另行通知。 Microsoft不保證第三方連絡信息的正確性。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。