创建 Azure Kubernetes 服务 (AKS) 群集并将其配置为使用 Azure 门户中的虚拟节点
Azure 容器实例 (ACI) 和 Azure Kubernetes 服务 (AKS) 群集中运行的 Pod 之间的网络通信借助虚拟节点来实现。 若要提供此通信,应创建虚拟网络子网并分配委派的权限。 虚拟节点仅适用于使用高级网络 (Azure CNI) 创建的 AKS 群集。 默认情况下,AKS 群集是使用基本网络 (kubenet) 创建的。
本文介绍如何创建虚拟网络和子网,然后通过 Azure 门户部署使用高级网络的 AKS 群集。
注意
有关虚拟节点区域可用性和限制的概述,请参阅在 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
创建 AKS 群集
- 导航到 Azure 门户主页。
- 选择“创建资源”>“容器”。
- 在 Azure Kubernetes 服务 (AKS) 资源上,选择“创建”。
- 在“基本信息”页面上,配置以下选项:
- 项目详细信息:选择 Azure 订阅,然后选择或创建一个 Azure 资源组,例如 myResourceGroup。
- 群集详细信息:输入 Kubernetes 群集名称,例如 myAKSCluster。 选择 AKS 群集的区域和 Kubernetes 版本。
- 选择“下一步:节点池”,检查 *启用虚拟节点。
- 选择“查看 + 创建”。
- 验证完成后,选择“创建”。
默认情况下,此过程会创建一个托管群集标识,用于群集通信以及与其他 Azure 服务的集成。 有关详细信息,请参阅使用托管标识。 还可以使用服务主体作为群集标识。
此过程将群集配置为使用高级网络,使虚拟节点使用其自己的 Azure 虚拟网络子网。 子网具有委托的权限,可连接 AKS 群集之间的 Azure 资源。 如果还没有委托的子网,Azure 门户将创建并配置一个 Azure 虚拟网络和子网,与虚拟节点配合。
连接到群集
若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。
使用
az aks get-credentials
命令将kubectl
配置为连接到你的 Kubernetes 群集。 以下示例获取名为 myResourceGroup 的资源组中群集名称 myAKSCluster 的凭据:az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
使用
kubectl get nodes
验证与群集之间的连接。kubectl get nodes
以下示例输出显示了创建的单个 VM 节点以及名为 virtual-node-aci-linux 的虚拟 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
部署示例应用
在 Azure 本地 Shell 中,创建一个名为
virtual-node.yaml
的文件并复制到以下 YAML 中: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.azk8s.cn/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
YAML 定义 nodeSelector 和 toleration,允许在虚拟节点上计划 Pod。 系统从被委派用于虚拟节点的 Azure 虚拟网络子网中为该 Pod 分配了一个内部 IP 地址。
使用
kubectl apply
命令运行应用程序。kubectl apply -f virtual-node.yaml
使用
kubectl get pods
命令和-o wide
参数查看节点上计划的 Pod。kubectl get pods -o wide
以下示例输出显示了在
virtual-node-linux
节点上计划的virtual-node-helloworld
Pod。NAME READY STATUS RESTARTS AGE IP NODE virtual-node-helloworld-9b55975f-bnmfl 1/1 Running 0 4m 10.241.0.4 virtual-node-aci-linux
注意
如果使用存储在 Azure 容器注册表中的映像,请配置并使用 Kubernetes 机密。 虚拟节点的限制是无法使用集成的 Microsoft Entra 服务主体身份验证。 如果不使用机密,则在虚拟节点上计划的 Pod 将无法启动并报告错误 HTTP response status code 400 error code "InaccessibleImage"
。
测试虚拟节点 Pod
若要测试虚拟节点上运行的 Pod,请使用 Web 客户端浏览到演示应用程序。 由于为该 Pod 分配了一个内部 IP 地址,你可以从 AKS 群集上的另一个 Pod 便捷地测试连接性。
使用以下
kubectl run
命令创建测试 Pod 并向其附加终端会话。kubectl run -it --rm virtual-node-test --image=mcr.azk8s.cn/dotnet/runtime-deps:6.0
使用以下
apt-get
命令在 Pod 中安装curl
。apt-get update && apt-get install -y curl
使用以下
curl
命令访问 Pod 的地址,并提供你的内部 IP 地址。curl -L http://10.241.0.4
下面的精简示例输出显示了演示应用程序。
<html> <head> <title>Welcome to Azure Container Instances!</title> </head> [...]
使用
exit
关闭与测试 Pod 的终端会话,这也会删除该 Pod。exit
后续步骤
在本文中,你在虚拟节点上计划了一个 Pod,并为其分配了一个专用的内部 IP 地址。 如果你想的话,也可以改为创建服务部署,并通过负载均衡器或入口控制器将流量路由到 Pod。 有关详细信息,请参阅在 AKS 中创建基本入口控制器。
虚拟节点是 AKS 中缩放解决方案的一个组件。 有关缩放解决方案的详细信息,请参阅以下文章: