使用 Azure CLI 來建立和設定 Azure Kubernetes Service (AKS) 叢集以使用虛擬節點
虛擬節點會啟用 Azure 容器執行個體 (ACI) 與 AKS 叢集中所執行 Pod 之間的網路通訊。 為了提供此通訊功能,您建立虛擬網路子網路,並指派委派權限。 虛擬節點僅適用於使用「進階」網路 (Azure CNI) 建立的 AKS 叢集。 依預設,AKS 叢集是使用「基本」網路 (kubenet) 所建立。 本文說明如何建立虛擬網路和子網路,然後部署使用進階網路的 AKS 叢集。
本文顯示如何使用 Azure CLI 來建立和設定已啟用虛擬節點的虛擬網路資源與 AKS 叢集。
開始之前
重要
在搭配 AKS 使用虛擬節點之前,請先檢閱 AKS 虛擬節點的限制 與 ACI 的虛擬網路限制。 這些限制會影響 AKS 叢集和虛擬節點的位置、網路設定和其他設定的詳細資料。
您需要向您訂用帳戶註冊的 ACI 服務提供者。 您可以使用
az provider list
命令來檢查 ACI 提供者註冊的狀態。az provider list --query "[?contains(namespace,'Microsoft.ContainerInstance')]" -o table
Microsoft.ContainerInstance 提供者應該回報為 Registered,如以下範例輸出所示:
Namespace RegistrationState RegistrationPolicy --------------------------- ------------------- -------------------- Microsoft.ContainerInstance Registered RegistrationRequired
如果提供者顯示為 NotRegistered,則請使用
az provider register
來註冊提供者。az provider register --namespace Microsoft.ContainerInstance
如果使用 Azure CLI,則本文需要 Azure CLI 2.0.49 版或更新版本。 執行
az --version
以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。 您也可以使用 Azure Cloud Shell。
啟動 Azure Cloud Shell
Azure Cloud Shell 是免費的互動式殼層,可讓您用來執行本文中的步驟。 其已預先安裝和設定通用 Azure 工具。
若要開啟 Cloud Shell,請選取程式碼區塊右上角的 [試試看]。 您也可以移至 https://shell.azure.com/bash ,從另一個瀏覽器索引標籤啟動 Cloud Shell。 選取 [複製] 即可複製程式碼區塊,將它貼到 Cloud Shell 中,然後按 enter 鍵加以執行。
建立資源群組
Azure 資源群組是部署及管理 Azure 資源所在的邏輯群組。
使用
az group create
命令建立資源群組。az group create --name myResourceGroup --location eastus
建立虛擬網路
重要
虛擬節點需要自訂虛擬網路和相關聯的子網路。 其不能與與 AKS 叢集相同的虛擬網路建立關聯。
使用
az network vnet create
命令來建立虛擬網路。 下列範例會建立名為 myVnet 的虛擬網路 (位址首碼為 10.0.0.0/8),以及名為 myAKSSubnet 的子網路。 此子網路的位址首碼預設為 10.240.0.0/16。az network vnet create \ --resource-group myResourceGroup \ --name myVnet \ --address-prefixes 10.0.0.0/8 \ --subnet-name myAKSSubnet \ --subnet-prefix 10.240.0.0/16
使用
az network vnet subnet create
命令,以針對虛擬節點建立額外的子網路。 下列範例會建立名為 myVirtualNodeSubnet 且位址首碼為 10.241.0.0/16 的子網路。az network vnet subnet create \ --resource-group myResourceGroup \ --vnet-name myVnet \ --name myVirtualNodeSubnet \ --address-prefixes 10.241.0.0/16
建立具有受控識別的 AKS 叢集
使用
az network vnet subnet show
命令來取得子網路識別碼。az network vnet subnet show --resource-group myResourceGroup --vnet-name myVnet --name myAKSSubnet --query id -o tsv
使用
az aks create
命令來建立 AKS 叢集,並將<subnetId>
取代為上一個步驟中所取得的識別碼。 下列範例會建立名為 myAKSCluster 且有五個節點的叢集。az aks create \ --resource-group myResourceGroup \ --name myAKSCluster \ --node-count 5 \ --network-plugin azure \ --vnet-subnet-id <subnetId> \ --generate-ssh-keys
在數分鐘之後,該命令會完成並傳回關於節點的 JSON 格式資料。
如需受控識別的詳細資訊,請參閱使用受控識別。
啟用虛擬節點附加元件
注意
如果您已建立使用 Azure CNI 進行進階網路的 Azure Kubernetes Service 叢集,您應該能夠使用 CLI 將虛擬節點啟用為附加元件。
使用
az aks enable-addons
命令來啟用虛擬節點。 下列範例會使用上一個步驟所建立且名為 myVirtualNodeSubnet 的子網路。az aks enable-addons \ --resource-group myResourceGroup \ --name myAKSCluster \ --addons virtual-node \ --subnet-name myVirtualNodeSubnet
連線至叢集
使用
az aks get-credentials
命令,設定kubectl
連線到 Kubernetes 叢集。 此步驟會下載憑證並設定 Kubernetes CLI 以供使用。az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
使用
kubectl get
命令來驗證對您叢集的連線,這會傳回叢集節點清單。kubectl get nodes
下列範例輸出會顯示已建立單一 VM 節點和適用於 Linux 的虛擬節點 virtual-node-aci-linux:
NAME STATUS ROLES AGE VERSION virtual-node-aci-linux Ready agent 28m v1.11.2 aks-agentpool-14693408-0 Ready agent 32m v1.11.2
部署範例應用程式
建立名為
virtual-node.yaml
的檔案,然後將下列 YAML 複製進來。 YAML 會定義 nodeSelector 和 toleration,以在節點上排程容器。apiVersion: apps/v1 kind: Deployment metadata: name: aci-helloworld spec: replicas: 1 selector: matchLabels: app: aci-helloworld template: metadata: labels: app: aci-helloworld spec: containers: - name: aci-helloworld image: mcr.microsoft.com/azuredocs/aci-helloworld ports: - containerPort: 80 nodeSelector: kubernetes.io/role: agent beta.kubernetes.io/os: linux type: virtual-kubelet tolerations: - key: virtual-kubelet.io/provider operator: Exists - key: azure.com/aci effect: NoSchedule
使用
kubectl apply
命令來執行應用程式。kubectl apply -f virtual-node.yaml
搭配使用
kubectl get pods
命令與-o wide
引數來取得 Pod 清單和已排程的節點。kubectl get pods -o wide
Pod 排程於虛擬節點 virtual-node-aci-linux,如下列範例輸出所示:
NAME READY STATUS RESTARTS AGE IP NODE aci-helloworld-9b55975f-bnmfl 1/1 Running 0 4m 10.241.0.4 virtual-node-aci-linux
Pod 會從 Azure 虛擬網路的子網路 (為搭配使用虛擬節點而委派) 獲派內部 IP 位址。
注意
如果您使用儲存在 Azure Container Registry 中的映像,請設定並使用 Kubernetes 祕密。 虛擬節點的目前限制是您無法使用整合式 Microsoft Entra 服務主體驗證。 如果您未使用祕密,已在虛擬節點上排程的 Pod 就無法啟動並會回報錯誤 HTTP response status code 400 error code "InaccessibleImage"
。
測試虛擬節點 Pod
使用 Web 用戶端瀏覽至示範應用程式,以測試虛擬節點上執行的 Pod。 由於 Pod 會獲派內部 IP 位址,因此您可以快速地從 AKS 叢集上其他 Pod 測試此連線。
使用下列
kubectl run -it
命令來建立測試 Pod,並將終端機工作階段與其連結。kubectl run -it --rm testvk --image=mcr.microsoft.com/dotnet/runtime-deps:6.0
使用
apt-get
,以在 Pod 中安裝curl
。apt-get update && apt-get install -y curl
使用
curl
來存取 Pod 的位址,例如 http://10.241.0.4。 提供前述kubectl get pods
命令中您自己的內部 IP 位址。curl -L http://10.241.0.4
示範應用程式會隨即顯示,如下列簡要範例輸出所示:
<html> <head> <title>Welcome to Azure Container Instances!</title> </head> [...]
使用
exit
來關閉測試 Pod 的終端機工作階段。 當您的工作階段結束時,會刪除 Pod。
移除虛擬節點
使用
kubectl delete
命令,以刪除虛擬節點上執行的aci-helloworld
Pod。kubectl delete -f virtual-node.yaml
使用
az aks disable-addons
命令來停用虛擬節點。az aks disable-addons --resource-group myResourceGroup --name myAKSCluster --addons virtual-node
使用下列命令來移除虛擬網路資源和資源群組。
# Change the name of your resource group, cluster and network resources as needed RES_GROUP=myResourceGroup AKS_CLUSTER=myAKScluster AKS_VNET=myVnet AKS_SUBNET=myVirtualNodeSubnet # Get AKS node resource group NODE_RES_GROUP=$(az aks show --resource-group $RES_GROUP --name $AKS_CLUSTER --query nodeResourceGroup --output tsv) # Get network profile ID NETWORK_PROFILE_ID=$(az network profile list --resource-group $NODE_RES_GROUP --query "[0].id" --output tsv) # Delete the network profile az network profile delete --id $NETWORK_PROFILE_ID -y # Grab the service association link ID SAL_ID=$(az network vnet subnet show --resource-group $RES_GROUP --vnet-name $AKS_VNET --name $AKS_SUBNET --query id --output tsv)/providers/Microsoft.ContainerInstance/serviceAssociationLinks/default # Delete the service association link for the subnet az resource delete --ids $SAL_ID --api-version 2021-10-01 # Delete the subnet delegation to Azure Container Instances az network vnet subnet update --resource-group $RES_GROUP --vnet-name $AKS_VNET --name $AKS_SUBNET --remove delegations
下一步
在本文中,您已在虛擬節點上進行 Pod 排程,並獲派私人的內部 IP 位址。 您可以改為建立服務部署,並透過負載平衡器或輸入控制器將流量路由到您的 Pod。 如需詳細資訊,請參閱在 AKS 中建立基本的連入控制器。
虛擬節點往往是 AKS 中調整解決方案的一個元件。 如需有關調整解決方案的詳細資訊,請參閱下列文章: