随笔 - 378  文章 - 0  评论 - 5  阅读 - 6085

如何给某个Worker节点设置为不可调度

Kubernetes节点维护指南:如何给某个Worker节点设置为不可调度


一、为什么需要暂停节点调度?(运维场景解析)

在日常运维中,我们常遇到这些场景需要暂停节点调度:

  1. 硬件维护:更换故障硬盘、升级内存
  2. 系统升级:更新内核或Kubernetes组件
  3. 资源调整:排查节点性能瓶颈
  4. 故障隔离:节点异常时防止问题扩散

生产案例:某电商集群在双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

适用场景

  • 🛠️ 长期维护(如机房搬迁)
  • 🎯 精细控制调度策略
  • 🔄 配合自动化运维系统

三、生产环境完整操作流程(四步法)

  1. 前置检查
# 查看节点当前负载
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'
  1. 封存节点
kubectl cordon worker-node3
  1. 排空已有Pod(可选)
# 优雅驱逐Pod(保持服务不中断)
kubectl drain worker-node3 \
  --ignore-daemonsets \   # 忽略守护进程Pod
  --delete-emptydir-data \ # 删除emptyDir数据
  --timeout=300s          # 超时时间
  1. 维护后恢复
# 解除封存
kubectl uncordon worker-node3

# 验证调度能力
kubectl scale deployment/myapp --replicas=5
watch kubectl get pods -o wide | grep worker-node3

四、六大常见问题解决方案

  1. 节点卡在SchedulingDisabled状态怎么办?

    # 检查kubelet状态
    systemctl status kubelet -l
    
    # 强制解除状态(慎用!)
    kubectl patch node worker-node3 -p '{"spec":{"unschedulable":false}}'
    
  2. 关键Pod无法驱逐如何处理?

    # 查看Pod状态
    kubectl describe pod/myapp-xxx | grep -A 10 Events
    
    # 临时删除Pod保护
    kubectl delete pod/myapp-xxx --force --grace-period=0
    
  3. 节点恢复后无新Pod调度?

    # 检查节点资源分配
    kubectl describe node worker-node3 | grep -E 'Allocatable|Allocated'
    
    # 检查污点设置
    kubectl describe node worker-node3 | grep Taints
    
  4. 如何批量操作多个节点?

    # 使用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
    
  5. 维护期间监控告警配置

    # Prometheus告警规则示例
    - alert: NodeMaintenanceTooLong
      expr: time() - kube_node_spec_unschedulable{job="kube-state-metrics"} > 3600
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "节点 {{ $labels.node }} 维护时间超过1小时"
    
  6. 特殊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}}

六、最佳实践总结

  1. 黄金操作顺序
    封存 → 排空 → 维护 → 恢复 → 验证

  2. 避坑指南

    • 维护前确保Pod有足够副本
    • DaemonSet类Pod需特殊处理
    • 涉及本地存储时提前备份数据
  3. 监控指标

    # 查看节点不可调度时长
    kube_node_spec_unschedulable{node="worker-node3"}
    
    # 检查节点资源水位
    node:node_memory_utilisation:ratio{instance="worker-node3"}
    
  4. 文档沉淀建议

    ## 节点维护Checklist
    - [ ] 通知相关业务负责人
    - [ ] 检查Pod副本数和PDB策略
    - [ ] 确认维护时间窗口(如业务低峰期)
    - [ ] 备份重要配置和数据
    - [ ] 记录维护操作日志
    

运维心法
节点维护就像给运行的汽车换轮胎——既要保证安全停车(封存节点),又要快速完成更换(高效操作),最后还要检查车况确保能重新上路(验证恢复)。掌握这些技巧,你就能在Kubernetes集群的运维工作中游刃有余!

posted on   Leo-Yide  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示