最近公司服务器到期,需要调整配置,但是配置调整的话,节点必须要重启的。其他情况下, 比如节点进行打补丁、操作系统升级等操作时,需停机维护,这就涉及pod驱逐迁移。今天说一下调整的过程,以及调整过程中碰到的问题。
设置节点不可调度
设置xuh04不可调度,查看各节点状态,xuh04为SchedulingDisabled,此时master不会将新的pod调度到该节点上,但是该节点上的pod还是正常运行。
驱逐节点上的pod
kubectl drain xuh04 --delete-emptydir-data --ignore-daemonsets --force
kubectl drain 命令参数说明
–delete-emptydir-data 即使pod使用了emptyDir也删除
–ignore-daemonsets 忽略deamonset控制器的pod,如果不忽略,deamonset控制器控制的pod被删除后可能马上又在此节点上启动起来,会成为死循环;
--force 不加force参数只会删除该NODE上由ReplicationController, ReplicaSet, DaemonSet,StatefulSet或者Job创建的Pod,加了后还会删除’裸奔的pod’(没有绑定到任何replication controller)
# kubectl uncordon xuh04
node/xuh04 uncordoned
# kubectl delete node xuh04
没有驱逐节点上的pod,不要直接重启,直接重启的话,会造成pod状态丢失
导致pod不能调度到其他节点,如果不是多副本的话,服务会直接挂掉。直到节点恢复正常。
为了确保drain驱逐pod的时候,容器应用服务不中断,必须满足:
要驱逐的pod副本数量必须大于1
要配置"反亲和策略",确保被驱逐的pod被调度到不同的Node节点上
deployment采用滚动更新,设置maxUnavailable为0,maxSurge为1
使用PodDisruptionBudget (PDB)保护应用程序
由于时间问题,没有尝试,查了下解决方案
https://kuboard.cn/learning/k8s-intermediate/workload/disruption-exam