Kubernetes 节点存储阈值与 Pod 驱逐机制笔记

一、节点根目录使用阈值

1.1 阈值引发的驱逐情况

在 Kubernetes 集群中,节点根目录的使用情况会根据不同配置和实际场景有所变化。当根目录使用量超过设定的阈值时,节点可能会启动 Pod 驱逐流程。

1.2 默认阈值情况

不同 Kubernetes 版本的默认根目录使用阈值存在差异:

  • 在 Kubernetes 1.15 及之前的版本中,默认根目录使用阈值为 90%。
  • 在 Kubernetes 1.16 及之后的版本中,默认根目录使用阈值调整为 80%。

若 kubelet 配置文件中未明确设置根目录使用阈值,Kubernetes 将采用对应版本的默认阈值。

1.3 阈值修改方法

可以通过修改 kubelet 的配置来调整根目录使用阈值。kubelet 的配置文件通常位于 /etc/kubernetes/kubelet.conf 。修改时,可在 kubelet 的启动参数中添加 --eviction - hard 相关设置,示例如下:

--eviction - hard=memory.available<500Mi,nodefs.available<10%,nodefs.inodesFree<5%

其中:

  • nodefs.available:用于设置节点根目录可用空间的百分比阈值,当根目录使用超过该阈值时,节点将启动驱逐流程。
  • memory.available:设置内存可用的百分比或绝对值。
  • nodefs.inodesFree:设置节点根目录可用的 inode 百分比。

注意事项:修改 kubelet 配置文件前,请务必备份原始配置文件,以防需要还原。同时,驱逐过程可能导致节点上的 Pod 被删除,调整阈值时需谨慎。建议在根目录使用接近阈值时,及时进行清理或扩容操作,避免触发驱逐。

1.4 相关图示

阈值相关图片1
阈值相关图片2
阈值相关图片3
阈值相关图片4
阈值相关图片5
阈值相关图片6

二、/var/lib/docker/ 和 /var/lib/kubelet/ 目录满导致的 Pod 驱逐

2.1 驱逐顺序

/var/lib/docker//var/lib/kubelet/ 目录满时,kubelet 会按照以下顺序执行 Pod 驱逐操作:

  1. 驱逐非必需的本地存储卷绑定的 Pod:若 Pod 使用了本地存储卷且无其他节点备份,磁盘空间不足时,kubelet 会优先驱逐这类 Pod。
  2. 驱逐最早未使用的 Pod(LRU):若第一步无法释放足够空间,kubelet 会选择最近最久未使用的 Pod 进行驱逐,这类 Pod 通常优先级较低、重要性不高。
  3. 驱逐运行着的、优先级低的 Pod:若前两步仍无法满足空间需求,kubelet 可能会驱逐优先级较低的运行中 Pod。Pod 优先级可通过设置 PodSpecpriorityClass 或者依据 Pod 的 QoS 类型来定义。

2.2 Pod 的 QoS 等级

Kubernetes 根据 Pod 的资源需求和容忍度,将 Pod 划分为三个品质服务(Quality of Service, QoS)等级,这些等级与 Pod 的调度、驱逐和资源分配相关:

  • Guaranteed(保证):此类 Pod 有明确的 CPU 和内存资源需求,在集群中默认不会被驱逐,可保证获得所需资源。
  • Burstable(可伸缩):Pod 有一定资源限制,但可根据工作负载瞬时需求使用更多资源,可能与其他 Pod 竞争资源,在资源紧张时可能被驱逐。
  • BestEffort(尽力而为):Pod 无明确资源需求,优先级最低,会尽量使用剩余空闲资源,资源紧张时会首先被驱逐。

虽然目录满时的驱逐顺序与 QoS 等级无直接关联,但 QoS 等级会影响 Pod 在集群中的调度、资源分配和优先级。

2.3 日志查看与参考链接

2.4 优先级规划建议

在实际部署中,可根据业务需求为不同类型的 Pod 设置不同优先级,确保重要应用或服务稳定运行。设置 Pod 优先级可通过 priorityClass 字段或 annotation 实现,可在 Pod 创建时使用 kubectl 或编排工具(如 Helm)进行配置。进行优先级规划时,需综合考虑应用需求、资源分配和业务优先级等因素。

2.5 官方文档参考

Node - pressure Eviction

三、修改驱逐阈值

1.备份kubelet的配置文件

cp /var/lib/kubelet/config.yaml /root/kubelet-config-bak.yaml

2.修改kubelet的配置文件,vi /var/lib/kubelet/config.yaml 增加以下内容

evictionSoft:
  imagefs.available: 5%
  imagefs.inodesFree: 5%
  memory.available: 100Mi
  nodefs.available: 5%
  nodefs.inodesFree: 5%
evictionSoftGracePeriod:
  imagefs.available: 30s
  imagefs.inodesFree: 30s
  memory.available: 10s
  nodefs.available: 30s
  nodefs.inodesFree: 30s

在这里插入图片描述

3. 执行systemctl restart kubelet重启kubelet

systemctl restart kubelet

4. 执行systemctl status kubelet确保kubelet运行正常

systemctl status kubelet

5. 执行kubectl get node确保节点状态正常

kubectl get node
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