在 Azure Kubernetes Service 中使用受控識別 (AKS)

Azure Kubernetes Service (AKS) 叢集需要身分識別才能存取 Azure 資源,例如負載平衡器和受控磁碟。 身分識別可以是 受控識別 或服務 主體

本文提供如何在新的或現有的 AKS 叢集上啟用下列受控識別類型的詳細資料:

  • 系統指派的受控識別
  • 攜帶您自己的使用者指派受控識別
  • 預先建立的 Kubelet 受控識別

概觀

當您部署 AKS 叢集時,系統指派的受控識別會自動建立,並由 Azure 平臺管理,因此不需要布建或輪替任何秘密。 如需詳細資訊,請參閱 Azure 資源的受控識別。

AKS 不會自動建立 服務主體,因此您必須建立一個服務主體。 使用服務主體的叢集最終會過期,而且必須更新服務主體,以避免影響使用身分識別的叢集驗證。 管理服務主體會增加複雜性,因此更容易改用受控識別。 服務主體和受控識別適用相同的權限需求。 受控識別會使用憑證式驗證。 每個受控識別的認證都有 90 天的到期日,並在 45 天后復原

AKS 同時使用系統指派和使用者指派的受控識別類型,而且這些身分識別是不可變的。 這些身分識別類型不應與 Microsoft Entra Workload 身分識別混淆,這是供 Pod 上執行的應用程式使用。

重要

Azure Kubernetes Service 中的 開放原始碼 Microsoft Entra Pod 受控識別(預覽版)在 2022/10/24 上已被取代,且專案於 2023 年 9 月封存。 如需詳細資訊,請參閱 取代通知。 AKS Managed 附加元件將於 2024 年 9 月開始淘汰。

建議您先檢閱 Microsoft Entra 工作負載 ID 概觀。 Entra 工作負載 ID 驗證會取代 Microsoft Entra Pod 受控識別(預覽),而且是啟用在 Pod 上執行的應用程式,以針對支援它的其他 Azure 服務自行驗證自己的方法。

開始之前

限制

  • 不支援租用戶移動或移轉已啟用受控識別的叢集。
  • 如果叢集已啟用 Microsoft Entra Pod 受控識別 (aad-pod-identity) ,節點受控識別 (NMI) Pod 會修改節點的 iptable,以攔截對 Azure 實例元數據 (IMDS) 端點的呼叫。 此組態表示對元數據端點所做的任何要求會遭到 NMI 攔截,即使 Pod 未使用 aad-pod-identity也一樣。 您可以將 AzurePodIdentityException CRD 設定為通知 aad-pod-identity 來自符合 CRD 中定義之標籤標的 Pod 的任何要求,而不需在 NMI 中進行任何處理。 設定 AzurePodIdentityException CRD,應該排除 aad-pod-identity kube-system 命名空間中標籤kubernetes.azure.com/managedby: aks的系統 Pod。
  • 使用自定義私人 DNS 區域時,AKS 不支援使用系統指派的受控識別。

受控識別的摘要

AKS 會針對內建服務和附加元件使用數個受控識別。

身分識別 名稱 使用案例 預設權限 攜帶您自己的身分識別
控制平面 AKS 叢集名稱 AKS 控制平面元件用來管理叢集資源,包括輸入負載平衡器和 AKS 管理的公用 IP、叢集自動調整程式、Azure 磁碟、檔案、Blob CSI 驅動程式。 節點資源群組的參與者角色 支援
Kubelet AKS 叢集名稱-agentpool 使用 Azure Container Registry 進行驗證 (ACR)。 N/A (適用於 kubernetes v1.15+) 支援
附加元件 AzureNPM 不需要身分識別。 N/A No
附加元件 AzureCNI 網路監視 不需要身分識別。 N/A No
附加元件 azure-policy (gatekeeper) 不需要身分識別。 N/A No
附加元件 azure-policy 不需要身分識別。 N/A No
附加元件 Calico 不需要身分識別。 N/A No
附加元件 儀表板​​ 不需要身分識別。 N/A No
附加元件 應用程式路由 管理 Azure DNS 和 Azure 金鑰保存庫 憑證 金鑰保存庫 #D9FC26527117749B69CF5E7C1417910D2 秘密使用者角色、DNS 區域的 DNZ 區域參與者角色、私人 DNS 區域的 私用 DNS 區域參與者角色 No
附加元件 HTTPApplicationRouting 管理所需的網路資源。 節點資源群組的讀者角色、DNS 區域的參與者角色 No
附加元件 輸入應用程式閘道 管理所需的網路資源。 節點資源群組的參與者角色 No
附加元件 omsagent 用來將 AKS 計量傳送至 Azure 監視器。 監視計量發行者角色 No
附加元件 虛擬節點 (ACI 連線 or) 管理 Azure 容器執行個體 所需的網路資源(ACI)。 節點資源群組的參與者角色 No
附加元件 成本分析 用來收集成本配置數據
工作負載身分識別 Microsoft Entra 工作負載標識符 可讓應用程式使用 Microsoft Entra 工作負載標識元安全地存取雲端資源。 N/A No

