Kubernetes 1.8中Jenkins Nexus Pod磁盘不足,PVC扩容受阻求助
刚好我对Kubernetes 1.8的PVC扩容流程比较熟悉,给你一步步拆解解决办法:
1. 先暂停Replication Controller的Pod自动重建
你遇到的核心问题之一是Replication Controller(RC)会自动维持指定副本数,删Pod后立刻重建,根本没法安心修改PVC。K8s 1.8确实没有kubectl stop命令,但我们可以通过调整RC的副本数来彻底停止Pod运行:
# 先确认你的RC名称,通常和jenkins-x-nexus相关 kubectl get rc # 将副本数设为0,关联的Pod会被终止且不会自动重建 kubectl scale rc <你的RC名称> --replicas=0
执行完后用kubectl get pods检查,直到看不到Jenkins Nexus的Pod为止。
2. 确保StorageClass支持扩容
Kubernetes 1.8里PVC扩容是beta特性,要求对应的StorageClass必须开启allowVolumeExpansion: true。先查看当前的StorageClass配置:
kubectl get storageclass kubectl describe storageclass <你的PVC使用的StorageClass名称>
如果描述里没有AllowVolumeExpansion: True,你需要先修改这个StorageClass(StorageClass的这个字段是可编辑的):
kubectl edit storageclass <你的StorageClass名称>
在spec区块里添加一行:allowVolumeExpansion: true,保存退出即可。
3. 执行PVC扩容操作
这时候再修改PVC的存储请求就不会遇到“字段不可变”的问题了。推荐用kubectl patch命令来修改,比直接编辑YAML更可靠:
# 示例:把存储容量从10Gi扩容到20Gi,替换成你需要的数值 kubectl patch pvc jenkins-x-nexus -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
执行后用kubectl get pvc jenkins-x-nexus查看状态,等状态变回Bound且容量更新为目标值。这里要分两种情况处理:
- 动态PV:如果你的PV是由StorageClass自动创建的,K8s会自动触发底层存储的扩容,无需额外操作;
- 静态PV:如果是手动创建的PV,你需要先扩容底层存储介质(比如云厂商的块存储、本地磁盘),然后修改PV的容量字段,最后再执行上面的PVC patch命令。
4. 恢复Pod运行
等PVC扩容完成后,把RC的副本数改回原来的数值(比如原来的1):
kubectl scale rc <你的RC名称> --replicas=1
这时候Jenkins Nexus的Pod会重新启动,挂载扩容后的PVC,磁盘空间不足的问题就解决了。
额外提醒
- K8s 1.8只支持PVC扩容,不支持缩容,所以新的存储容量必须大于原来的数值;
- 操作前建议备份一下PVC和RC的配置,避免意外:
kubectl get pvc jenkins-x-nexus -o yaml > pvc-backup.yaml、kubectl get rc <你的RC名称> -o yaml > rc-backup.yaml。
内容的提问来源于stack exchange,提问作者Kaigo

