本文說明如何在新建或現有的 AKS 叢集啟用使用者指派的管理身份,取得該受管身份的主 ID,並為該受管身份新增角色指派。
先決條件
請閱讀 Azure Kubernetes Service (AKS)0 中的
受管理身份概述,了解 AKS 中不同類型的受管理身份,以及如何利用它們安全存取Azure資源。 用這個
az account set指令把你的訂閱設為目前的有效訂閱。az account set --subscription <subscription-id>
一個現有的 Azure 資源群組。 如果你沒有,可以用這個
az group create指令建立一個。az group create \ --name <resource-group-name> \ --location <location>
- Azure CLI 版本 2.23.0 或更後版本安裝。 執行
az --version以尋找版本。 如果你需要安裝或升級,請參考 安裝 Azure CLI。 - 若要更新現有叢集以使用 user 指派的管理身份 ,您需要安裝 2.49.0 版本或更新版本Azure CLI。
- Terraform 本地安裝。 安裝說明請參見 Install Terraform。
局限性
- 一旦你建立了帶有管理身份的叢集,就無法再切換回使用服務主體。
- 不支援將已啟用受控識別的叢集移轉至不同的租用戶。
- 若叢集啟用了 Microsoft Entra Pod-managed Identity(
aad-pod-identity),Node-Managed Identity(NMI)Pod 會修改節點的 iptables,以攔截訪問 Azure 實例元資料(IMDS)端點的請求。 此設定表示即使特定 Pod 未使用aad-pod-identity,對 IMDS 端點所做的任何要求仍會遭到 NMI 攔截。- 您可以設定 AzurePodIdentityException 自訂資源定義 (CRD),指定來自符合 CRD 中所定義標籤之 Pod 的 IMDS 端點要求,應在 NMI 中不經任何處理即加以代理。 設定 AzurePodIdentityException CRD 時,在
kubernetes.azure.com/managedby: aks中排除 kube-system 命名空間中具有aad-pod-identity標籤的系統 Pod。 欲了解更多資訊,請參閱在Azure Kubernetes Service (AKS)中使用Microsoft Entra Pod管理的身份。 - 要設定例外,請安裝 mic-exception YAML。
- 您可以設定 AzurePodIdentityException 自訂資源定義 (CRD),指定來自符合 CRD 中所定義標籤之 Pod 的 IMDS 端點要求,應在 NMI 中不經任何處理即加以代理。 設定 AzurePodIdentityException CRD 時,在
- Azure US Gov 雲端中的 USDOD Central、USDOD East 和 USGov Iowa 區域不支援建立帶有使用者指派管理身份的叢集。
更新叢集的注意事項
更新叢集時,請考慮以下資訊:
- 只有在有要取用的 VHD 更新時,更新才會運作。 如果您要執行最新的 VHD,則需要等到下一個 VHD 可供使用,才能執行更新。
- Azure CLI 確保遷移後外掛的權限設定正確。 如果你沒有使用 Azure CLI 來執行遷移操作,你必須自己處理附加元件身份的權限。 關於使用Azure Resource Manager(ARM)範本的範例,請參見 用 ARM 模板指派Azure角色。
- 如果你的叢集使用
--attach-acr從 Azure Container Registry (ACR) 拉取映像,更新叢集後,你需要執行az aks update --resource-group <resource-group-name> --name <aks-cluster-name> --attach-acr <acr-resource-id>指令,以允許新建立的 kubelet 使用受控身分識別獲得從 ACR 拉取映像的權限。 否則,您將無法在更新之後從 ACR 提取。
建立使用者指派的管理型身分識別
如果您還沒有使用者指派的受控識別資源,請使用 az identity create 命令建立一個。
az identity create \
--name <identity-name> \
--resource-group <resource-group-name>
您的輸出應該與下列範例輸出類似:
{
"clientId": "<client-id>",
"clientSecretUrl": "<clientSecretUrl>",
"id": "/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>",
"location": "<location>",
"name": "<identity-name>",
"principalId": "<principal-id>",
"resourceGroup": "<resource-group-name>",
"tags": {},
"tenantId": "<tenant-id>",
"type": "Microsoft.ManagedIdentity/userAssignedIdentities"
}
接下來,取得使用者指派受控識別的主體識別碼
使用命令 az identity show 取得使用者指派受控識別的主體識別碼。
CLIENT_ID=$(az identity show \
--name <identity-name> \
--resource-group <resource-group-name> \
--query principalId \
--output tsv)
取得使用者指派受控識別的資源識別碼
使用命令 az identity show 取得使用者指派受控識別的資源識別碼。
RESOURCE_ID=$(az identity show \
--name <identity-name> \
--resource-group <resource-group-name> \
--query id \
--output tsv)
在新的 AKS 叢集上啟用使用者指派的受控識別
使用指令 az aks create 並將 --assign-identity 參數設定為使用者指派的受管理識別的 資源 ID,以建立 AKS 叢集。
az aks create \
--resource-group <resource-group-name> \
--name <cluster-name> \
--network-plugin azure \
--vnet-subnet-id <vnet-subnet-id> \
--dns-service-ip 10.2.0.10 \
--service-cidr 10.2.0.0/24 \
--assign-identity $RESOURCE_ID \
--generate-ssh-keys
更新現有的叢集以使用使用者指派的受控識別
使用 az aks update 命令,並將 --assign-identity 參數設為使用者指派受控識別的資源 ID,以更新現有叢集來使用使用者指派受控識別。
az aks update \
--resource-group <resource-group-name> \
--name <cluster-name> \
--enable-managed-identity \
--assign-identity $RESOURCE_ID
使用使用者指派受控識別的成功叢集更新輸出應該類似下列範例輸出:
...
"identity": {
"principalId": null,
"tenantId": null,
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>": {
"clientId": "<client-id>",
"principalId": "<principal-id>"
}
}
},
...
當你更新叢集,改用使用者指派的管理身份取代服務主體後,控制平面和 pod 在存取 Azure 中其他服務時,會使用使用者指派的管理身份來授權。 Kubelet 會繼續使用服務主體,直到您也升級節點集區為止。 節點集區升級會導致 AKS 叢集停機,因為集區中的節點會被隔離、清空,然後再重新安裝映像。 你可以在節點上使用命令來更新為用戶指定的管理身份。
az aks nodepool upgrade \
--resource-group <resource-group-name> \
--cluster-name <aks-cluster-name> \
--name <node-pool-name> \
--node-image-only
備註
將控制平面的受控識別從系統指派移轉至使用者指派,不會造成控制平面和代理程式集區的任何停機。 控制平面元件會持續使用舊系統指定的身份,最多可持續數小時,直到下一次令牌更新。
將 Azure RBAC 角色指派給使用者指派的受控識別
使用命令 az role assignment create 為使用者指派的受控識別新增角色指派。 以下範例將 金鑰保存庫 Secrets User 角色分配給使用者指派的受管理身份,以授權其存取key vault中的秘密。 角色指派的範圍是金鑰保存庫資源。
az role assignment create \
--assignee <client-id> \
--role "Key Vault Secrets User" \
--scope "<key-vault-resource-id>"
備註
授與叢集受控識別的權限,最多可能需要 60 分鐘的時間才能散佈。
建立 Terraform 設定檔
Terraform 設定檔定義了 Terraform 所建立和管理的基礎架構。
建立一個名為
main.tf的檔案,並加入以下程式碼來定義 Terraform 版本並指定Azure提供者:terraform { required_version = ">= 1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 4.0" } } } provider "azurerm" { features {} }將以下程式碼加入
main.tf以建立Azure資源群組。 如有需要,歡迎更改資源群組的名稱和地點。resource "azurerm_resource_group" "example" { name = "aks-rg" location = "East US" }
使用 Terraform 建立一個由使用者指派的管理身份的 AKS 叢集
加入以下程式碼以 main.tf 建立使用者指派的管理身份及使用該身份的 AKS 叢集:
resource "azurerm_user_assigned_identity" "uai" {
name = "aks-user-identity"
resource_group_name = azurerm_resource_group.example.name
location = azurerm_resource_group.example.location
}
resource "azurerm_kubernetes_cluster" "user_assigned" {
name = "aks-user"
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
dns_prefix = "aksuser"
identity {
type = "UserAssigned"
identity_ids = [azurerm_user_assigned_identity.uai.id]
}
default_node_pool {
name = "system"
node_count = 1
vm_size = "Standard_DS2_v2"
}
}
使用 Terraform 為使用者指派受控識別新增角色指派
加入以下程式碼 main.tf ,即可為使用者指派的管理身份建立角色指派。 此範例將 金鑰保存庫 Secrets User 角色分配給使用者指派之受控身份,以授權其存取金鑰保存庫中的秘密。 角色指派的範圍是金鑰保存庫資源。
resource "azurerm_role_assignment" "user_assigned_key_vault_secrets_user" {
scope = azurerm_resource_group.example.id
role_definition_name = "Key Vault Secrets User"
principal_id = azurerm_user_assigned_identity.uai.principal_id
}
初始化 Terraform
在包含你 main.tf 檔案的目錄中,使用 terraform init 指令初始化 Terraform。 此命令會下載使用 Terraform 管理 Azure 資源所需的 Azure 提供者。
terraform init
建立 Terraform 執行計畫
使用 terraform plan 命令建立 Terraform 執行計畫。 這個指令會顯示 Terraform 會在你的 Azure 訂閱中建立或修改的資源。
terraform plan
套用 Terraform 組態
在確認執行計畫後,使用 terraform apply 指令套用 Terraform 設定。 此指令會建立或修改你Azure訂閱中 main.tf 檔案中定義的資源。
terraform apply
驗證 Terraform 部署情況
套用 Terraform 設定後,你可以使用 [az aks show][az-aks-show] 指令驗證部署,並搭配 --query 參數來過濾輸出並顯示身份資訊。 例如:
az aks show \
--name <cluster-name> \
--resource-group <resource-group> \
--query identity.type \
--output tsv
相關內容
欲了解更多關於AKS中受管理身份的資訊,請參閱以下文章:
Azure Kubernetes Service (AKS) 受管理身份概述 - 在 AKS 中使用系統指派的管理身份
- 在 AKS 中使用預先建立的 kubelet 管理身份
- 使用 kubelogin 驗證使用者以存取 Azure Kubernetes Service (AKS)