在新的 AKS 叢集上啟用受控識別

注意

如果您的叢集已經使用受控識別且身分識別已變更,例如,您將叢集身分識別類型從系統指派更新為使用者指派,則控制平面元件會延遲切換至新的身分識別。 控制平面元件會繼續使用舊的身分識別,直到其令牌到期為止。 重新整理令牌之後,他們會切換至新的身分識別。 此程式可能需要數小時的時間。

  1. 使用 az group create 命令建立 Azure 資源群組。

    az group create --name myResourceGroup --location westus2
    
  2. 使用 az aks create 命令建立 AKS 叢集。

    az aks create -g myResourceGroup -n myManagedCluster --enable-managed-identity
    
  3. 使用 命令取得存取叢集的 az aks get-credentials 認證。

    az aks get-credentials --resource-group myResourceGroup --name myManagedCluster
    

在現有的 AKS 叢集上啟用受控識別

若要更新使用服務主體使用系統指派的受控識別的現有 AKS 叢集,請執行 az aks update 命令。

az aks update -g myResourceGroup -n myManagedCluster --enable-managed-identity

更新叢集之後,控制平面和Pod會使用受控識別。 Kubelet 會繼續使用服務主體,直到您升級代理程式集區為止。 您可以在節點上使用 az aks nodepool upgrade --resource-group myResourceGroup --cluster-name myAKSCluster --name mynodepool --node-image-only 命令來更新為受控識別。 節點集區升級會導致 AKS 叢集停機,因為節點集區中的節點已封鎖/清空並重新映像。

注意

更新叢集時請記住下列資訊:

  • 只有在有要取用的 VHD 更新時,更新才能運作。 如果您正在執行最新的 VHD,您必須等到下一個 VHD 可供使用,才能執行更新。

  • Azure CLI 可確保在移轉之後正確設定載入宏的許可權。 如果您未使用 Azure CLI 來執行移轉作業,您必須自行處理附加元件身分識別的許可權。 如需使用 Azure Resource Manager (ARM) 範例,請參閱 使用ARM樣本指派 Azure 角色。

  • 如果您的叢集使用 --attach-acr 從 Azure Container Registry 提取映像,您必須在更新叢集之後執行 az aks update --resource-group myResourceGroup --name myAKSCluster --attach-acr <ACR resource ID> 命令,讓用於受控識別的新建立 kubelet 取得從 ACR 提取的許可權。 否則,您將無法在更新之後從 ACR 提取。

新增受控識別的角色指派

當您建立並使用自己的 VNet、連結 Azure 磁碟、靜態 IP 位址、路由表或使用者指派的 kubelet 身分識別時,資源位於背景工作節點資源群組外部,Azure CLI 會自動新增角色指派。 如果您使用 ARM 範本或其他方法,則必須使用叢集受控識別的主體標識碼來執行角色指派。

如果您不是使用 Azure CLI,而是使用自己的 VNet、連結 Azure 磁碟、靜態 IP 位址、路由表或位於背景工作節點資源群組外部的使用者指派 kubelet 身分識別,建議您針對控制平面使用使用者指派的受控識別。 若要讓控制平面使用系統指派的受控識別,在建立叢集之前,我們無法取得身分識別標識碼,這會延遲角色指派生效。

取得受控識別的主要標識碼

  • 使用 az identity show 命令取得現有身分識別的主體標識碼。

    az identity show --ids <identity-resource-id>
    

    您的輸出應該類似下列範例輸出:

    {
      "clientId": "<client-id>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity",
      "location": "eastus",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

新增角色指派

針對 VNet、連結的 Azure 磁碟、靜態 IP 位址或預設背景工作節點資源群組外的路由表,您必須在自定義資源群組上指派 Contributor 角色。

  • Contributor使用 az role assignment create 命令,在自定義資源群組上指派角色。

    az role assignment create --assignee <control-plane-identity-principal-id> --role "Contributor" --scope "<custom-resource-group-resource-id>"
    

針對預設背景工作節點資源群組外部的使用者指派 kubelet 身分識別,您必須在 kubelet 身分識別上指派 受控識別操作員 角色,以取得控制平面受控識別。

  • Managed Identity Operator使用 az role assignment create 命令,在 kubelet 身分識別上指派角色。

    az role assignment create --assignee  <control-plane-identity-principal-id> --role "Managed Identity Operator" --scope "<kubelet-identity-resource-id>"
    

注意

授與叢集受控識別的許可權最多可能需要 60 分鐘才能填入。

攜帶您自己的受控識別

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

控制平面的自定義使用者指派受控識別可在叢集建立之前存取現有的身分識別。 這項功能可讓您使用自定義 VNet 或 UDR 的 outboundType 搭配預先建立的受控識別等案例。

注意

不支援 AZURE 美國政府雲端中的 USDOD Central、USDOD East 和 USGov 愛荷華州區域。

如果您未 指定自己的 kubelet 受控識別,AKS 會在節點資源群組中建立使用者指派的 kubelet 身分識別。

  • 如果您沒有受控識別,請使用 az identity create 命令建立一個。

    az identity create --name myIdentity --resource-group myResourceGroup
    

    您的輸出應該類似下列範例輸出:

    {                                  
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity", 
      "location": "westus2",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

注意

授與叢集受控識別的許可權最多可能需要 60 分鐘才能填入。

  • 建立叢集之前,請先使用 az role assignment create 命令新增受控識別的角色指派。

  • 使用使用者指派的受控識別建立叢集。

    az aks create \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --network-plugin azure \
        --vnet-subnet-id <subnet-id> \
        --dns-service-ip 10.2.0.10 \
        --service-cidr 10.2.0.0/24 \
        --enable-managed-identity \
        --assign-identity <identity-resource-id>
    

更新現有叢集上的受控識別

注意

將控制平面的受控識別從系統指派移轉至使用者指派,不會造成控制平面和代理程式集區的任何停機時間。 同時,控制平面元件會持續使用舊系統指派的身分識別數小時,直到下一次令牌重新整理為止。

  • 如果您沒有受控識別,請使用 az identity create 命令建立一個。

    az identity create --name myIdentity --resource-group myResourceGroup
    

    您的輸出應該類似下列範例輸出:

    {                                  
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity", 
      "location": "westus2",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  • 為控制平面建立自定義使用者指派的受控識別之後,請使用 az role assignment create 命令新增受控識別的角色指派。

  • 使用 az aks update 命令,以現有的身分識別更新叢集。 請務必藉由包含 assign-identity 自變數,為控制平面提供受控識別的資源標識符。

    az aks update \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --enable-managed-identity \
        --assign-identity <identity-resource-id> 
    

    使用您自己的 kubelet 受控識別成功更新叢集的輸出應該類似下列範例輸出:

      "identity": {
        "principalId": null,
        "tenantId": null,
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity": {
            "clientId": "<client-id>",
            "principalId": "<principal-id>"
          }
        }
      },
    

使用預先建立的 kubelet 受控識別

kubelet 身分識別可在叢集建立之前存取現有的身分識別。 這項功能可讓您使用預先建立的受控識別來連線至 ACR 等案例。

預先建立的 kubelet 身分識別限制

  • 僅適用於使用者指派的受控叢集。
  • 不支援由 21Vianet 運作的 Microsoft Azure 中的中國東部和華北區域。

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

控制平面受控識別

  • 如果您沒有控制平面的受控識別,請使用 az identity create建立一個 。

    az identity create --name myIdentity --resource-group myResourceGroup
    

    您的輸出應該類似下列範例輸出:

    {                                  
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity", 
      "location": "westus2",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

kubelet 受控識別

  • 如果您沒有 kubelet 受控識別,請使用 az identity create 命令建立一個。

    az identity create --name myKubeletIdentity --resource-group myResourceGroup
    

    您的輸出應該類似下列範例輸出:

    {
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity", 
      "location": "westus2",
      "name": "myKubeletIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

使用使用者指派的 kubelet 身分識別建立叢集

現在您可以使用現有的身分識別來建立 AKS 叢集。 請務必使用 自變數來提供 assign-identity 控制平面受控識別的資源標識碼,以及使用 assign-kubelet-identity 自變數的 kubelet 受控識別。

  • 使用 命令,建立具有現有身分識別的 az aks create AKS 叢集。

    az aks create \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --network-plugin azure \
        --vnet-subnet-id <subnet-id> \
        --dns-service-ip 10.2.0.10 \
        --service-cidr 10.2.0.0/24 \
        --enable-managed-identity \
        --assign-identity <identity-resource-id> \
        --assign-kubelet-identity <kubelet-identity-resource-id>
    

    使用您自己的 kubelet 受控識別建立成功的 AKS 叢集應該類似下列範例輸出:

      "identity": {
        "principalId": null,
        "tenantId": null,
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity": {
            "clientId": "<client-id>",
            "principalId": "<principal-id>"
          }
        }
      },
      "identityProfile": {
        "kubeletidentity": {
          "clientId": "<client-id>",
          "objectId": "<object-id>",
          "resourceId": "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity"
        }
      },
    

使用 kubelet 身分識別更新現有的叢集

警告

更新 kubelet 受控識別升級節點集區,這會導致 AKS 叢集停機,因為節點集區中的節點會受到封鎖/清空和重新映像。

注意

如果您的叢集使用 --attach-acr 從 Azure Container Registry 提取映像,您必須在更新叢集之後執行 az aks update --resource-group myResourceGroup --name myAKSCluster --attach-acr <ACR Resource ID> 命令,讓用於受控識別的新建立 kubelet 取得從 ACR 提取的許可權。 否則,在升級之後,您將無法從 ACR 提取。

取得 AKS 叢集目前的控制平面受控識別

  1. 使用 命令確認您的 AKS 叢集正在使用使用者指派的受控識別 az aks show

    az aks show -g <RGName> -n <ClusterName> --query "servicePrincipalProfile"
    

    如果您的叢集使用受控識別,輸出clientId會顯示 msi。 使用服務主體的叢集會顯示物件標識符。 例如:

    {
      "clientId": "msi"
    }
    
  2. 確認叢集使用受控識別之後,請使用 az aks show 命令尋找受控識別的資源標識碼。

    az aks show -g <RGName> -n <ClusterName> --query "identity"
    

    針對使用者指派的受控識別,您的輸出看起來應該類似下列範例輸出:

    {
      "principalId": null,
      "tenantId": null,
      "type": "UserAssigned",
      "userAssignedIdentities": <identity-resource-id>
          "clientId": "<client-id>",
          "principalId": "<principal-id>"
    },
    

使用 kubelet 身分識別更新叢集

  1. 如果您沒有 kubelet 受控識別,請使用 az identity create 命令建立一個。

    az identity create --name myKubeletIdentity --resource-group myResourceGroup
    

    您的輸出應該類似下列範例輸出:

    {
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity",
      "location": "westus2",
      "name": "myKubeletIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  2. 使用 az aks update 命令,以現有的身分識別更新叢集。 請務必提供控制平面受控識別的資源標識符,方法是包含 assign-identity 自變數,以及自變數的 assign-kubelet-identity kubelet 受控識別。

    az aks update \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --enable-managed-identity \
        --assign-identity <identity-resource-id> \
        --assign-kubelet-identity <kubelet-identity-resource-id>
    

    使用您自己的 kubelet 受控識別成功更新叢集的輸出應該類似下列範例輸出:

      "identity": {
        "principalId": null,
        "tenantId": null,
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity": {
            "clientId": "<client-id>",
            "principalId": "<principal-id>"
          }
        }
      },
      "identityProfile": {
        "kubeletidentity": {
          "clientId": "<client-id>",
          "objectId": "<object-id>",
          "resourceId": "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity"
        }
      },
    

下一步

  • 使用 Azure Resource Manager 範本 來建立已啟用受控識別的叢集。
  • 瞭解如何針對 AKS 中所有支援的 Microsoft Entra 驗證方法使用 kubelogin][kubelogin-authentication]。