1.维护node节点
设置节点状态为不可调度状态,执行以下命令后,节点状态会多出一个SchedulingDisabled的状态,即新建的pod不会往该节点上调度,本身存在node中的pod保持正常运行
kubectl cordon k8s-node01
kubectl get node
2.驱逐pod
在node节点设置为不可调度状态后,就可以开始驱逐本节点上的pod了
kubectl drain k8s-node01 --ignore-daemonsets --delete-local-data
--delete-local-data
:在驱逐节点之前,删除该节点上的 Pod 的本地数据。本地数据包括 Pod 的日志、镜像和其他本地数据。如果不添加此选项,则本地数据将保留在节点上,并且需要手动清理
--ignore-daemonsets
:忽略 DaemonSet 类型的 Pod。DaemonSet 是一种在 Kubernetes 集群的每个节点上运行一个 Pod 的控制器。如果不添加此选项,则 kubectl drain
命令会尝试驱逐所有类型的 Pod,包括 DaemonSet 类型的 Pod。在某些情况下,DaemonSet 类型的 Pod 是必需的,因此应该使用此选项来忽略它们
驱逐pod的工作流程:
1.首先,Kubernetes 会将 Pod 标记为“删除中”,并阻止新的请求发送到该 Pod
2.然后,Kubernetes 会向 Pod 发送 SIGTERM 信号,触发优雅关闭。在容器中运行的进程可以捕获此信号并执行清理操作
3.如果在默认的 30 秒的优雅期内 Pod 没有关闭,则 Kubernetes 会发送 SIGKILL 信号来强制终止 Pod
如果实在驱逐不掉可以加上--force 参数
--force
:强制驱逐节点上的所有 Pod。如果不添加此选项,则 kubectl drain
命令会等待所有 Pod 关闭或重新调度到其他节点上。如果某些 Pod 无法正常关闭或重新调度,则 kubectl drain
命令会一直等待,直到超时。使用 --force
选项可以强制终止所有 Pod 并立即驱逐节点。需要注意的是,这可能会导致数据丢失或其他不良影响,因此应该谨慎使用
在node节点驱逐完所有pod后,可以对该node节点升级硬件资源等操作
3.删除pod
若是在新加入工作节点,只想调度一部分pod到新节点上的情况下,需要使用删除pod的方法去实现
需要对所有旧的node节点都设置不可调度状态,在执行删除pod操作
kubectl cordon k8s-node02
kuebctl delete pod pod名称 -n 名称空间
此时被删除的pod就会调度到新的node节点上
删除pod的工作流程:
1.首先,Kubernetes 会将 Pod 标记为“删除中”,并阻止新的请求发送到该 Pod
2.然后,Kubernetes 会向 Pod 发送 SIGTERM 信号,触发优雅关闭。在容器中运行的进程可以捕获此信号并执行清理操作
3.如果在默认的 30 秒的优雅期内 Pod 没有关闭,则 Kubernetes 会发送 SIGKILL 信号来强制终止 Pod
也可以在delete命令中使用如下参数修改默认的优雅关闭时间--grace-period=30
调度完成后,恢复旧的node节点为可调度状态
kubectl uncordon k8s-node02