你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。

在 Azure Kubernetes 服务 (AKS) 中使用虚拟节点 v2(预览版)

虚拟节点 v2 是一个改进的虚拟节点堆栈,它通过在 Azure 容器实例 (ACI) 中的无服务器计算上运行 Pod,将 AKS 扩展到基于 VM 的节点之外。 工作负荷在数秒内突发到 ACI,无需等待预配新节点,只需为运行 Pod 时使用的计算付费。 虚拟节点 v2 作为 AKS 群集扩展提供。

Important

AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

支持

  • 初始化容器
  • 主机别名
  • 容器生命周期挂钩(postStart 和 preStop)
  • kubectl exec with 参数
  • 永久性卷和 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 或 none 作为网络策略
  • 已启用工作负荷标识
  • 至少有一个节点池,VM 大小为 4+ vCPU,内存为 16+ GiB。 每个虚拟节点在群集中的 AKS 节点上保留大约 3 个 vCPU 和 12 GiB 的内存,因此请确保节点有足够的资源。
  • k8s-extension 版本 1.8 或更高版本
  • kubectl 1.30 或更高版本

注册 ACI 资源提供程序:

az provider register --namespace Microsoft.ContainerInstance

注释

如果在启用扩展的任何阶段出错,请运行以下命令。

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

注释

参数--auto-upgrade-mode支持none或 patchcompatible。 若要使用 --version固定特定扩展版本,请设置为 --auto-upgrade-modenone。

Azure 容器注册表访问权限

若要从专用Azure 容器注册表(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

等待几分钟,角色分配在部署从注册表拉取映像的工作负荷之前传播。

使用镜像拉取密钥

有关说明,请参阅 用于 ACR 身份验证的 Kubernetes 拉取机密。

将工作负荷部署到虚拟节点 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>

后续步骤