Use Virtual Nodes v2 in Azure Kubernetes Service (AKS) (preview)

Virtual Nodes v2 是一個改良版的虛擬節點堆疊,透過在 Azure 容器執行個體(ACI)中以無伺服器運算方式執行 pod,將 AKS 擴展至虛擬機基礎節點之外。 工作負載能在幾秒內爆發到 ACI,無需等待新節點配置,且你只需支付在 pod 運行時使用的運算費用。 Virtual Nodes v2 是以 AKS 叢集擴充套件的形式提供。

Important

AKS 預覽功能以自助方式提供,並採選擇加入制。 預覽版本係依「現狀」及「可用情況」提供,且不適用於服務等級協定與有限保固。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

支援

  • 初始容器
  • 宿主別名
  • 容器生命週期掛鉤 (postStart 和 preStop)
  • kubectl exec 有論證
  • 持久磁碟與PVC(僅限Azure 檔案儲存體)
  • VNet 對等互連
  • NSG控制的出口
  • NAT 閘道器用於出口
  • 機密容器
  • 每個虛擬節點最多可有 200 個 Pod

Limitations

不支援下列功能:

  • Windows 容器
  • DaemonSet
  • 埠轉發
  • IPv6
  • API 伺服器授權的IP範圍
  • Azure CNI 覆蓋層
  • Cilium 或 NPM 作為網路政策
  • 自帶(BYO)虛擬網路
  • 每個叢集中可有多個擴充功能執行個體
  • 待命集區

資源可用性與配額限制

在 Azure 容器執行個體 支援 VNet SKU 的所有 Azure 公有雲區域中,皆可使用 Virtual Nodes v2。 欲了解更多資訊,請參閱 ACI的資源可用性與配額限制。

Prerequisites

  • Azure CNI in node-subnet mode
  • 網路政策是用 Calico 還是不做
  • 啟用工作負載身份
  • 至少有一個節點池,VM 大小為 4+ vCPU 和 16+ GiB 記憶體。 每個虛擬節點在叢集中的 AKS 節點上保留約 3 顆 vCPU 和 12 GiB 記憶體,確保節點有足夠的資源。
  • K8S擴充版 1.8 或更高版本
  • kubectl 1.30 或更高版本

註冊 ACI 資源提供者:

az provider register --namespace Microsoft.ContainerInstance

Note

如果您在擴充功能啟用過程中的任何階段遇到錯誤,請執行以下指令。

az provider register --namespace Microsoft.KubernetesConfig

啟用虛擬節點 v2

安裝擴充功能:

az k8s-extension create \
    --name <extension-name> \
    --extension-type Microsoft.virtualnodes \
    --cluster-name <cluster-name> \
    --resource-group <resource-group> \
    --cluster-type managedClusters \
    --configuration-settings replicaCount=1   # specifies number of virtual nodes - optional

設定擴充功能設定

建立與更新操作支援以下設定。

組態設定 Description
replicaCount 虛擬節點數量。
admissionControllerReplicaCount 准入控制器 Pod 的數量。
podAnnotations 作為鍵值映射,新增於基礎設施莢艙上的註解。
nodeSelector 用於選取裝載基礎結構 Pod 和准入控制器 Pod 的 AKS 節點標籤。
tolerations 套用於基礎架構和准入控制器 Pod 的容忍。
affinity 額外的親和性設定會與必要的 AKS 親和性規則合併。
zones 部署 Pod 的可用區,以分號分隔。
nodeLabels 虛擬節點上以逗號分隔 key=value 的對數加標。

允許的 kubernetes.io 標籤如下:

  • beta.kubernetes.io/arch
  • beta.kubernetes.io/instance-type
  • beta.kubernetes.io/os
  • failure-domain.beta.kubernetes.io/region
  • failure-domain.beta.kubernetes.io/zone
  • kubernetes.io/arch
  • kubernetes.io/hostname
  • kubernetes.io/os
  • node.kubernetes.io/instance-type
  • topology.kubernetes.io/region
  • topology.kubernetes.io/zone

請驗證擴充功能:

az k8s-extension show \
    --name <extension-name> \
    --cluster-type managedClusters \
    --cluster-name <cluster-name> \
    --resource-group <resource-group>

確認 provisioningState 為 Succeeded。 它可以維持 Pending 幾分鐘。

確認擴充功能 Pod 是否在 vn-system 命名空間中執行:

kubectl get pods --namespace vn-system

更新擴充功能

az k8s-extension update --name <extension-name> --cluster-name <aks-cluster-name> --resource-group <aks-resource-group> --cluster-type managedClusters

Note

參數 --auto-upgrade-mode 支持 none、、 patch或 compatible。 若要使用 --version 釘選特定的擴充功能版本,請將 --auto-upgrade-mode 設為 none。

Azure 容器登錄存取

若要從私人 Azure Container Registry (ACR) 提取映像,請使用擴充功能受控識別或 Kubernetes 映像提取密碼。

使用擴充功能受控識別

將該角色授予 AcrPull 為擴充功能產生的管理身份。 此角色允許所有在擴充功能虛擬節點上運行的 pod 能夠從登錄檔拉取映像檔,無需額外配置 pod。 您必須獲得權限才能在登錄上建立角色指派。

取得擴充管理身份的主 ID:

$extensionPrincipalId = az k8s-extension show --name <extension-name> --cluster-name <aks-cluster-name> --resource-group <aks-resource-group> --cluster-type managedClusters --query aksAssignedIdentity.principalId --output tsv

取得容器登錄的資源 ID:

$acrId = az acr show --name <acr-name> --resource-group <acr-resource-group> --query id --output tsv

在登錄範圍內將角色指派 AcrPull 給擴充管理身份:

az role assignment create --assignee-object-id $extensionPrincipalId --assignee-principal-type ServicePrincipal --role AcrPull --scope $acrId

等幾分鐘讓角色指派傳播完畢,再部署從登錄檔拉映像的工作負載。

使用圖片拉取秘密

相關說明請參見 Kubernetes Pull Secret for ACR 認證。

將工作負載部署到 Virtual Nodes v2

利用 virtualization: virtualnode2 節點選擇器和 virtual-kubelet.io/provider 容忍度在虛擬節點上排程 pod:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
        - name: hello
          image: mcr.microsoft.com/azuredocs/aci-helloworld
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: "1"
              memory: 1Gi
      nodeSelector:
        virtualization: virtualnode2
        kubernetes.io/os: linux
      tolerations:
        - key: virtual-kubelet.io/provider
          operator: Exists
          effect: NoSchedule

將清單存為 demo.yaml,然後套用。

kubectl apply -f demo.yaml

確認艙體是否運作。

kubectl get pods -l app=demo -o wide

停用虛擬節點 v2

Warning

當你停用虛擬節點擴充功能時,AKS 叢集會斷開與支援的 Azure 容器執行個體 容器群組的連結。 為避免孤兒實例持續執行並產生費用,請在停用擴充功能前刪除虛擬節點上正在運行的工作負載。

刪除擴充功能並清理虛擬節點資源。

az k8s-extension delete \
    --name <extension-name> \
    --cluster-name <cluster-name> \
    --resource-group <resource-group> \
    --cluster-type managedClusters
kubectl delete node <virtual-node-name>

下一步