在现代云原生架构中,Kubernetes(K8s)已成为容器编排的事实标准。作为Kubernetes集群的基本组成部分,节点(Node) 承担着运行工作负载、提供计算资源等重要职责。然而,在实际运维过程中,我们经常需要对节点进行维护、升级或下线,如何安全、平滑地移除节点,避免影响业务稳定性,是每个Kubernetes管理员必须掌握的技能。
本文将深入探讨:
Kubernetes节点是集群中的工作单元,可以是物理服务器或虚拟机。每个节点由控制平面管理,主要负责以下任务:
节点是Pod的实际运行环境,通过kubelet与容器运行时(如Docker、containerd)交互,确保Pod按预期执行。
节点向集群提供:
资源使用情况通过kubectl describe node <node-name>查看:
kubectl describe node node-01输出示例:
Capacity:
cpu: 4
memory: 16Gi
pods: 110
Allocatable:
cpu: 3800m
memory: 14Gi
pods: 110节点接收来自kube-scheduler的指令,决定哪些Pod可以在该节点运行。
通过CRI(Container Runtime Interface)管理容器生命周期,支持Docker、containerd、CRI-O等。
维护节点上的网络规则,实现Service的负载均衡和流量转发。
下线节点的核心目标是确保Pod平滑迁移,避免服务中断。以下是详细步骤:
在操作前,确认节点和Pod状态:
kubectl get nodes
kubectl get pods -o wide | grep <node-name>确保节点处于Ready状态,并记录运行中的Pod。
阻止新Pod调度到该节点:
kubectl cordon <node-name>验证状态:
kubectl get nodes输出应显示:
NAME STATUS ROLES AGE VERSION
node-01 Ready,SchedulingDisabled <none> 30d v1.28.2逐步迁移Pod到其他节点:
kubectl drain <node-name> \
--ignore-daemonsets \ # 忽略DaemonSet Pod(如日志收集组件)
--delete-emptydir-data \ # 清理EmptyDir临时数据
--grace-period=30 \ # 优雅终止等待时间(秒)
--timeout=5m # 操作超时时间如果遇到Pod无法驱逐(如PDB限制),可使用--force:
kubectl drain <node-name> --force检查是否仅剩DaemonSet管理的Pod:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node-name>kubectl delete node <node-name>在节点本地执行:
sudo systemctl stop kubelet
sudo systemctl disable kubelet # 如需永久下线如果节点需重新加入集群,执行重置:
sudo kubeadm reset
rm -rf /etc/kubernetes/确保存储卷(PVC/PV)已正确迁移:
kubectl get pvc -n <namespace>检查PDB是否阻止驱逐:
kubectl get pdb -A临时调整PDB(谨慎操作):
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
spec:
minAvailable: 1 # 允许至少1个Pod可用
selector:
matchLabels:
app: my-app强制删除不可恢复的节点:
kubectl delete node <node-name> --force --grace-period=0选择低峰期操作:避免业务高峰期下线节点。
预留缓冲资源:确保集群有足够容量接收迁移的Pod。
监控迁移过程:
watch kubectl get pods -o wide记录操作日志:便于审计和故障回溯。
自动化工具:对于大规模集群,使用Ansible或Terraform脚本自动化下线流程。
Kubernetes节点的安全下线是集群运维中的关键操作。通过cordon、drain等命令,结合PDB、存储卷等特性的合理配置,可以最大限度地减少对业务的影响。建议在测试环境中模拟演练,确保生产环境操作万无一失。
“平滑的节点下线,是Kubernetes运维艺术的体现。”
希望本文能帮助你掌握节点下线的正确姿势!如果你有更多问题,欢迎在评论区讨论。 🚀