一、为什么需要节点维护和Pod迁移

就像家里的电器需要定期检修一样,Kubernetes集群中的节点(服务器)也需要维护升级。但直接关机可能会导致正在运行的服务突然中断,就像突然拔掉电饭煲插头会让米饭夹生。这时候就需要"优雅迁移"——让Pod(容器组)像搬家一样,先找好新家(其他节点),收拾完行李(完成当前任务)再搬走。

典型场景

  • 硬件升级:比如给节点增加内存
  • 系统补丁:修复内核安全漏洞
  • 资源调配:将某些节点专用于特定服务

二、维护前的准备工作

1. 给节点打上标签

就像给仓库货架贴分类标签,方便后续筛选:

# 技术栈:kubectl
kubectl label nodes node-1 environment=production  # 标记为生产环境节点
kubectl label nodes node-2 disk=ssd               # 标记为SSD存储节点

2. 设置Pod容忍时间

告诉Pod:"这个节点要维护了,给你30秒收拾行李":

# 技术栈:Kubernetes YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  template:
    spec:
      tolerations:
      - key: "node.kubernetes.io/maintenance"
        operator: "Exists"
        effect: "NoExecute"
        tolerationSeconds: 30  # 容忍维护状态30秒

三、三种优雅迁移方法

方法1:手动驱逐Pod

就像让客人有序离开酒店:

# 技术栈:kubectl
kubectl drain node-1 --ignore-daemonsets --delete-本地data
# --ignore-daemonsets 忽略守护进程Pod
# --delete-本地data 删除本地存储数据

方法2:使用PodDisruptionBudget

设置最少服务可用数量,像保证至少5个收银台开放:

# 技术栈:Kubernetes YAML
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: db-pdb
spec:
  minAvailable: 2  # 始终保持至少2个数据库Pod运行
  selector:
    matchLabels:
      app: mysql

方法3:节点自动排水

让Kubernetes自动处理,像智能家居系统:

# 技术栈:kubectl
kubectl cordon node-1  # 停止调度新Pod
kubectl get pods -o wide | grep node-1  # 确认剩余Pod
kubectl uncordon node-1  # 维护完成后恢复

四、实战示例:数据库服务迁移

假设我们要维护一个运行MySQL的节点:

# 技术栈:Kubernetes YAML
# 1. 首先确保有副本数
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  replicas: 3  # 至少3个副本
  serviceName: "mysql"
  
# 2. 创建维护专用节点
kubectl label nodes node-4 dedicated=maintenance

# 3. 将Pod迁移到新节点
kubectl patch statefulset mysql -p '{"spec":{"template":{"spec":{"nodeSelector":{"dedicated":"maintenance"}}}}}'

五、注意事项与常见问题

  1. 数据服务特别照顾

    • 有状态服务(如数据库)要确保数据同步完成再迁移
    • 使用volumeClaimTemplates保持存储卷
  2. 时间窗口选择

    • 避开业务高峰期,就像不在双11期间升级服务器
  3. 监控迁移状态

    watch kubectl get pods -o wide  # 实时观察Pod位置
    
  4. 回滚准备

    • 提前备份所有配置
    • 记录操作时间点,方便排查问题

六、为什么这样做更好

传统方式:直接关机导致服务中断,用户看到502错误。
优雅迁移

  • 业务无感知(用户不会发现服务重启)
  • 自动负载均衡(流量平滑转移到其他节点)
  • 可监控过程(每个步骤都可追溯)

七、总结 checklist

进行节点维护时,记得按这个清单操作:

  1. [ ] 检查所有工作负载的副本数
  2. [ ] 设置适当的PodDisruptionBudget
  3. [ ] 给节点打上维护标签
  4. [ ] 执行drain命令前先cordon节点
  5. [ ] 维护完成后uncordon节点
  6. [ ] 验证所有服务恢复正常

通过这样的标准化操作,就能像专业运维团队一样安全地进行集群维护了。记住关键原则:让Pod体面地离开,而不是突然消失。