如何给某个Worker节点设置为不可调度
Kubernetes节点维护指南:如何给某个Worker节点设置为不可调度
一、为什么需要暂停节点调度?(运维场景解析)
在日常运维中,我们常遇到这些场景需要暂停节点调度:
- 硬件维护:更换故障硬盘、升级内存
- 系统升级:更新内核或Kubernetes组件
- 资源调整:排查节点性能瓶颈
- 故障隔离:节点异常时防止问题扩散
生产案例:某电商集群在双11前巡检时,发现worker-node3存在磁盘坏道,需要立即隔离该节点进行维修,但需保证现有业务不受影响。
二、两种核心操作方式(附避坑指南)
方法一:快速封存节点(推荐)
# 给节点挂上"维修中"的牌子
kubectl cordon worker-node3
# 验证状态(看到SchedulingDisabled即成功)
kubectl get nodes -o wide | grep worker-node3
效果:
- 🚫 禁止新Pod调度到该节点
- 🏃♂️ 已运行Pod不受影响
- ⏳ 适合短时维护(30分钟内)
方法二:标签隔离法(高级用法)
# 给节点打上特殊标签
kubectl label nodes worker-node3 node.kubernetes.io/maintenance=true
# 在Deployment中配置反亲和性
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node.kubernetes.io/maintenance
operator: DoesNotExist
适用场景:
- 🛠️ 长期维护(如机房搬迁)
- 🎯 精细控制调度策略
- 🔄 配合自动化运维系统
三、生产环境完整操作流程(四步法)
- 前置检查
# 查看节点当前负载
kubectl describe node worker-node3 | grep -A 10 "Allocated resources"
# 检查关键Pod分布
kubectl get pods -o wide --field-selector spec.nodeName=worker-node3 | grep -vE 'Completed|Evicted'
- 封存节点
kubectl cordon worker-node3
- 排空已有Pod(可选)
# 优雅驱逐Pod(保持服务不中断)
kubectl drain worker-node3 \
--ignore-daemonsets \ # 忽略守护进程Pod
--delete-emptydir-data \ # 删除emptyDir数据
--timeout=300s # 超时时间
- 维护后恢复
# 解除封存
kubectl uncordon worker-node3
# 验证调度能力
kubectl scale deployment/myapp --replicas=5
watch kubectl get pods -o wide | grep worker-node3
四、六大常见问题解决方案
-
节点卡在SchedulingDisabled状态怎么办?
# 检查kubelet状态 systemctl status kubelet -l # 强制解除状态(慎用!) kubectl patch node worker-node3 -p '{"spec":{"unschedulable":false}}'
-
关键Pod无法驱逐如何处理?
# 查看Pod状态 kubectl describe pod/myapp-xxx | grep -A 10 Events # 临时删除Pod保护 kubectl delete pod/myapp-xxx --force --grace-period=0
-
节点恢复后无新Pod调度?
# 检查节点资源分配 kubectl describe node worker-node3 | grep -E 'Allocatable|Allocated' # 检查污点设置 kubectl describe node worker-node3 | grep Taints
-
如何批量操作多个节点?
# 使用xargs批量封存 kubectl get nodes -l role=worker | awk 'NR>1 {print $1}' | xargs -I{} kubectl cordon {} # 使用JSONPath筛选 kubectl get nodes -o jsonpath='{.items[*].metadata.name}' | tr ' ' '\n' | grep worker | xargs kubectl cordon
-
维护期间监控告警配置
# Prometheus告警规则示例 - alert: NodeMaintenanceTooLong expr: time() - kube_node_spec_unschedulable{job="kube-state-metrics"} > 3600 for: 5m labels: severity: warning annotations: summary: "节点 {{ $labels.node }} 维护时间超过1小时"
-
特殊Pod处理技巧
# 有本地存储的Pod kubectl drain worker-node3 --delete-emptydir-data --ignore-daemonsets # 使用PodDisruptionBudget保护 kubectl create pdb myapp-pdb --selector=app=myapp --min-available=2
五、进阶技巧:自动化维护方案
运维脚本模板:
#!/bin/bash
NODE=$1
# 封存节点
kubectl cordon $NODE
# 排空Pod(带重试机制)
for i in {1..3}; do
kubectl drain $NODE --ignore-daemonsets --delete-emptydir-data --timeout=300s && break
sleep 60
done
# 执行维护操作(示例:重启docker)
ssh $NODE "systemctl restart docker"
# 解除封存
kubectl uncordon $NODE
# 验证服务状态
kubectl get pods -o wide | grep $NODE
Argo Workflow示例:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: node-maintenance-
spec:
entrypoint: maintenance
templates:
- name: maintenance
steps:
- - name: cordon
template: cordon-node
- - name: maintenance
template: run-maintenance
depends: "cordon"
- - name: uncordon
template: uncordon-node
depends: "maintenance"
- name: cordon-node
script:
image: bitnami/kubectl
command: [bash]
source: |
kubectl cordon {{inputs.parameters.node}}
- name: run-maintenance
script:
image: ubuntu
command: [bash]
source: |
# 这里添加维护操作
echo "Performing maintenance on {{inputs.parameters.node}}"
sleep 120
- name: uncordon-node
script:
image: bitnami/kubectl
command: [bash]
source: |
kubectl uncordon {{inputs.parameters.node}}
六、最佳实践总结
-
黄金操作顺序:
封存 → 排空 → 维护 → 恢复 → 验证 -
避坑指南:
- 维护前确保Pod有足够副本
- DaemonSet类Pod需特殊处理
- 涉及本地存储时提前备份数据
-
监控指标:
# 查看节点不可调度时长 kube_node_spec_unschedulable{node="worker-node3"} # 检查节点资源水位 node:node_memory_utilisation:ratio{instance="worker-node3"}
-
文档沉淀建议:
## 节点维护Checklist - [ ] 通知相关业务负责人 - [ ] 检查Pod副本数和PDB策略 - [ ] 确认维护时间窗口(如业务低峰期) - [ ] 备份重要配置和数据 - [ ] 记录维护操作日志
运维心法:
节点维护就像给运行的汽车换轮胎——既要保证安全停车(封存节点),又要快速完成更换(高效操作),最后还要检查车况确保能重新上路(验证恢复)。掌握这些技巧,你就能在Kubernetes集群的运维工作中游刃有余!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)