更换 Kubernetes Storage Class 所使用的 NAS
最近我们在 kubernetes 集群上部署 rabbitmq 时遇到一个场景,需要将 rabbitmq 使用的 persistent volume 从阿里云性能型 nas 切换为极速型 nas,因为只有极速型 nas 才支持快照与备份功能。
Persistent volume 是基于 kubernets dynamic volume provisioning 创建的,这篇博文分享一下我们的操作步骤。
修改 StorageClass
需要修改的参数是 server,但 kubernetes 不允许直接通过 kubectl edit 命令修改,会报错"Forbidden: updates to parameters are forbidden",只能通过资源清单文件强制替换。
资源清单:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: sc-nas-production-pvs
annotations:
storageclass.kubernetes.io/is-default-class: "true"
mountOptions:
- nolock,tcp,noresvport
- vers=3
parameters:
volumeAs: subpath
server: xxxxxx.cn-hangzhou.extreme.nas.aliyuncs.com:/production/k8s-pvs/
provisioner: nasplugin.csi.alibabacloud.com
reclaimPolicy: Retain
强制替换 StorageClass 的命令:
kubectl replace -f nas-production-pvs.yaml --force
修改 PersistentVolumeClaim
PersistentVolumeClaim 也不让直接修改,会报错"Forbidden: spec.persistentvolumesource is immutable after creation",也需要采用资源清单文件强制替换的方式。
导出已有 pvc 的资源清单
kubectl get pvc data-rabbitmq-0 -o yaml > data-rabbitmq-0.yaml
删除 data-rabbitmq-0.yaml 中的 status、volumeMode、volumeName 部分,得到下面的资源清单文件
piVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
pv.kubernetes.io/bind-completed: "yes"
pv.kubernetes.io/bound-by-controller: "yes"
volume.beta.kubernetes.io/storage-provisioner: nasplugin.csi.alibabacloud.com
labels:
app.kubernetes.io/instance: rabbitmq
app.kubernetes.io/name: rabbitmq
name: data-rabbitmq-0
namespace: production
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
storageClassName: sc-nas-production-pvs
然后用这个 yaml 文件强制替换已有的 pvc
kubectl replace -f data-rabbitmq-0.yaml --force
Dynamic volume provisioning 会自动基于新的 nas 创建 PersistentVolume
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nas-d0c28e12-39b5-4b4f-b893-03dd28d1cef8 8Gi RWO Retain Bound production/redis-data-redis-master-0 sc-nas-production-pvs 174d
注:在此期间需要重启 rabbitmq 的 pods
kubectl rollout restart statefulset/rabbitmq
迁移数据文件
- 将原 nas 中的 rabbitmq 数据文件复制到新 nas 中
cp -r /nas/k8s-pvs/nas-f17c6bb8-5848-46a7-97bb-80c1fa52a619/* /nas-k8s/production/k8s-pvs/nas-e4324c56-af56-440b-a530-6671b3bfe879
重启 rabbitmq 的 pods 以使用新的数据文件
kubectl rollout restart statefulset/rabbitmq
注:迁移数据文件这一步由于操作时 rabbitmq 中没有实际数据,所以不能确定这样迁移是否切实可行。