2. AKS架构与核心组件

Azure Kubernetes Service(AKS)并不是把原生 Kubernetes 原封不动地搬到云上,而是把集群拆成“托管部分”和“用户自管部分”两层。理解这条分界线,是后续做节点池规划、网络选型、身份接入和故障排查的前提。本节围绕控制平面托管机制、节点池类型、kubelet 与容器运行时、Azure CNI 与 kubenet 网络模型、集群身份与 Azure AD 集成五条主线展开。

控制平面托管机制

在 AKS 中,API Server、etcd、Scheduler、Controller Manager 以及 cloud-controller-manager 由 Azure 托管,运行在微软管理的区域资源中,用户不直接登录这些节点,也不为它们打补丁或升级。用户侧真正持有的是节点池中的工作节点(Agent Node),以及节点上的 kubelet、容器运行时和网络组件。控制平面与节点之间通过 Konnectivity 隧道通信:kubelet 主动向 API Server 建立反向连接,因此节点不需要暴露公网入站端口,这也是 AKS 能保持节点私密性的关键设计。

托管不等于不可观测。控制平面日志(kube-apiserver、kube-controller-manager、kube-scheduler、cluster-autoscaler 等)可以通过诊断设置导出到 Log Analytics 工作区;API Server 的访问则通过 az aks get-credentials 获取 kubeconfig 后由 kubectl 完成。控制平面有独立的 SLA,但用户仍需为节点池的可用性、Pod 的调度策略和网络策略负责。一个常见的误解是“控制平面托管了,集群就高可用”——实际上如果只有一个节点池且副本数为 1,业务依然会因节点故障中断。

节点池类型:系统节点池与用户节点池

AKS 把节点池分为两类。系统节点池(System Node Pool)承载 CoreDNS、metrics-server、konnectivity-agent 等关键系统 Pod,必须至少存在一个,且建议至少 2 个节点、使用 Standard_DS2_v2 及以上规格,并通过污点 CriticalAddonsOnly=true:NoSchedule 限制普通业务 Pod 调度。用户节点池(User Node Pool)承载业务负载,可以按需创建多个,支持不同的 VM 规格、操作系统(Linux/Windows)、节点镜像和标签。

节点池还支持可用性区域分布、自动扩缩容(cluster autoscaler)和节点镜像升级。例如创建一个跨三个可用区、开启自动扩缩容的用户节点池:

az aks nodepool add \
  --resource-group rg-aks-prod \
  --cluster-name aks-prod \
  --name userpool01 \
  --node-count 3 \
  --min-count 3 --max-count 12 \
  --enable-cluster-autoscaler \
  --zones 1 2 3 \
  --node-vm-size Standard_D4s_v5 \
  --labels workload=general \
  --mode User

执行后可用 kubectl get nodes -L topology.kubernetes.io/zone 观察节点是否均匀落在三个可用区。若某个可用区节点数为 0,说明该区域容量受限或配额不足,需要检查订阅配额。

kubelet 与容器运行时

每个工作节点上运行 kubelet,它从 API Server 接收 PodSpec,调用容器运行时创建容器,并周期性上报节点状态与资源使用。AKS 默认使用 containerd 作为容器运行时(早期 Docker 运行时已弃用),containerd 通过 CRI 接口与 kubelet 交互,镜像拉取、容器生命周期、日志轮转都由它负责。节点上还可以看到 kube-proxy(负责 Service 转发)和 CNI 插件进程。

kubelet 的关键参数包括 --max-pods(单节点最大 Pod 数)、--node-status-update-frequency 和资源预留(kube-reserved、system-reserved、eviction-hard)。AKS 会根据 VM 规格自动设置 max-pods,例如 Standard_D4s_v5 在 Azure CNI 下默认约 30 个 Pod,在 kubenet 下可到 110 个。如果业务需要更高密度,可以在创建节点池时通过 --max-pods 调整,但要注意 IP 消耗和节点稳定性。

Azure CNI 与 kubenet 网络模型

