你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
虚拟节点 v2 是一个改进的虚拟节点堆栈,它通过在 Azure 容器实例 (ACI) 中的无服务器计算上运行 Pod,将 AKS 扩展到基于 VM 的节点之外。 工作负荷在数秒内突发到 ACI,无需等待预配新节点,只需为运行 Pod 时使用的计算付费。 虚拟节点 v2 作为 AKS 群集扩展提供。
Important
AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
支持
- 初始化容器
- 主机别名
- 容器生命周期挂钩(
postStart和preStop) -
kubectl execwith 参数 - 永久性卷和 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 或更高版本
-
kubectl1.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/archbeta.kubernetes.io/instance-typebeta.kubernetes.io/osfailure-domain.beta.kubernetes.io/regionfailure-domain.beta.kubernetes.io/zonekubernetes.io/archkubernetes.io/hostnamekubernetes.io/osnode.kubernetes.io/instance-typetopology.kubernetes.io/regiontopology.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>