如何将手动预配Azure Managed Disk设为K8s持久卷并适配Jenkins Helm Chart?
其实步骤很清晰,只要确保磁盘和K8s集群的基础环境匹配(同区域、同资源组或集群有权限访问),跟着下面的步骤来就行:
第一步:获取Azure Managed Disk的资源标识
先通过Azure CLI拿到磁盘的资源ID,这个是K8s用来识别磁盘的关键:az disk show --name <你的磁盘名称> --resource-group <磁盘所在资源组> --query id -o tsv执行后会输出一串类似
/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Compute/disks/xxx的字符串,记下来。第二步:创建Persistent Volume(PV)配置文件
新建一个pv-azure-managed-disk.yaml,内容如下,注意替换占位符:apiVersion: v1 kind: PersistentVolume metadata: name: azure-managed-disk-pv spec: capacity: storage: 10Gi # 要和你的磁盘实际容量匹配 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain # 可选:Retain/Delete/Recycle,根据你的需求选 storageClassName: "managed-disk-sc" # 自定义存储类名称,后面PVC要对应 azureDisk: kind: Managed diskURI: <第一步拿到的磁盘资源ID> diskName: <你的磁盘名称> fsType: ext4 # 磁盘的文件系统类型,提前格式化过的话要对应第三步:部署PV并验证
执行命令创建PV:kubectl apply -f pv-azure-managed-disk.yaml用
kubectl get pv查看状态,应该显示Available。第四步:创建匹配的Persistent Volume Claim(PVC)
新建pvc-azure-managed-disk.yaml:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azure-managed-disk-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi # 和PV的容量一致 storageClassName: "managed-disk-sc" # 和PV的存储类名称完全匹配部署后用
kubectl get pvc检查,状态变成Bound就说明绑定成功了,之后就能在Pod里引用这个PVC了。
你提到的问题大概率是因为直接引用了存储账户里的VHD文件,而没有通过Managed Disk的方式来配置PV。K8s的azureDisk插件更推荐用Managed Disk而非直接指向VHD,下面是具体的解决步骤:
第一步:把VHD转换成Managed Disk(如果还没转的话)
如果你的磁盘目前只是存储账户里的VHD文件,先通过Azure CLI转换成Managed Disk,这样K8s才能更好地管理:az disk create --name <新的Managed Disk名称> --resource-group <资源组名称> --source <VHD的完整URL> --sku Standard_LRS # 可根据需求替换SKU,比如Premium_LRS转换完成后,按照问题1的步骤创建对应的PV和PVC。
第二步:配置Jenkins Helm Chart使用已有的PVC
Jenkins的Helm Chart默认会自动创建PVC,你需要禁用这个行为,指定你预配好的PVC名称。有两种方式:- 安装时通过参数指定:
helm install jenkins jenkins/jenkins \ --set persistence.enabled=true \ --set persistence.existingClaim=<你的PVC名称> \ --set persistence.storageClass="" # 留空表示使用PVC绑定的PV的存储类 - 自定义values.yaml文件:
在values.yaml里修改以下配置:
然后执行persistence: enabled: true existingClaim: "<你的PVC名称>" storageClass: ""helm install jenkins jenkins/jenkins -f values.yaml
- 安装时通过参数指定:
第三步:验证部署
部署完成后,用kubectl get pods查看Jenkins Pod的状态,等它变成Running后,检查磁盘是否正确挂载:kubectl exec -it <jenkins-pod-name> -- df -h如果你之前的Jenkins数据在VHD里,转换成Managed Disk后挂载进去,数据应该会保留。
如果还是有问题,可以查看Jenkins Pod的日志排查:
kubectl logs <jenkins-pod-name>
内容的提问来源于stack exchange,提问作者anschoewe




