排空的意思是,将本节点上的POD容器进行驱逐,驱逐后 原Pod会由集群重新调度到其他节点。排空操作一般用于节点问题排查与升级等。
1)选择设置为不可调度,节点状态变为不可调度。即在后续进行应用部署时,Pod不会再调度到该节点。
2)选择设置为可调度,节点状态变为可调度。
3)选择排空节点(同时设置为不可调度),节点状态变为不可调度,同时会将节点上已经存在的Pod进行(排空)驱逐,pod会被调度到其他节点进行重建。注意:节点上由守护进程集DaemonSet控制的Pod不会被排空。
当节点不可调度时,新的容器(比如新的发布)不会再调度到该节点。可以手动将节点状态设置为不可调度。
节点不可用,集群认为节点not ready。
通常地,节点不可调用(非主动设置)和节点不可用,一般是由于节点出现了异常状况,比如磁盘满、机器负载过高(节点上kubelet进程无法和集群通信)、网络不可用、docker进程hung住、PLEG异常等,可以进入运维中心-集群-节点-管理,看到节点状态。
例如:某个节点出现PLEG异常导致节点不可用。
导致PLEG异常的原因可能是:
1)由于Docker管理进程(Docker Daemon)异常导致,可以尝试重启kubelet;再尝试重启Docker进程。
//重启kubelet systemctl restart kubelet //重启docker systemctl restart docker //查看docker日志 journalctl -xeu docker > docker.log
2)是由于systemd版本问题导致,重启节点可短暂修复,彻底解决的话需要升级节点的systemd。
systemd: (rpm -qa | grep systemd, 版本<219-67.el7需要升级) 升级systemd指令: yum update -y systemd && systemctl daemon-reexec && killall runc
附:journalctl -xeu kubelet > kubelet.log,将kubelet日志输出到文件中,具体问题具体分析
在某些情况下,需要对ECS本身进行升级和维护,比如上面例子中的升级systemd,或者磁盘清理、挂载新的数据盘、漏洞修复、扩容系统盘等等。操作过程中如果会影响到docker或kubelet的运行,导致节点上面的业务POD不可用。
推荐的操作流程如下:
1)排空节点并设置为不可调度。目的是将已经部署的POD部署到其他节点上,注意:其他节点如果资源不够(或者因为什么原因状态异常 不可调度),也是无法部署的,会影响业务。
2)进行节点升级或维护操作。
3)重新设置节点为可调度。
ECS节点重启会导致已经运行中的容器失联而引发线上业务问题,所以一般不推荐直接重启集群中的ECS机器。最好在节点排空已有容器之后操作。参考上方《节点排空》的操作步骤。
通用恢复流程:
1. 先登录异常节点重启kubelet,然后查看是否恢复可用。
//重启节点上的kubelet,对已运行的容器没有影响 systemctl restart kubelet
如果恢复,则问题解决。后续如果怀疑该节点ECS异常,可以排空(节点维护)将Pod迁移到其他节点避免再次发生不可用影响业务,后续针对该ECS定位问题。
2. 登录异常节点重启docker daemon进程,然后查看是否恢复可用。
//重启docker,对已运行的容器没有影响 systemctl restart docker
3. 如果步骤1、2中重启kubelet docker等均没有效果,节点依然不可用,那么需要强制重启ECS节点。通常该操作后可以恢复。 不可用的原因包括负载过高等因素。
4. 避免节点不可用的建议: 保持节点和集群的合理水位,避免节点超卖严重。高负载情况会让kubelet得不到同步状态的机会。即便有部分节点NotReady,也可以使Pod驱逐、排水到其他节点。 部署npd,node export等监控组件,npd可以发现PID、磁盘空间不足等异常;node export可以较好发现NodeNotReady的异常。
容器实例状态异常包括但不限于:
1)本该下线的容器实例长时间没有下线成功
2)部分容器实例一直挂起(需要先排除由于健康检查配置导致的异常)
请在容器实例页面找到容器对应宿主机,登录宿主机执行下面的命令尝试恢复:
1. 重启kubelet服务(不影响已运行的容器)
//重启节点上的kubelet,对已运行的容器没有影响 systemctl restart kubelet //查看kubelet日志 journalctl -xeu kubelet > kubelet.log
等待几分钟,观察容器实例状态是否正常同步。
2. 重启docker服务(不影响已运行的容器)
一般docker主进程挂掉会导致像docker ps,或docker exec等命令hung住或异常失败。
//重启节点上的docker daemon,对运行中容器没有影响 systemctl restart docker //查看docker日志 journalctl -xeu docker > docker.log
等待几分钟,观察容器实例状态是否正常同步。
3. 在ECS节点已经排空的情况下尝试节点重启。
ECS节点重启会导致已经运行中的容器失联而引发线上业务问题,所以最好在节点排空已有容器之后操作。参考上方《节点排空》的操作步骤。