k8s Node节点维护

发布于:2024-10-16 ⋅ 阅读:(21) ⋅ 点赞:(0)

Kubernetes (K8s) 中对 Node 节点的维护是保证集群健康和性能的重要部分。Node 节点通常是 Kubernetes 工作负载的运行环境,负责运行 Pods。当需要对节点进行维护(如升级、修复问题、调整配置等)时,可能需要将该节点标记为不可用并迁移其上的工作负载。

常见的 Node 节点维护任务:

  1. 标记节点不可调度(Cordon):防止新 Pod 被调度到该节点上。
  2. 驱逐节点上的 Pod(Drain):将节点上现有的 Pod 驱逐到其他节点,以便安全维护节点。
  3. 标记节点为可调度(Uncordon):在维护完成后,重新允许将新 Pod 调度到该节点。
  4. 节点升级:对节点的操作系统、容器运行时或 Kubernetes 版本进行升级。
  5. 监控节点健康:监控节点的健康状况,并在必要时执行恢复或替换操作。

维护步骤:

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 调度到其他节点。这种自动恢复能力保证了集群的高可用性。

维护节点时的最佳实践:

  1. 提前通知:在生产环境中进行节点维护时,提前通知团队和用户,以防止服务中断引发的问题。
  2. 使用滚动更新:如果需要升级多个节点,使用滚动更新方式逐个升级节点,确保集群中的工作负载始终有足够的资源可用。
  3. 监控节点健康:在进行维护之前,确保节点的健康状况正常,维护完成后,通过监控工具(如 Prometheus、Grafana)持续跟踪节点的运行情况。

通过合理使用 cordondrainuncordon 操作,你可以安全、有效地进行 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

不需要其余步骤