k8s 维护node与驱逐pod

本文介绍了如何在Kubernetes环境中管理节点。首先,通过`kubectlcordon`设置节点为不可调度状态,防止新Pod部署。接着,使用`kubectldrain`命令驱逐节点上的Pod,这个过程包括标记删除、优雅关闭和强制终止。`--ignore-daemonsets`和`--delete-local-data`是两个重要的选项。当需要删除特定Pod时,可以直接使用`kubectldeletepod`。在操作完成后,可以使用`kubectluncordon`恢复节点为可调度状态。

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

### KubernetesNode Pod 的关系详解 在 Kubernetes 编排系统中,NodePod 是两个核心概念,二者之间的关系构成了整个系统的运行基础。 #### 节点(NodeNodeKubernetes 集群中的工作机器,可以是物理机或虚拟机。每个 Node 都由 kubelet 进程管理,负责维护运行在其上的容器化应用程序。Node 提供了实际的计算资源(CPU、内存等),并承载着 Pod 的运行环境[^1]。 #### 工作负载单元(PodPodKubernetes 中最小的部署单元,代表集群中运行的一个进程。一个 Pod 可以包含一个或多个容器,这些容器共享网络命名空间、存储卷以及其他资源。Pod 设计的目的在于简化多容器协同工作的场景,同时也提供了更细粒度的控制能力[^3]。 #### 关系概述 - **资源分配**:NodePod 提供必要的计算资源(如 CPU、内存)。Kubernetes 使用调度器将 Pod 分配到合适的 Node 上运行,这一过程基于多种因素,包括资源需求、亲和性规则以及污点容忍配置。 - **生命周期绑定**:一旦某个 Pod 被调度到特定的 Node 上,它的生命周期便Node 密切关联。如果 Node 出现故障或者资源耗尽,则可能触发 Pod 的重新调度或其他保护措施,例如驱逐低优先级的 Pod 来释放资源[^2]。 - **动态调整**:随着应用负载的变化,新的 Pods 不断被创建并分发至各个 Nodes;同时旧有的 Pods 如果不再需要也会被销毁回收对应的资源份额。这种灵活机动的特点使得 Kubernetes 得以支持大规模分布式系统的高效运作[^1]。 以下是通过 YAML 文件定义简单 BusyBox 测试 Pod 并验证其状态的例子: ```yaml apiVersion: v1 kind: Pod metadata: name: busybox-test-pod spec: containers: - name: busybox-container image: busybox:1.30 command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600'] ``` 执行如下命令完成实例化: ```bash kubectl apply -f pod-definition.yaml kubectl get pods --watch ``` 观察输出确认 Pod 是否成功启动及其所在位置信息。 --- #### 特殊情况处理 当遇到诸如 `FailedScheduling` 错误提示时,通常意味着没有足够的符合条件的节点可供安排新来的 Pod 请求。这可能是由于标签选择器不匹配或者是硬件规格不足以满足声明的要求所致[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值