2. AKS集群创建实战
创建 AKS 集群并不只是“点一下创建按钮”。生产级集群的差异,几乎全部体现在创建阶段所做的选择上:节点池如何划分、网络走 kubenet 还是 Azure CNI、身份用托管标识还是服务主体、控制平面是否启用可用区、节点镜像与自动升级策略如何设定。这些参数一旦落地,后期修改成本很高,因此本节把创建过程拆成“先想清楚、再动手、最后验证”的完整链路,并给出三种创建方式的适用场景。
一、创建前必须确定的四组参数
在打开 Portal 之前,建议先在一张纸上写下四组决策,它们决定了后续所有命令和模板的形态。
- 区域与可用性:生产集群应选择支持可用区的区域,例如 East US 2、West Europe。控制平面默认跨可用区部署,节点池则通过
--zones 1 2 3显式指定。 - 网络模型:kubnet 节省 IP 但需路由表;Azure CNI 让 Pod 直接获得 VNet IP,适合与防火墙、NSG、私有 DNS 深度集成的场景。生产环境更推荐 Azure CNI Overlay,兼顾 IP 效率与可观测性。
- 身份模型:控制平面使用系统分配的托管标识,kubelet 使用用户分配的托管标识,避免服务主体密钥过期带来的运维中断。
- 节点池划分:系统节点池只跑关键插件,用户节点池按工作负载类型拆分,例如通用型、内存优化型、GPU 型。
下面这张图把创建过程中最关键的“输入参数—资源产出—验证点”关系集中呈现,便于在动手前对照检查。
二、用 Azure CLI 创建集群的完整命令
CLI 方式最适合把创建过程固化成可重复执行的脚本。下面给出一组教学示例参数,区域选 East US 2,资源组 rg-aks-prod,集群名 aks-prod-01,采用 Azure CNI Overlay 与托管标识。
# 1. 创建资源组
az group create --name rg-aks-prod --location eastus2
# 2. 创建集群(系统节点池 3 节点,跨 3 个可用区)
az aks create \
--resource-group rg-aks-prod \
--name aks-prod-01 \
--location eastus2 \
--kubernetes-version 1.29.2 \
--node-count 3 \
--nodepool-name systempool \
--node-vm-size Standard_D4s_v5 \
--zones 1 2 3 \
--network-plugin azure \
--network-plugin-mode overlay \
--pod-cidr 192.168.0.0/16 \
--service-cidr 10.0.0.0/16 \
--dns-service-ip 10.0.0.10 \
--enable-managed-identity \
--assign-identity \
--enable-cluster-autoscaler \
--min-count 3 --max-count 6 \
--enable-addons monitoring \
--generate-ssh-keys
# 3. 添加用户节点池(内存优化型,用于业务负载)
az aks nodepool add \
--resource-group rg-aks-prod \
--cluster-name aks-prod-01 \
--name userpool \
--node-count 2 \
--node-vm-size Standard_E4s_v5 \
--zones 1 2 3 \
--mode User \
--labels workload=general \
--node-taints ""
执行完成后,用 az aks get-credentials --resource-group rg-aks-prod --name aks-prod-01 拉取 kubeconfig,再运行 kubectl get nodes -o wide。预期看到 5 个节点(3 个 systempool + 2 个 userpool),状态均为 Ready,且 INTERNAL-IP 落在 Pod CIDR 或节点子网范围内。若出现 NotReady,优先检查节点子网是否还有可用 IP、NSG 是否放行 kubelet 与 API Server 通信。
三、用 Bicep 声明式创建
Bicep 的价值在于把上述参数变成可版本控制的代码。下面是一个精简但可运行的 Bicep 片段,重点展示托管标识、网络配置与节点池的声明方式。
param clusterName string = 'aks-prod-01'
param location string = 'eastus2'
resource aks 'Microsoft.ContainerService/managedClusters@2024-02-01' = {
name: clusterName
location: location
identity: {
type: 'SystemAssigned'
}
properties: {
kubernetesVersion: '1.29.2'
dnsPrefix: 'aksprod01'
agentPoolProfiles: [
{
name: 'systempool'
mode: 'System'
count: 3
vmSize: 'Standard_D4s_v5'
availabilityZones: ['1','2','3']
enableAutoScaling: true
minCount: 3
maxCount: 6
}
]
networkProfile: {
networkPlugin: 'azure'
networkPluginMode: 'overlay'
podCidr: '192.168.0.0/16'
serviceCidr: '10.0.0.0/16'
dnsServiceIP: '10.0.0.10'
}
}
}
部署命令为 az deployment group create --resource-group rg-aks-prod --template-file main.bicep。Bicep 的优势是幂等:重复执行不会重复创建资源,只会把集群状态收敛到模板描述的目标状态。对于多环境(dev/staging/prod),只需替换参数文件中的 clusterName、nodeCount 与 vmSize。
四、创建后的关键验证清单
集群创建成功不等于可用。建议按以下顺序验证,任何一步失败都先解决再继续:
- 节点就绪:
kubectl get nodes全部 Ready,且节点分布在三个可用区。 - 系统组件:
kubectl get pods -n kube-system中 coredns、metrics-server、konnectivity-agent 均为 Running。 - 身份连通:
kubectl auth can-i get nodes返回 yes,说明托管标识与 RBAC 绑定生效。 - 网络连通:部署一个测试 Pod,执行
kubectl exec -it test -- nslookup kubernetes.default,确认 DNS 解析正常。 - 监控接入:在 Azure Portal 的 AKS 资源页查看 Insights,确认容器日志与指标已开始上报。
--enable-private-cluster),API Server 没有公网端点,必须在同一 VNet 内的跳板机或通过 az aks command invoke 执行 kubectl 命令。创建前先规划好私有 DNS 区域与 VNet 链接。--generate-ssh-keys 生成的默认密钥对长期运维。应在创建时通过 --ssh-key-value 指定受控的公钥,并禁用密码登录。节点池的 --node-taints 与 --labels 一旦设置,后续调度策略都依赖它们,建议在创建阶段就按工作负载类型规划好。三种方式并非互斥:常见做法是先用 Portal 快速验证参数组合,再用 CLI 固化为脚本,最后用 Bicep 纳入平台工程的 GitOps 流水线。无论走哪条路径,创建阶段确定的网络模型、身份模型与节点池划分,都会直接决定集群后续的可扩展性与可运维性。