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 型。

下面这张图把创建过程中最关键的“输入参数—资源产出—验证点”关系集中呈现,便于在动手前对照检查。

AKS 生产级集群创建:参数决策与资源产出关系 创建输入参数 区域 / 可用区 East US 2 · zones 1,2,3 网络模型 Azure CNI Overlay 身份模型 系统 + 用户托管标识 节点池划分 system / general / gpu 版本与升级 自动升级 · 节点镜像 监控与日志 Container Insights 三种创建方式 Azure Portal 适合首次探索、快速验证 可视化选择网络与节点池 生成 ARM 模板可导出 Azure CLI 适合脚本化、可重复创建 az aks create 一条命令 参数即文档,便于审计 Bicep 适合平台工程、GitOps 声明式、可版本控制 支持模块化与参数文件 资源产出与验证点 托管资源组 MC_* 节点 VMSS、LB、NSG、路由表 控制平面 FQDN API Server 私有/公开端点 节点池就绪状态 kubectl get nodes 全部 Ready 系统 Pod 健康 coredns、metrics-server 运行中 身份与权限验证 kubectl get nodes 无 401/403

二、用 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。

四、创建后的关键验证清单

集群创建成功不等于可用。建议按以下顺序验证,任何一步失败都先解决再继续:

  1. 节点就绪:kubectl get nodes 全部 Ready,且节点分布在三个可用区。
  2. 系统组件:kubectl get pods -n kube-system 中 coredns、metrics-server、konnectivity-agent 均为 Running。
  3. 身份连通:kubectl auth can-i get nodes 返回 yes,说明托管标识与 RBAC 绑定生效。
  4. 网络连通:部署一个测试 Pod,执行 kubectl exec -it test -- nslookup kubernetes.default,确认 DNS 解析正常。
  5. 监控接入:在 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 流水线。无论走哪条路径,创建阶段确定的网络模型、身份模型与节点池划分,都会直接决定集群后续的可扩展性与可运维性。