在GKE上配置Kubelet阈值解决nodeHasDiskPressure临时告警问题
解决GKE节点部署后触发nodeHasDiskPressure告警的配置方案
我之前也碰到过一模一样的情况——每次部署应用后,GKE节点总会触发磁盘压力告警,过十来分钟又自动恢复。其实这大多是因为GKE默认的磁盘压力阈值比较严格,部署时临时的磁盘占用(比如拉取镜像、生成临时文件)刚好触碰到了阈值。下面是几种在GKE里调整这些阈值的可行方法:
1. 自定义节点池的kubelet驱逐阈值
GKE允许在自定义节点池中配置kubelet的驱逐参数,用来调整磁盘压力的触发条件。你可以通过gcloud命令创建或更新节点池时指定这些参数:
创建新的自定义节点池
gcloud container node-pools create disk-friendly-pool \ --cluster=你的集群名称 \ --zone=你的集群区域 \ --kubelet-config=eviction-hard=imagefs.available<15%,nodefs.available<10% \ --kubelet-config=eviction-soft=imagefs.available<20%,nodefs.available<15% \ --kubelet-config=eviction-soft-grace-period=imagefs.available=5m,nodefs.available=5m
更新已有自定义节点池
如果已经有节点池,也可以直接更新:
gcloud container node-pools update 你的节点池名称 \ --cluster=你的集群名称 \ --zone=你的集群区域 \ --kubelet-config=eviction-hard=imagefs.available<15%,nodefs.available<10%
参数说明:
eviction-hard:硬阈值,达到后立即驱逐Pod(默认更严格,比如nodefs.available<10%可能默认是5%)eviction-soft:软阈值,达到后等待指定宽限期再驱逐imagefs:对应容器镜像存储的磁盘分区,nodefs是节点的根磁盘分区
2. 扩容节点磁盘大小
如果你的节点本身磁盘容量偏小,部署时的临时占用很容易触达阈值。直接扩容节点磁盘是最直接的缓解方式:
gcloud container node-pools update 你的节点池名称 \ --cluster=你的集群名称 \ --zone=你的集群区域 \ --disk-size=60GB
扩容后需要滚动重启节点池才能让新的磁盘大小生效:
gcloud container node-pools rollout restart 你的节点池名称 \ --cluster=你的集群名称 \ --zone=你的集群区域
3. 调整镜像GC清理阈值
GKE节点会自动清理旧容器镜像,但默认的清理触发阈值可能偏高,导致镜像堆积占用磁盘。可以通过kubelet参数调整:
gcloud container node-pools update 你的节点池名称 \ --cluster=你的集群名称 \ --zone=你的集群区域 \ --kubelet-config=image-gc-high-threshold=85% \ --kubelet-config=image-gc-low-threshold=70%
这样当磁盘使用率超过85%时,镜像GC会自动启动,清理到使用率降到70%为止,减少磁盘占用压力。
注意事项
- 只有自定义节点池支持配置这些kubelet参数,托管节点池(默认创建的)无法修改这类参数
- 阈值设置不要过于宽松,否则真的出现磁盘资源耗尽时,节点无法及时触发告警和驱逐,会影响集群稳定性
- 调整后建议多部署几次应用观察,根据实际情况微调参数
内容的提问来源于stack exchange,提问作者snowflakekiller




