个人名片
🎓作者简介:java领域优质创作者
🌐个人主页:码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站:www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?
- 专栏导航:
码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀
Kubernetes节点深度解析:核心作用与安全下线实践指南
引言
在现代云原生架构中,Kubernetes(K8s)已成为容器编排的事实标准。作为Kubernetes集群的基本组成部分,节点(Node) 承担着运行工作负载、提供计算资源等重要职责。然而,在实际运维过程中,我们经常需要对节点进行维护、升级或下线,如何安全、平滑地移除节点,避免影响业务稳定性,是每个Kubernetes管理员必须掌握的技能。
本文将深入探讨:
- Kubernetes节点的核心作用
- 节点下线前的关键检查项
- 安全下线节点的完整流程(含代码示例)
- 特殊场景处理与最佳实践
1. Kubernetes节点的核心作用
Kubernetes节点是集群中的工作单元,可以是物理服务器或虚拟机。每个节点由控制平面管理,主要负责以下任务:
1.1 运行工作负载(Pods)
节点是Pod的实际运行环境,通过kubelet与容器运行时(如Docker、containerd)交互,确保Pod按预期执行。
1.2 提供计算资源
节点向集群提供:
- CPU
- 内存
- 存储(临时卷、持久卷)
- 网络(IP、带宽)
资源使用情况通过kubectl describe node <node-name>
查看:
kubectl describe node node-01
输出示例:
Capacity:
cpu: 4
memory: 16Gi
pods: 110
Allocatable:
cpu: 3800m
memory: 14Gi
pods: 110
1.3 执行调度决策
节点接收来自kube-scheduler的指令,决定哪些Pod可以在该节点运行。
1.4 维护容器运行时
通过CRI(Container Runtime Interface)管理容器生命周期,支持Docker、containerd、CRI-O等。
1.5 网络代理(kube-proxy)
维护节点上的网络规则,实现Service的负载均衡和流量转发。
2. 安全下线节点的完整流程
下线节点的核心目标是确保Pod平滑迁移,避免服务中断。以下是详细步骤:
2.1 检查节点状态
在操作前,确认节点和Pod状态:
kubectl get nodes
kubectl get pods -o wide | grep <node-name>
确保节点处于Ready
状态,并记录运行中的Pod。
2.2 标记节点为不可调度(Cordon)
阻止新Pod调度到该节点:
kubectl cordon <node-name>
验证状态:
kubectl get nodes
输出应显示:
NAME STATUS ROLES AGE VERSION
node-01 Ready,SchedulingDisabled <none> 30d v1.28.2
2.3 驱逐节点上的Pod(Drain)
逐步迁移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
2.4 确认节点已清空
检查是否仅剩DaemonSet管理的Pod:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node-name>
2.5 从集群移除节点
kubectl delete node <node-name>
2.6 停止节点服务
在节点本地执行:
sudo systemctl stop kubelet
sudo systemctl disable kubelet # 如需永久下线
2.7 清理节点(可选)
如果节点需重新加入集群,执行重置:
sudo kubeadm reset
rm -rf /etc/kubernetes/
3. 特殊场景处理
3.1 有状态应用(StatefulSet)
确保存储卷(PVC/PV)已正确迁移:
kubectl get pvc -n <namespace>
3.2 PodDisruptionBudget(PDB)限制
检查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
3.3 节点失联(NotReady)
强制删除不可恢复的节点:
kubectl delete node <node-name> --force --grace-period=0
4. 最佳实践
- 选择低峰期操作:避免业务高峰期下线节点。
- 预留缓冲资源:确保集群有足够容量接收迁移的Pod。
- 监控迁移过程:
watch kubectl get pods -o wide
- 记录操作日志:便于审计和故障回溯。
- 自动化工具:对于大规模集群,使用Ansible或Terraform脚本自动化下线流程。
结语
Kubernetes节点的安全下线是集群运维中的关键操作。通过cordon
、drain
等命令,结合PDB、存储卷等特性的合理配置,可以最大限度地减少对业务的影响。建议在测试环境中模拟演练,确保生产环境操作万无一失。
“平滑的节点下线,是Kubernetes运维艺术的体现。”
希望本文能帮助你掌握节点下线的正确姿势!如果你有更多问题,欢迎在评论区讨论。 🚀