Skip to content

rke1-k8s1.16.3 exception 节点 Pod 分布不均分析结论

数据来源:exception_node_check_20260723_161231 排查结果

一、问题现象

三台带有 node-type=exception:NoSchedule 污点的节点 Pod 数量分布不均:

节点max-podscurrent-podsCPU内存
szb1203311036160核756G
szb1303415086160核1T
szb1401711075160核756G

二、核心指标汇总

指标szb12033szb13034szb14017
节点状态ReadyReadyReady
运行 Pod 总数388474
CPU requests1430m (0%)22050m (13%)2130m (1%)
Memory requests3912Mi (0%)174996Mi (16%)7412Mi (0%)
CPU limits162 (101%)491 (306%)448 (280%)
Memory limits377344Mi (48%)1063424Mi (99%)963072Mi (124%)
Allocatable 内存790730396Ki (~754G)1089762388Ki (~1T)790677652Ki (~754G)
FailedScheduling 事件

注:Pod 数量包含 cattle-node-agentcalico-nodenodelocaldnstrident-csi 等基础 Pod。

三、分布不均原因分析

3.1 调度器本身无异常

  • 三台节点均为 Ready 状态
  • 未产生 FailedScheduling 事件
  • 多副本小规格 Deployment 在三台节点上分布相对均匀

这说明调度功能正常,Pod 数量差异不是由节点不可调度或调度失败导致的。

3.2 szb13034 承载了大量大规格 Pod

szb13034 上运行了多台仅在该节点出现的大规格业务 Pod,例如:

PodCPU requestsMemory requests
a11-center-prd-service-tag-cod116Gi
chq-bills-bills116Gi
a01-dianpei-private-for-store18Gi
a01-order-crmapiservice18Gi
a01-order-crmwdnew-service18Gi
a11-center-orderprint-template18Gi
a11-center-reorganize-order-route-query18Gi
a11-center-trade-center-openapi-gateway18Gi

一台 1C/8Gi 的 Pod,相当于约 40 个 20m/100Mi 的小 Pod。这些大规格 Pod 集中在 szb13034,直接导致了该节点 Pod 数量和资源 requests 远高于其他两台。

3.3 szb13034 内存规格更大

  • szb13034:1T 内存
  • szb12033 / szb14017:756G 内存

Kubernetes 默认调度器在调度大资源请求 Pod 时,会优先选择资源更充足的节点。szb13034 内存多约 33%,因此更容易被选中承载大内存 Pod。

3.4 小规格多副本 Pod 分布相对均匀

以下 Deployment 在三台节点上的副本分布基本均衡:

Deploymentszb12033szb13034szb14017
a11-center-dtd-bill-job333
a11-center-reorganize-order-consumer333
a11-center-perfect-trace-order-loader222
a11-center-external-data-hbase-consumer222
a11-center-route-eta-fb222
a11-center-waybill-center-forbes-sender334

这说明常规滚动更新/副本调度机制工作正常,Pod 不均主要来自于 szb13034 上的独占型大规格 Pod。

3.5 部分 Deployment 未调度到 szb12033

例如:

  • a08-mobile-open-api:szb13034 有 10 个,szb14017 有 12 个,szb12033 有 0 个
  • a03-finance-fund-kafka:szb13034 有 3 个,szb14017 有 3 个,szb12033 有 0 个

可能原因:

  1. 这些 Pod 创建时 szb12033 尚不可调度或资源不足
  2. 存在节点选择器(nodeSelector)或节点亲和性(nodeAffinity)约束
  3. 滚动更新时旧 Pod 未迁移到新节点
  4. Pod 反亲和性导致副本被限制在部分节点

四、风险识别

4.1 limits 严重超售

节点Memory limits 占比
szb1203348%
szb1303499%
szb14017124%
  • szb13034 的 memory limits 已接近 100%
  • szb14017 的 memory limits 已超过 allocatable(124%)

风险:当业务实际内存使用接近 limits 时,极易触发 OOMKill。虽然 Kubernetes 调度只看 requests,但运行时资源竞争取决于实际使用与 limits。

4.2 单节点故障影响面大

szb13034 承载了最多数量的 Pod,且包含多台大规格业务 Pod。一旦该节点故障或需要维护,其上 Pod 同时迁移会对剩余节点造成巨大压力,可能引发级联故障。

4.3 max-pods 配置不一致

szb13034 的 max-pods 为 150,另外两台为 110。这不利于横向对比节点负载,也可能导致调度上限判断不一致。

五、排查建议

5.1 检查大规格 Pod 的调度约束

确认 szb13034 上的大规格 Pod 是"只能"运行在该节点,还是"恰好"运行在该节点:

bash
# 查看 Pod 的 nodeSelector 和 affinity
kubectl get pod <pod-name> -n default -o yaml | grep -A30 nodeSelector
kubectl get pod <pod-name> -n default -o yaml | grep -A50 affinity

# 查看 Deployment 级别的调度约束
kubectl get deployment <deployment-name> -n default -o yaml | grep -A50 affinity

5.2 检查节点标签差异

bash
kubectl get nodes -l node-type=exception --show-labels

确认 szb13034 是否有其他节点标签吸引了大规格 Pod。

5.3 查看调度器日志

bash
kubectl -n kube-system get pods -l component=kube-scheduler
kubectl -n kube-system logs <kube-scheduler-pod> | grep -E "szb12033|szb13034|szb14017"

虽然当前无 FailedScheduling 事件,但调度器日志可以解释为什么某些 Pod 被调度到特定节点。

5.4 使用 kubectl top 查看实际资源使用

bash
kubectl top node szb12033 szb13034 szb14017
kubectl top pod --all-namespaces --sort-by=memory

确认实际使用是否与 requests/limits 趋势一致。

六、优化建议

  1. 统一 max-pods 配置 三台节点 CPU 相同,建议统一为 110 或 150,避免理解偏差。

  2. 评估大规格 Pod 迁移可行性 如果 szb12033/szb14017 的 requests 余量充足,可以通过滚动更新将部分 szb13034 上的大规格 Pod 迁移过去,降低单节点集中度。

  3. 部署 Kubernetes Descheduler 配置 LowNodeUtilizationRemoveDuplicates 策略,让 Pod 分布更均衡。

  4. 设置合理的 resource limits 尤其是 szb14017 memory limits 已达 124%,建议审查这些 Pod 的 limits 是否设置过大,必要时调低或迁移。

  5. 增加 Pod 反亲和性 对于关键大规格 Deployment,建议配置 podAntiAffinity,避免同类 Pod 过度集中在单一节点。

七、结论

当前三台 exception 节点的 Pod 数量差异主要由 szb13034 承载了更多大规格、高内存请求的业务 Pod 导致。调度器本身工作正常,节点状态良好,无调度失败事件。

但需要关注:

  • szb13034 memory limits 已达 99%
  • szb14017 memory limits 已达 124%
  • szb13034 单节点承载压力过大,存在故障扩散风险

建议尽快排查大规格 Pod 的调度约束,并考虑通过迁移或扩容来平衡负载。