配置 Kubernetes Master 节点不可调度的标准方法
文章目录
- 概述
- 方法一:使用 Taint(污点) - 生产环境推荐
- 概念说明
- 操作命令
- 参数解释
- 验证配置
- 优势
- 方法二:使用 Cordon(节点封锁) - 临时维护场景
- 概念说明
- 操作命令
- 验证配置
- 取消封锁
- 两种方法的对比分析
- 最佳实践建议
- 生产环境配置
- 维护操作流程
- 故障排除
- 检查当前配置
- 常见问题处理
- 结论
概述
在 Kubernetes 生产环境中,确保集群控制平面组件稳定运行至关重要。默认情况下,Master 节点承担着运行 API Server、Controller Manager、Scheduler 等关键系统组件的职责。为了防止用户工作负载 Pod 调度到 Master 节点上与系统组件竞争资源,需要将 Master 节点配置为不可调度状态。
本文将介绍两种标准的配置方法,并解释其适用场景和最佳实践。
方法一:使用 Taint(污点) - 生产环境推荐
概念说明
污点是 Kubernetes 调度机制的核心概念之一。它允许节点"排斥"一类特定的 Pod,只有那些具有对应容忍度(Toleration)的 Pod 才能被调度到该节点上。
操作命令
# 为 Master 节点添加污点
kubectl taint nodes <node-name> node-role.kubernetes.io/master=:NoSchedule# 示例:为节点 kube-master01 添加污点
kubectl taint nodes kube-master01 node-role.kubernetes.io/master=:NoSchedule
参数解释
node-role.kubernetes.io/master
: 污点的键(key),标识节点的 Master 角色NoSchedule
: 污点的效果(effect),表示禁止无对应容忍度的 Pod 调度
验证配置
# 查看节点污点配置
kubectl describe node kube-master01 | grep -i taint# 预期输出
Taints: node-role.kubernetes.io/master:NoSchedule
优势
- 精细控制: 允许特定系统组件(如 CNI 网络插件、CoreDNS 等)通过设置容忍度继续在 Master 节点运行
- 符合 Kubernetes 设计模式: 是官方推荐的生产环境标准做法
- kubeadm 默认配置: 使用 kubeadm 部署的集群会自动设置此污点
方法二:使用 Cordon(节点封锁) - 临时维护场景
概念说明
Cordon 操作将节点标记为不可调度(Unschedulable),这是一种更为直接的节点调度控制方法,适用于临时维护场景。
操作命令
# 将节点设置为不可调度
kubectl cordon <node-name># 示例:封锁节点 kube-master01
kubectl cordon kube-master01
验证配置
# 查看节点调度状态
kubectl describe node kube-master01 | grep -i unschedulable# 预期输出
Unschedulable: true
取消封锁
# 恢复节点可调度状态
kubectl uncordon <node-name># 示例:解除节点 kube-master01 的封锁
kubectl uncordon kube-master01
两种方法的对比分析
特性 | Taint(污点) | Cordon(节点封锁) |
---|---|---|
工作原理 | 基于污点-容忍度机制 | 直接修改节点调度状态 |
灵活性 | 高,支持精细控制 | 低,一刀切禁止调度 |
已存在Pod | 不影响运行中的Pod | 不影响运行中的Pod |
适用场景 | 生产环境永久配置 | 临时维护和故障处理 |
kubeadm默认 | 是 | 否 |
最佳实践建议
生产环境配置
- 始终为 Master 节点设置污点:
kubectl taint nodes kube-master01 node-role.kubernetes.io/master=:NoSchedule
- 为系统关键组件配置容忍度:
在 Deployment 或 DaemonSet 配置中添加:
tolerations:- key: "node-role.kubernetes.io/master"operator: "Exists"effect: "NoSchedule"
维护操作流程
- 计划性维护:
# 首先封锁节点
kubectl cordon kube-master01# 排空节点(可选,如果需要重启)
kubectl drain kube-master01 --ignore-daemonsets# 维护完成后恢复
kubectl uncordon kube-master01
故障排除
检查当前配置
# 查看所有节点的调度状态和污点配置
kubectl get nodes -o wide
kubectl describe nodes | egrep "Name:|Taints:|Unschedulable"# 查看特定节点的详细配置
kubectl describe node kube-master01
常见问题处理
-
污点未生效:
- 确认污点格式正确:
key=value:effect
- 检查 Pod 是否配置了对应的容忍度
- 确认污点格式正确:
-
需要移除污点:
bash
kubectl taint nodes kube-master01 node-role.kubernetes.io/master:NoSchedule-
结论
在 Kubernetes 集群管理中,正确配置 Master 节点的调度行为是保证集群稳定性的重要环节。推荐在生产环境中使用 Taint 机制来实现持久的调度控制,这不仅符合 Kubernetes 的设计理念,也提供了更好的灵活性。而 Cordon 操作更适合用于临时的节点维护场景。