使用 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 叢集相同的虛擬網路建立關聯。

  1. 使用 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
    
  2. 使用 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 叢集

  1. 使用 az network vnet subnet show 命令來取得子網路識別碼。

    az network vnet subnet show --resource-group myResourceGroup --vnet-name myVnet --name myAKSSubnet --query id -o tsv
    
  2. 使用 az aks create 命令來建立 AKS 叢集,並將 <subnetId> 取代為上一個步驟中所取得的識別碼。 下列範例會建立名為 myAKSCluster 且有五個節點的叢集。

    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --node-count 5 \
        --network-plugin azure \
        --vnet-subnet-id <subnetId>
    

    在數分鐘之後,該命令會完成並傳回關於節點的 JSON 格式資料。

如需受控識別的詳細資訊,請參閱使用受控識別

啟用虛擬節點附加元件

  • 使用 az aks enable-addons 命令來啟用虛擬節點。 下列範例會使用上一個步驟所建立且名為 myVirtualNodeSubnet 的子網路。

    az aks enable-addons \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --addons virtual-node \
        --subnet-name myVirtualNodeSubnet
    

連線至叢集

  1. 使用 az aks get-credentials 命令,設定 kubectl 連線到 Kubernetes 叢集。 此步驟會下載憑證並設定 Kubernetes CLI 以供使用。

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  2. 使用 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
    

部署範例應用程式

  1. 建立名為 virtual-node.yaml 的檔案,然後將下列 YAML 複製進來。 YAML 會定義 nodeSelectortoleration,以在節點上排程容器。

    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
    
  2. 使用 kubectl apply 命令來執行應用程式。

    kubectl apply -f virtual-node.yaml
    
  3. 搭配使用 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

  1. 使用 Web 用戶端瀏覽至示範應用程式,以測試虛擬節點上執行的 Pod。 由於 Pod 會獲派內部 IP 位址,因此您可以快速地從 AKS 叢集上其他 Pod 測試此連線。

  2. 使用下列 kubectl run -it 命令來建立測試 Pod,並將終端機工作階段與其連結。

    kubectl run -it --rm testvk --image=mcr.microsoft.com/dotnet/runtime-deps:6.0
    
  3. 使用 apt-get,以在 Pod 中安裝 curl

    apt-get update && apt-get install -y curl
    
  4. 使用 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>
    [...]
    
  5. 使用 exit 來關閉測試 Pod 的終端機工作階段。 當您的工作階段結束時,會刪除 Pod。

移除虛擬節點

  1. 使用 kubectl delete 命令,以刪除虛擬節點上執行的 aci-helloworld Pod。

    kubectl delete -f virtual-node.yaml
    
  2. 使用 az aks disable-addons 命令來停用虛擬節點。

    az aks disable-addons --resource-group myResourceGroup --name myAKSCluster --addons virtual-node
    
  3. 使用下列命令來移除虛擬網路資源和資源群組。

    # 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 中調整解決方案的一個元件。 如需有關調整解決方案的詳細資訊,請參閱下列文章: