k8s Node节点维护
Kubernetes (K8s) 中对 Node 节点的维护是保证集群健康和性能的重要部分。Node 节点通常是 Kubernetes 工作负载的运行环境,负责运行 Pods。当需要对节点进行维护(如升级、修复问题、调整配置等)时,可能需要将该节点标记为不可用并迁移其上的工作负载。
常见的 Node 节点维护任务:
- 标记节点不可调度(Cordon):防止新 Pod 被调度到该节点上。
- 驱逐节点上的 Pod(Drain):将节点上现有的 Pod 驱逐到其他节点,以便安全维护节点。
- 标记节点为可调度(Uncordon):在维护完成后,重新允许将新 Pod 调度到该节点。
- 节点升级:对节点的操作系统、容器运行时或 Kubernetes 版本进行升级。
- 监控节点健康:监控节点的健康状况,并在必要时执行恢复或替换操作。
维护步骤:
1. 标记节点不可调度(Cordon)
cordon
操作会将节点标记为不可调度状态,使新 Pod 不会被调度到该节点上。这不会影响已经在该节点上运行的 Pod。
kubectl cordon <node-name>
示例:
kubectl cordon node-1
输出:
node/node-1 cordoned
2. 驱逐节点上的 Pod(Drain)
drain
操作会驱逐节点上所有非系统关键的 Pod,并将它们迁移到集群中的其他节点。这个步骤是为了确保节点上的工作负载可以安全地迁移,以便对该节点进行维护。
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
--ignore-daemonsets
:忽略 DaemonSet 运行的 Pod,因为 DaemonSet 通常是与节点绑定的(如监控和日志收集服务)。--delete-emptydir-data
:如果 Pod 使用了emptyDir
存储卷,会删除相应的数据。
示例:
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data
输出:
node/node-1 drained
注意:drain
会中断节点上的应用程序,因此在生产环境中,建议你做好相应的准备,比如提前创建好新的副本,确保不会造成服务中断。
3. 进行节点维护(如升级或修复问题)
此时,节点上的工作负载已经被迁移,可以安全地进行维护操作。例如:
- 升级操作系统或 Kubernetes 版本。
- 升级容器运行时(如 Docker 或 containerd)。
- 修复硬件或网络问题。
4. 恢复节点并允许调度(Uncordon)
在维护完成后,使用 uncordon
命令恢复节点的调度功能,使新 Pods 能够调度到该节点上。
kubectl uncordon <node-name>
示例:
kubectl uncordon node-1
输出:
node/node-1 uncordoned
5. 检查节点状态
恢复节点后,检查节点的状态确保其正常工作:
kubectl get nodes
输出:
NAME STATUS ROLES AGE VERSION
node-1 Ready <none> 35d v1.23.0
节点状态应该显示为 Ready
,这表明节点已经恢复正常并可以接收新的工作负载。
其他维护操作:
1. 标记节点为不可用(Maintenance Mode)
如果你需要长期维护节点或从集群中移除节点,可以使用标签或污点将节点标记为不可用。
- 添加污点:
kubectl taint nodes <node-name> key=value:NoSchedule
- 移除污点:
kubectl taint nodes <node-name> key-
2. 查看节点详细信息
查看节点的详细状态和配置,可以帮助了解当前节点的健康情况和资源使用情况:
kubectl describe node <node-name>
3. 节点自动恢复(Node Self-Healing)
Kubernetes 通过节点控制器和 kubelet 监控节点的状态,如果节点出现问题(如脱机或不可访问),控制器会自动将节点标记为 NotReady
并将 Pods 调度到其他节点。这种自动恢复能力保证了集群的高可用性。
维护节点时的最佳实践:
- 提前通知:在生产环境中进行节点维护时,提前通知团队和用户,以防止服务中断引发的问题。
- 使用滚动更新:如果需要升级多个节点,使用滚动更新方式逐个升级节点,确保集群中的工作负载始终有足够的资源可用。
- 监控节点健康:在进行维护之前,确保节点的健康状况正常,维护完成后,通过监控工具(如 Prometheus、Grafana)持续跟踪节点的运行情况。
通过合理使用 cordon
、drain
和 uncordon
操作,你可以安全、有效地进行 Kubernetes 集群节点的维护,并确保不会对集群中的应用程序造成大的影响。
问答题
题目:Node节点维护
配置环境kubectl config use-context ek8s
将名为ek8s-node-0的node节点设置为不可用,并重新调度该node上所有运行的pods。
官方参考地址:Kubectl Reference Docs
帮助命令: kubectl drain --help
解答:
1.切换答题环境
kubectl config use-context ek8s
2.设置节点不可调度
kubectl cordon ek8s-node-0
3.驱除k8s-node-1节点上Pod
kubectl drain ek8s-node-0 --ignore-daemonsets --delete-emptydir-data --force
不需要其余步骤