k8s 维护node与驱逐pod

1.维护node节点

设置节点状态为不可调度状态,执行以下命令后,节点状态会多出一个SchedulingDisabled的状态,即新建的pod不会往该节点上调度,本身存在node中的pod保持正常运行

kubectl cordon k8s-node01

kubectl get node

k8s 维护node与驱逐pod_第1张图片

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

你可能感兴趣的:(kubernetes,kubernetes,linux,容器)