一、为什么需要节点维护和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"}}}}}'
五、注意事项与常见问题
数据服务特别照顾:
- 有状态服务(如数据库)要确保数据同步完成再迁移
- 使用
volumeClaimTemplates保持存储卷
时间窗口选择:
- 避开业务高峰期,就像不在双11期间升级服务器
监控迁移状态:
watch kubectl get pods -o wide # 实时观察Pod位置回滚准备:
- 提前备份所有配置
- 记录操作时间点,方便排查问题
六、为什么这样做更好
传统方式:直接关机导致服务中断,用户看到502错误。
优雅迁移:
- 业务无感知(用户不会发现服务重启)
- 自动负载均衡(流量平滑转移到其他节点)
- 可监控过程(每个步骤都可追溯)
七、总结 checklist
进行节点维护时,记得按这个清单操作:
- [ ] 检查所有工作负载的副本数
- [ ] 设置适当的PodDisruptionBudget
- [ ] 给节点打上维护标签
- [ ] 执行drain命令前先cordon节点
- [ ] 维护完成后uncordon节点
- [ ] 验证所有服务恢复正常
通过这样的标准化操作,就能像专业运维团队一样安全地进行集群维护了。记住关键原则:让Pod体面地离开,而不是突然消失。
评论