4. 节点池概念与治理:节点池定义、标签选择器、污点容忍度与 Envoy DaemonSet 调度
在 Kubernetes 集群升级治理与节点池巡检场景中,节点池(Node Pool)是承载工作负载的物理或虚拟资源集合。Envoy 作为集群的南北向与东西向网关,通常以 DaemonSet 形式在每个节点上运行。理解节点池的定义、标签选择器(Label Selector)、污点容忍度(Taint Toleration)以及它们如何影响 Envoy DaemonSet 的调度,是配置故障调试的核心基础。
4.1 节点池定义与核心属性
节点池是一组具有相同配置(如实例规格、操作系统、磁盘类型、网络配置)的节点集合。在集群升级治理中,节点池用于隔离不同版本、不同硬件规格或不同可用区的节点。
| 属性 | 说明 | 治理场景示例 |
|---|---|---|
| 节点池名称 | 唯一标识,如 pool-cpu-8c16g |
区分计算密集型与内存密集型节点池 |
| 节点标签 | 自动附加到池内所有节点,如 node-pool: cpu-8c16g |
用于工作负载的节点亲和性调度 |
| 节点污点 | 阻止普通 Pod 调度,如 dedicated=envoy:NoSchedule |
将 Envoy 独占节点池与业务节点池隔离 |
| 实例模板 | 定义节点规格、镜像、数据盘等 | 升级时切换实例模板实现节点滚动替换 |
| 自动修复 | 节点健康检查失败时自动替换 | 巡检时发现异常节点自动触发修复流程 |
4.2 标签选择器:Envoy 如何锁定目标节点
Envoy DaemonSet 通过 nodeSelector 或 nodeAffinity 中的标签选择器,决定在哪些节点池上运行。标签选择器是节点池治理的第一道调度关卡。
# Envoy DaemonSet 使用 nodeSelector 锁定特定节点池
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: envoy-gateway
namespace: envoy-system
spec:
selector:
matchLabels:
app: envoy-gateway
template:
metadata:
labels:
app: envoy-gateway
spec:
nodeSelector:
node-pool: envoy-proxy # 仅调度到标签为 node-pool=envoy-proxy 的节点
containers:
- name: envoy
image: envoyproxy/envoy:v1.28-latest
标签选择器的常见故障模式包括:
- 标签缺失:节点池创建时未正确附加标签,Envoy DaemonSet 无法匹配。
- 标签值变更:升级过程中节点池标签被修改,导致运行中的 Envoy Pod 被驱逐。
- 多标签逻辑冲突:同时使用
nodeSelector与nodeAffinity且规则不一致,造成调度死锁。
4.3 污点容忍度:强制调度与独占节点
污点(Taint)用于阻止普通 Pod 调度到特定节点。Envoy DaemonSet 必须配置对应的容忍度(Toleration)才能被调度到带有污点的节点池。这是节点池治理中实现资源隔离的关键机制。
# 在节点池上设置污点,仅允许 Envoy 调度
# 假设节点池已添加污点:dedicated=envoy:NoSchedule
# Envoy DaemonSet 添加对应容忍度
tolerations:
- key: "dedicated"
operator: "Equal"
value: "envoy"
effect: "NoSchedule"
4.4 Envoy DaemonSet 调度决策流程
下图展示了 Envoy DaemonSet 在节点池治理中的完整调度决策路径,从节点池定义到 Pod 最终运行。
4.5 节点池巡检清单与故障对照
在集群升级治理中,节点池巡检应覆盖以下关键项,并与 Envoy 调度故障建立对照关系:
| 巡检项 | 检查方法 | Envoy 调度故障表现 |
|---|---|---|
| 节点池标签一致性 | kubectl get nodes --show-labels |
Envoy Pod 无法调度到新节点,DaemonSet 显示 0/3 nodes available |
| 节点池污点配置 | kubectl describe node <node> | grep Taints |
Envoy Pod 因无对应容忍度被驱逐或无法调度 |
| DaemonSet 容忍度 | kubectl get ds envoy-gateway -o yaml |
调度器过滤阶段直接跳过带污点节点 |
| 节点池实例模板 | 云厂商控制台或 Cluster API 资源 | 新节点镜像版本与 Envoy 兼容性导致启动失败 |
| 节点池自动修复状态 | 检查节点池事件与节点 Condition | 故障节点未被替换,Envoy 实例持续缺失 |
4.6 多节点池场景下的 Envoy 调度策略
在大型集群中,通常存在多个节点池(如 pool-envoy、pool-business、pool-system)。Envoy DaemonSet 的调度策略需要精细设计:
- 独占节点池:为 Envoy 创建独立节点池,设置污点
dedicated=envoy:NoSchedule,DaemonSet 配置对应容忍度。确保业务 Pod 不会抢占 Envoy 资源。 - 共享节点池:在资源受限环境中,Envoy 与业务 Pod 共享节点池。此时应使用
nodeAffinity的preferredDuringSchedulingIgnoredDuringExecution软亲和性,避免硬约束导致调度失败。 - 升级过渡节点池:在集群升级期间,临时创建新版本节点池,通过修改标签选择器将 Envoy 逐步迁移到新池,实现零流量中断。
4.7 故障调试示例:标签不匹配导致调度失败
以下是一个典型的节点池巡检故障场景及其调试步骤:
- 现象:集群升级后,Envoy DaemonSet 的
DESIRED数量为 5,但READY数量为 3,有 2 个 Pod 处于Pending状态。 - 排查:执行
kubectl describe pod <pending-pod>,看到事件0/8 nodes are available: 2 node(s) didn't match node selector, 6 node(s) had taint。 - 根因:新升级的节点池标签为
node-pool: envoy-v2,但 DaemonSet 的nodeSelector仍为node-pool: envoy-v1。 - 修复:更新 DaemonSet 的
nodeSelector为node-pool: envoy-v2,或在新节点池上附加兼容标签。
# 修复前:DaemonSet 标签选择器
nodeSelector:
node-pool: envoy-v1
# 修复后:更新为匹配新节点池
nodeSelector:
node-pool: envoy-v2
通过上述节点池概念与治理机制的深入理解,SRE 团队可以在集群升级巡检中快速定位 Envoy 调度故障,确保网关层始终覆盖所有目标节点。