安全迁移节点
1. 迁移Pod
1.1. 设置节点是否可调度
确定需要迁移和被迁移的节点,将不允许被迁移的节点设置为不可调度。
# 查看节点
kubectl get nodes
# 设置节点为不可调度
kubectl cordon <NodeName>
# 设置节点为可调度
kubectl uncordon <NodeName>1.2. 执行kubectl drain命令
kubectl drain <NodeName> --force --ignore-daemonsets示例:
$ kubectl drain bjzw-prek8sredis-99-40 --force --ignore-daemonsets
node "bjzw-prek8sredis-99-40" already cordoned
WARNING: Deleting pods not managed by ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet: kube-proxy-bjzw-prek8sredis-99-40; Ignoring DaemonSet-managed pods: calicoopsmonitor-mfpqs, arachnia-agent-j56n8
pod "pre-test-pro2-r-0-redis-2-8-19-1" evicted
pod "pre-test-hwh1-r-8-redis-2-8-19-2" evicted
pod "pre-eos-hdfs-vector-eos-hdfs-redis-2-8-19-0" evicted1.3. 特别说明
对于statefulset创建的Pod,kubectl drain的说明如下:
kubectl drain操作会将相应节点上的旧Pod删除,并在可调度节点上面起一个对应的Pod。当旧Pod没有被正常删除的情况下,新Pod不会起来。例如:旧Pod一直处于Terminating状态。
对应的解决方式是通过重启相应节点的kubelet,或者强制删除该Pod。
示例:
2. kubectl drain 流程图
3. TroubleShooting
1、存在不是通过ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet创建的Pod(即静态pod,通过文件方式创建的),所以需要设置强制执行的参数--force。
2、存在DaemonSet方式管理的Pod,需要设置--ignore-daemonsets参数忽略报错。
4. kubectl drain
参考文档:
https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/
https://kubernetes.io/docs/tasks/run-application/configure-pdb/
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#drain
最后更新于
这有帮助吗?