在容器服务 TKE 的众多场景中,例如 K8S 版本升级、内核版本升级等,都需要进行节点移出再移入的操作。本文详细介绍了节点移出再移入的过程,主要分为以下几个步骤:
在集群节点进行移入再移出操作之前,需先将待移出节点上的 Pod 驱逐到其他节点上运行。驱逐的过程即逐个删除节点上的 Pod,再前往其他节点进行重建。
为了简化节点维护操作,K8S 引入了 drain
命令,其使用原理如下:
K8S 1.4 之后的版本,drain
操作为先对节点进行封锁,再对节点上的所有 Pod 进行删除操作。如果该 Pod 被 Deployment 等控制器所管理,则控制器在检查到 Pod 副本数减少的情况下,会重新创建一个 Pod ,调度到其他满足条件的节点上。如果该 Pod 是裸 Pod ,不被控制器管理,则驱逐后不会重新创建。
此过程是先删除,再创建,并非滚动更新。因此更新过程中,可能会导致被驱逐的服务部分请求失败,如果被驱逐的服务所有相关 Pod 都在被驱逐的节点上,则可能导致该服务完全不可用。
为了避免这一情况的出现, K8S 1.4 之后的版本引入了 PDB。只要在 PDB 策略文件中选中某个业务(一组 Pod),声明该业务可容忍的最小副本数量,此时再执行 drain
操作,将不再直接删除 Pod,而是会通过 evict api
检查是否满足 PDB 策略,只有在满足 PDB 策略的情况下才会对 Pod 进行删除,保护了业务可用性。需要注意的是,只有正确配置 PDB 策略才能保证 drain
操作时业务影响在可控范围内。
驱逐的过程涉及了 Pod 的重建,可能会对集群中的服务造成影响,因此建议在驱逐前执行如下检查:
hostpath volume
方式,则当 Pod 被调度到其他节点上时,数据会丢失,可能会对业务造成影响。如果是重要数据,建议先备份再进行驱逐。 说明:目前 kubelet 的镜像拉取策略是串行的,如果短时间内有大量的 Pod 都被调度到同一个节点上之后,Pod 的启动时间有可能会变长。
目前,对于 TKE 集群可以有以下两种方式完成驱逐:
当节点上运行的 Pod 被驱逐后,该节点处于封锁状态。如下图所示:
说明:
- 请记录该节点 ID,用于重新添加到集群。
- 如果该节点是按量计费节点,注意不要勾选销毁按量计费的节点,销毁后不可恢复。
注意数据盘挂载与容器目录默认不勾选。
如果您需要将容器和镜像存储在数据盘,则勾选数据盘挂载。选择数据盘挂载时,已格式化的 ext3、ext4、xfs 文件系统的系统盘将直接挂载,其他文件系统或未格式化的数据盘将自动格式化为 ext4 并挂载。
如果您需要保留数据盘数据并挂载,且需要避免数据盘被格式化,可参考以下步骤:
- 在“云服务器配置”页面,不勾选数据盘挂载。
- 打开“高级设置”,在“自定义数据”输入以下节点初始化脚本,并勾选开启封锁。如下图所示:
systemctl stop kubelet docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2) systemctl stop dockerd echo '/dev/vdb /data ext4 noatime,acl,user_xattr 1 1' >> /etc/fstab mount -a sed -i 's#"graph": "/var/lib/docker",#"data-root": "/data/docker",#g' /etc/docker/daemon.json systemctl start dockerd systemctl start kubelet
说明:节点添加成功后,处于封锁状态。
本页内容是否解决了您的问题?