本文主要描述通过控制台、Kubectl 等方式安全下线容器集群中节点的操作。
背景信息 在容器服务业务的日常维护中,有时需要对集群中的某一个节点进行下线操作,比如:版本升级、扩容、变更操作、停机运维、节点回收等。
容器服务支持下线集群中指定的节点。进行下线节点操作后,将把该节点内的所有 Pod(不包含 DaemonSet 管理的 Pod)驱逐到集群内其他节点上。新产生的 Pod 无法被调度到该节点上。
注意事项 移除节点会造成 Pod 迁移,可能会影响业务,请在业务低峰期操作。 操作过程中可能存在非预期风险,请提前做好相关的数据备份。 下线节点会导致集群内可用/可调度的 CPU、内存等资源减少,如果集群本身预留的可用资源不足,会影响后续正常业务的调度和存量业务的运行。 前置检查 在下线节点前需要检查节点的状态,以保证在节点下线过程中,服务不受影响。主要的检查项目如下。
检查项 检查详情 处理方案 节点上是否运行 ingress-controller Pod ingress 的重启或者迁移过程必定会带来客户端长连接请求断开,可能出现 502 请求。 如果断开业务不可避免,请在业务低峰期进行操作。 如果 ingress 使用 LoadBalancer/NodePort Service 对外服务,请保证在下线节点以外,其他节点上还有 ingress 副本。 如果 ingress 使用 Hostnetwork 对外服务,请先在调用端(外部负载均衡/外部网关等)删除对应的 IP 地址。 节点上是否存在强绑定节点的工作负载 1. 确认绑定节点的方式(label selector/ node name 等)。 2. 确认绑定节点原因(白名单、资源隔离等)。 调整强绑定节点的工作负载,将其迁移至别的节点后,再下线该节点。 节点上是否存在单副本的工作负载 确认使用单副本部署的原因(并发运行有冲突、节约资源等)。 如果可以扩容,先进行服务扩容,保证其他节点上存在该服务可用副本后,再下线节点。 如果不能扩容,评估是否可以接受节点下线导致的业务损失。 节点上是否存在 Static Pod 1. 确认使用 Static Pod 方式部署的原因。 2. 确认是否需要迁移,能否并发运行。 评估后,根据评估结果决定。 集群剩余资源是否足够承担下线节点的工作负载
通过控制台、OpenAPI、Kubectl 获取节点详情,查看当前节点目前资源使用情况以及集群剩余资源量。
注意
如果被下线节点上存在请求(Request)高的服务时,可能出现集群资源总量足够却无法调度的情况,即大量的资源碎片。
评估后,根据评估结果决定。
节点上部署的工作负载是否支持平滑迁移 服务的平滑迁移包含: 1. 被关闭的副本不再接受新请求并且能够正常处理掉所有已接收的请求后退出。 2. 新启动的服务需要在就绪后再开始接受请求。 如果服务是通过 Service 对外暴露的,被关闭的副本不会再接受新请求。如果服务是对外直接暴露端点,即端到端访问(例如有额外的服务注册发现中心),需要服务在接收到退出信号时能主动将自身从列表中摘除。 保证正常处理掉所有已接收请求,需要程序能够接收并拦截退出信号 SIGTERM(默认退出信号,可以在 Dockerfile 中自行指定),接收到信号后需要保证请求处理完毕后自行退出。服务需要自行评估需要多少时间能够处理完毕所有请求,并合理设置 Pod 的terminationGracePeriodSeconds
参数。 保证新服务在就绪前不接受请求。如果服务是通过 Service 对外暴露,则通过合理的配置程序的就绪检查即可。如果服务是对外直接暴露端点(例如有额外的服务注册发现中心),需要服务能够在就绪后再向注册中心注册自己。
操作步骤 在通过所有前置检查后,可以开始下线节点。目前集群支持如下两种方法下线节点:
在容器服务控制台上完成节点下线操作。 通过 Kubectl 自行开发代码,完成节点下线操作。 通过容器服务页面操作节点下线 登录 容器服务控制台 ,在左侧导航栏中选择 集群 。 单击目标集群名称,在集群管理页面的左侧导航栏中选择 节点 。 确保节点状态正常且不影响服务的情况下,单击目标节点右侧 操作 列下的 下线 。 在弹出的确认下线节点窗口,单击 确定 ,完成节点下线。
节点下线时,除了系统组件以及 Daemonset 以外的 Pod 会进入 Terminating 状态。观察节点 Pod 列表 ,当所有业务 Pod 被驱逐成功后,节点状态会变为 已下线 且不可调度。此时节点下线操作完成,之后可以进行移除节点/节点配置修改等操作。 通过 Kubectl 自行实现代码下线节点 可参考 kubernetes 官方相关操作手册,安全地清空一个节点 。