最近我們在 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 中沒有實際數據,所以不能確定這樣遷移是否切實可行。
