更换 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 中没有实际数据,所以不能确定这样迁移是否切实可行。

posted @ 2021-12-03 15:37  dudu  阅读(1668)  评论(0编辑  收藏  举报