kubernetes - 如何在 Kubernetes 中重启主节点
问题描述
我有一个包含 3 个 master 和 3 个 worker 的 kubernetes 集群,我想重新启动其中一个 master 以更新 master 机器的系统。
那么我可以直接在控制台上使用 重启机器reboot
,还是在重启之前需要完成一些步骤以避免服务中断和数据丢失的风险?
解决方案
如果你需要重启一个节点(比如内核升级、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 和备份数据方面需要格外小心
推荐阅读
- java - Android 4.1.1 Java 代码未显示内联突出显示(Kotlin 工作正常)
- codeigniter - 有没有办法在视图中获取应用程序名称或打印根文件夹名称
- android - 现在需要 APK 签名方案 V2:Api 30
- android - Android 设备为 sim 号码的最后一位返回错误值
- reactjs - 从复选框数组中选中一个
- android - 我无法从路径中删除文件夹的内容
- git - 格式化(4 个空格)Visual Studio 中的所有代码文件?
- python - cx_oracle 使用关键字参数获取输入参数
- javascript - 将变换比例后的精灵图像定位为更小
- angular - 每次通过路由器导航页面时,Ionic Platform ready 都会触发