给k8s中绑定pv并在容器中运行中使用的pvc扩容

今天写一个简单的排错,主要是对容器使用中的pv,通过修改pvc的方式实现自动扩容。

发现故障并定位

今天打开好久不用的Vmware中的k8s集群,通过Lens发现有Prometheus服务的liveness 探针一直报错,也无法通过浏览器打开Prometheus;但是容器本身扔在运行,经查看同一个容器中的其他端口和服务也是正常的。

于是第一部,先通过kubectl logs 查看相应容器的错误。发现了如下的level是ERROR的错误一条,看起来是空间不够了。

bash 复制代码
time=2025-04-07T17:14:28.790Z level=ERROR source=head.go:698 msg="Loading on-disk chunks failed" component=tsdb err="iterate on on-disk chunks: corruption in head chunk file /prometheus/chunks_head/000031: head chunk file doesn't include enough bytes to read the chunk header - required:131264, available:131072, file:31"

因为这个是个Stateful, 容器需要PV来存储TSDB的数据,那就看一下这个容器相关pv和pvc的情况。查到这个果然是PVC动态生成的PV。

到PV实际所在的服务器,通过df-h命令查看,发现果然100%占用了。

bash 复制代码
/dev/dm-2       2.0G  2.0G  1.3M 100% /var/lib/kubelet/pods/54dcd1ea-51a8-49e6-b2c6-ded191e5f9bc/volumes/kubernetes.io~csi/pvc-4476e1d1-b45c-4d81-b65a-82e15e610668/mount

思考方案并解决问题

接下来就简单了, 总体来说 只要给PVC扩容就可以了。但是是否PV和绑定PV的容器都支持动态扩容呢? 我从来没做过了,所有要先研究下看看。

经查,我使用的用来动态通过PVC生成PV的SC 存储类 topolvm-provisioner是支持扩容的。 那就可以修改PVC然后触发PV变更了。

bash 复制代码
# 命令格式 kubectl edit pvc $pvc-name -n $NS
root@master:/opt/k8sconfig# k edit pvc prometheus-prometheus-stack-kube-prom-prometheus-db-prometheus-prometheus-stack-kube-prom-prometheus-0 -n monitoring
persistentvolumeclaim/prometheus-prometheus-stack-kube-prom-prometheus-db-prometheus-prometheus-stack-kube-prom-prometheus-0 edited

修改好PVC后,同步检测发现PV的容量已经扩大了,而我没有任何操作;同时容器仍旧报错。

接下来,直接删除旧容器,k8s根据原有的声明中的容器数量,马上生成了一个新容器,并继续bunding旧有且已扩容过的PV,故障排除了。

总结

  1. 和处理其他任何IT故障一样,有问题先看日志
  2. 大部分通过PVC动态创建的PV支持扩容,扩容方式就是简单的修改PVC配置文件
  3. 必要时,需要通过删除运行中的旧容器来使扩容的PV重新和容器绑定。不要犹豫,删除容器对k8s来说,几乎是个无风险操作。
相关推荐
阿里云云原生27 分钟前
无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测
云原生
阿里云云原生1 小时前
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
云原生·serverless
阿里云云原生1 小时前
Nacos-Controller 2.0:使用 Nacos 高效管理你的 K8s 配置
云原生
KubeSphere1 小时前
云原生周刊:K8s 中的 GPU 共享
kubernetes
西伯利亚猹2 小时前
Windows系统docker desktop安装(学习记录)
运维·docker·容器
CloudWeGo4 小时前
CloudWeGo 技术沙龙·深圳站回顾:云原生 × AI 时代的微服务架构与技术实践
微服务·云原生·架构
遇见火星4 小时前
基于Docker容器的CICD项目Jenkins/gitlab/harbor/Maven实战
docker·容器·gitlab·jenkins·maven·harbor·cicd
LCY1334 小时前
k8s 部署spring项目+动态启动pod
spring·容器·kubernetes
佳腾_7 小时前
【高性能缓存Redis_中间件】三、redis 精通:性能优化与生产实践
redis·缓存·云原生·中间件·云计算