Kubernetes Worker节点资源异常及Pod调度相关技术咨询
结合你提供的节点信息和作为K8s新手遇到的几个问题,我来逐一帮你分析解决:
问题1:无法在worker节点扩容Pod,且内存使用率始终为0
从kubectl describe nodes worker-node的输出里,能看到最关键的问题:这个worker节点带有**node.kubernetes.io/disk-pressure:NoSchedule污点**,同时节点状态中的DiskPressure显示为True——这说明节点的磁盘空间不足了。
Kubernetes的调度器会自动避开带有NoSchedule污点的节点,所以新Pod根本不会被调度到这个worker节点上。既然节点上没有运行任何Pod,内存使用率自然显示为0。你需要先清理worker节点的磁盘空间,等kubelet检测到磁盘压力缓解后,会自动移除这个污点,之后就能正常往这个节点调度Pod了。
问题2:扩容时新实例总是创建在master节点
这其实是问题1的连锁反应:你的worker节点因为磁盘压力被标记为不可调度,集群里就只剩master节点能接收新Pod了(默认情况下master节点是允许调度Pod的,除非你手动给它打上了禁止调度的污点)。所以扩容时,调度器只能把所有新Pod安排到master节点上。
如果不想让Pod运行在master节点,你可以给master节点打上禁止调度的污点,执行命令:
kubectl taint nodes <你的master节点名称> node-role.kubernetes.io/master:NoSchedule
不过优先解决worker节点的磁盘问题才是核心,不然集群会没有可用的工作节点。
问题3:是否有办法将Pod限制在特定节点上
当然可以,常用的两种方案:
- 节点选择器(NodeSelector):先给目标节点打上自定义标签,比如给worker-node打标签:
然后在Pod的Deployment配置中添加kubectl label nodes worker-node app-group=backendnodeSelector字段,指定要匹配的标签:spec: template: spec: nodeSelector: app-group: backend - 节点亲和性(NodeAffinity):比NodeSelector更灵活,支持软约束(尝试匹配,不强制)和硬约束(必须匹配),以及更复杂的匹配规则,示例配置:
spec: template: spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: # 硬约束,必须满足 nodeSelectorTerms: - matchExpressions: - key: app-group operator: In values: - backend
问题4:扩容时Pod是如何分配的
Kubernetes调度器分配Pod的逻辑分为两个核心阶段:
- 过滤阶段:先排除所有不符合条件的节点,比如带有不可调度污点、资源不足、不满足节点选择器/亲和性规则的节点,剩下的节点称为「可行节点」。
- 打分阶段:给每个可行节点计算分数,分数最高的节点会被选中来运行新Pod。打分的依据包括节点剩余资源量、Pod亲和性/反亲和性要求、节点标签匹配度等。
你当前的情况是worker节点在过滤阶段就被排除了,所以只有master节点进入打分环节,自然所有新Pod都会被调度到master节点上。
内容的提问来源于stack exchange,提问作者Bhargav Patel