AKS 提供两种主要网络模型。kubenet 是“覆盖式”模型:节点从 VNet 子网获得一个 IP,Pod 使用独立的内部网段(如 10.244.0.0/16),通过节点上的路由和 NAT 访问外部,Pod 之间跨节点通信依赖 UDR 或 Azure 路由表。它的优点是节省 VNet IP,缺点是 Pod IP 不可直接路由、需要额外跳数、不支持 Windows 节点池和网络策略的部分能力。

Azure CNI 则让每个 Pod 直接从 VNet 子网分配 IP,Pod 与 VNet 内其他资源(VM、数据库、负载均衡)可直接互通,支持网络策略、Windows 节点池和更细粒度的控制。代价是 IP 消耗大:若子网为 /24(254 个可用 IP),节点数 10、每节点 30 个 Pod,则需 10×(1+30)=310 个 IP,已超出 /24 容量,必须规划更大的子网或使用 Azure CNI Overlay。选择时可参考下表:

对比项kubenetAzure CNI
Pod IP 来源集群内部网段VNet 子网
Pod 可直接路由否是
IP 消耗低高
Windows 节点池不支持支持
网络策略有限完整

集群身份与 Azure AD 集成原理

AKS 涉及两类身份:控制平面身份(用于创建和管理 Azure 资源,如负载均衡器、路由表、磁盘)和 kubelet 身份(节点拉取 ACR 镜像、访问 Key Vault 等)。控制平面身份推荐使用托管标识(Managed Identity),避免服务主体密钥过期。kubelet 身份同样使用托管标识,并通过节点池的 --assign-identity 或 --enable-managed-identity 配置。

Azure AD 集成解决的是“谁能访问集群”的问题。启用 AKS-managed Azure AD 后,用户通过 az aks get-credentials 获取 kubeconfig,kubectl 请求携带 Azure AD token,API Server 校验 token 并映射到 Kubernetes 的 RBAC 角色。管理员可以用 kubectl create rolebinding 把 Azure AD 用户或组绑定到 ClusterRole,实现“用 Azure AD 账号登录、用 RBAC 授权”的闭环。例如把组 aks-dev-team 绑定为命名空间 dev 的编辑者:

kubectl create rolebinding dev-edit \
  --clusterrole=edit \
  --group="<Azure AD Group Object ID>" \
  --namespace=dev

执行后,该组成员使用自己的 Azure AD 账号执行 kubectl get pods -n dev 应成功,而访问 kube-system 应被拒绝。若返回 403,需检查组对象 ID 是否正确、RBAC 绑定是否生效,以及 kubeconfig 是否使用了正确的用户上下文。

AKS 架构与核心组件关系图 Azure AD 用户 / 组 / 托管标识 Token 签发与校验 控制平面(Azure 托管) API Server · etcd · Scheduler Controller Manager · Cloud Controller Konnectivity Server 节点池(用户自管) System Node Pool(系统 Pod) User Node Pool(业务负载) kubelet · containerd · kube-proxy CNI 插件(Azure CNI / kubenet) 可用性区域 1 / 2 / 3 Azure VNet 子网(节点 + Pod IP) Azure CNI:Pod 直连 VNet kubenet:Pod 内部网段 UDR / NAT / 路由表 Azure 资源 ACR 镜像仓库 Key Vault · 磁盘 · LB Token Konnectivity 隧道 CNI 托管标识 RBAC 授权闭环 Azure AD 用户/组 → RoleBinding → ClusterRole 蓝:身份认证 灰:控制/数据通道 红:Azure 资源访问

把上述五部分串起来看:控制平面托管让用户免于运维 etcd 和 API Server,但节点池、kubelet 参数、CNI 选型和身份绑定仍需用户决策。实际落地时,建议先确定网络模型(是否用 Azure CNI Overlay 以缓解 IP 压力),再规划系统节点池与用户节点池的规格和可用区,最后启用托管标识与 Azure AD 集成,并用 RBAC 把权限收敛到命名空间级别。这样集群在扩容、升级和故障时才有清晰的边界和可预期的行为。