在 Azure Kubernetes Service (AKS) (預覽版) 中使用虛擬節點 v2

虛擬節點 v2 是改良的虛擬節點堆疊,其藉由在 Azure 容器執行個體(ACI) 中的無伺服器計算上執行 Pod,將 AKS 延伸至以 VM 為基礎的節點之外。 工作負載會在幾秒內爆量至 ACI,無須等待新節點佈建完成,而且您只需為 Pod 執行期間所使用的計算付費。 Virtual Nodes v2 是以 AKS 叢集擴充套件的形式提供。

Important

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

支援

  • 初始容器
  • 主機別名
  • 容器生命週期掛鉤 (postStart 和 preStop)
  • kubectl exec搭配引數
  • 永續性磁碟區和 PVC (僅限 Azure 檔案儲存體)
  • VNet 對等互連
  • 受 NSG 控制的輸出
  • 用於輸出的 NAT 閘道器
  • 機密容器
  • 每個虛擬節點最多可有 200 個 Pod

Limitations

不支援下列功能:

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

資源可用性和配額限制

虛擬節點 v2 已在所有 Azure 公用雲端區域中推出,只要 Azure 容器執行個體支援 VNet SKU 即可使用。 如需詳細資訊,請參閱ACI 的資源可用性&與配額限制。

Prerequisites

  • 節點子網路模式中的 Azure CNI
  • Calico 或無作為網路原則
  • 工作負載身分識別已啟用
  • 至少一個節點集區,其 VM 大小為 4+ 個 vCPUs 和 16+ GiB 的記憶體。 每個虛擬節點會在叢集中的 AKS 節點上保留約 3 個 vCPUs 和 12 GiB 的記憶體,因此請確保您的節點有足夠的資源。
  • k8s-extension (1.8 版或以上版本)
  • kubectl1.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 以索引鍵-值對應形式新增至基礎結構 Pod 的註解。
nodeSelector 用來選取託管基礎結構和准入控制器 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 Container Registry 存取

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

使用擴充功能受控身分識別

將AcrPull角色授與為擴充功能產生的受控身分識別。 此角色會授與在擴充功能虛擬節點上執行的所有 Pod 存取權,使其無須額外的 Pod 設定,即可從登錄提取映像。 您必須具備在登錄上建立角色指派的權限。

取得擴充功能受控身分識別的主體識別碼:

$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

取得容器登錄的資源識別碼:

$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 認證。

將工作負載部署至虛擬節點 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

確認 Pod 正在執行。

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>

下一步