首页 > 解决方案 > 如何在 Kubernetes 中重启主节点

问题描述

我有一个包含 3 个 master 和 3 个 worker 的 kubernetes 集群,我想重新启动其中一个 master 以更新 master 机器的系统。

那么我可以直接在控制台上使用 重启机器reboot,还是在重启之前需要完成一些步骤以避免服务中断和数据丢失的风险?

标签: kubernetes

解决方案


如果你需要重启一个节点(比如内核升级、libc 升级、硬件修复等),并且宕机时间很短,那么当 Kubelet 重启时,它会尝试重启调度给它的 Pod。如果重启时间较长(默认时间为 5 分钟,由控制器管理器上的 --pod-eviction-timeout 控制),则节点控制器将终止绑定到不可用节点的 pod。如果存在相应的副本集(或复制控制器),则该 pod 的新副本将在不同的节点上启动。所以,在所有 pod 都被复制的情况下,升级可以在没有特殊协调的情况下完成,假设不是所有节点都会同时宕机

如果您想更好地控制升级过程,您可以使用以下工作流程:

使用 kubectl drain 优雅地终止节点上的所有 pod,同时将节点标记为不可调度:

kubectl drain $NODENAME

这可以防止新的 pod 在您尝试将其关闭时降落在节点上。对于具有副本集的 pod,该 pod 将被一个新的 pod 替换,该新 pod 将被调度到一个新节点。此外,如果 pod 是服务的一部分,则客户端将自动重定向到新的 pod。对于没有副本集的 pod,您需要启动 pod 的新副本,并假设它不是服务的一部分,将客户端重定向到它。对节点执行维护工作。使节点再次可调度:

kubectl uncordon $NODENAME

此外,如果节点托管 ETCD,则在滚动升级 ETCD 和备份数据方面需要格外小心


推荐阅读