找回密码
 立即注册
首页 业界区 安全 k8s节点维护的细节

k8s节点维护的细节

向梦桐 2025-5-31 23:14:47
k8s节点维护的细节

Kubernetes(k8s)节点维护是保障集群稳定运行的重要工作,涉及节点升级、故障排查、资源优化等多个方面。维护步骤和操作命令:
一、节点维护前的准备工作

1. 查看集群状态
  1. kubectl get nodes  # 查看所有节点状态
  2. kubectl get pods --all-namespaces  # 查看所有Pod分布
  3. kubectl top nodes  # 查看节点资源使用情况
复制代码
2. 确定维护节点
  1. NODE_NAME="node-1"  # 替换为实际节点名称
复制代码
3. 备份重要数据
  1. # 备份etcd数据(针对控制平面节点)
  2. ETCD_POD=$(kubectl get pods -n kube-system | grep etcd | awk '{print $1}')
  3. kubectl exec -n kube-system $ETCD_POD -- sh -c "ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  4.   --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  5.   --cert=/etc/kubernetes/pki/etcd/server.crt \
  6.   --key=/etc/kubernetes/pki/etcd/server.key \
  7.   snapshot save /backup/etcd-snapshot.db"
复制代码
二、节点维护操作流程

1. 标记节点为不可调度
  1. kubectl cordon $NODE_NAME  # 阻止新Pod调度到该节点
复制代码
2. 排空节点上的 Pod(优雅下线)
  1. kubectl drain $NODE_NAME --ignore-daemonsets --delete-emptydir-data --grace-period=30
复制代码

  • --ignore-daemonsets:忽略 DaemonSet 创建的 Pod(通常无法迁移)
  • --delete-emptydir-data:删除 EmptyDir 卷数据
  • --grace-period=30:设置 Pod 终止宽限期(秒)
3. 执行节点维护(示例:系统升级)
  1. # 登录节点
  2. ssh user@$NODE_NAME
  3. # 更新系统软件包(Ubuntu/Debian)
  4. sudo apt update && sudo apt upgrade -y
  5. # 更新系统软件包(CentOS/RHEL)
  6. sudo yum update -y
  7. # 重启节点(如果需要)
  8. sudo reboot
复制代码
4. 验证节点状态
  1. # 等待节点重启完成
  2. kubectl get nodes  # 检查节点是否回到Ready状态
  3. # 检查节点组件
  4. kubectl describe node $NODE_NAME | grep -A 5 Conditions
复制代码
三、节点维护后的恢复操作

1. 标记节点为可调度
  1. kubectl uncordon $NODE_NAME  # 允许新Pod调度到该节点
复制代码
2. 验证 Pod 重新调度
  1. kubectl get pods --all-namespaces -o wide | grep $NODE_NAME  # 确认有新Pod调度到该节点
复制代码
四、高级维护场景

1. 节点升级(kubelet、kubeadm、kubectl)
  1. # 1. 标记节点不可调度并排空
  2. kubectl cordon $NODE_NAME
  3. kubectl drain $NODE_NAME --ignore-daemonsets
  4. # 2. 在节点上升级kubeadm
  5. sudo apt-get update && sudo apt-get install -y kubeadm=1.25.0-00  # 替换为目标版本
  6. # 3. 执行升级计划
  7. sudo kubeadm upgrade plan
  8. # 4. 应用升级
  9. sudo kubeadm upgrade apply v1.25.0  # 替换为目标版本
  10. # 5. 升级kubelet和kubectl
  11. sudo apt-get update && sudo apt-get install -y kubelet=1.25.0-00 kubectl=1.25.0-00
  12. # 6. 重启kubelet
  13. sudo systemctl restart kubelet
  14. # 7. 标记节点可调度
  15. kubectl uncordon $NODE_NAME
复制代码
2. 替换故障节点
  1. # 1. 标记故障节点不可调度并排空
  2. kubectl cordon $NODE_NAME
  3. kubectl drain $NODE_NAME --ignore-daemonsets
  4. # 2. 从集群中删除节点
  5. kubectl delete node $NODE_NAME
  6. # 3. 物理/虚拟机关闭故障节点
  7. # 4. 准备新节点并加入集群
  8. kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
复制代码
五、故障排查与监控

1. 查看节点事件
  1. kubectl describe node $NODE_NAME
复制代码
2. 查看 kubelet 日志
  1. # 对于systemd管理的节点
  2. journalctl -u kubelet -f
  3. # 对于containerd/runc容器运行时
  4. crictl logs <container-id>  # 获取容器ID:crictl ps
复制代码
3. 检查节点组件状态
  1. kubectl get componentstatuses  # 查看控制平面组件状态
复制代码
六、自动化维护工具

1. 使用 kube-bench 进行安全检查
  1. docker run --rm -v /etc/kubernetes:/etc/kubernetes -v /var/lib/kubelet:/var/lib/kubelet -v /var/run/docker.sock:/var/run/docker.sock aquasec/kube-bench:latest master
复制代码
2. 使用 kured 自动重启节点
  1. # 部署kured(Kubernetes Reboot Daemon)
  2. kubectl apply -f https://github.com/weaveworks/kured/releases/download/1.12.0/kured-1.12.0-dockerhub.yaml
复制代码
七、维护注意事项


  • 分批维护:避免同时维护多个节点,尤其是控制平面节点
  • 预留资源:确保集群有足够的资源容纳被排空的 Pod
  • 生产环境演练:在测试环境先验证维护流程
  • 紧急回滚:准备好升级失败的回滚方案

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册