1.15集群如何从flexvolume存储类型迁移到csi everest存储类型-九游平台
在v1.15.11-r1之后版本的集群中,csi everest插件已接管fuxi flexvolume(即storage-driver插件)容器存储的所有功能,建议将对fuxi flexvolume的使用切换csi everest上。
迁移的主要原理是通过创建静态pv的形式关联原有底层存储,并创建新的pvc关联该新建的静态pv,之后应用升级挂载这个新的pvc到原有挂载路径,实现存储卷迁移。
迁移时会造成服务断服,请合理规划迁移时间,并做好相关备份。
操作步骤
- 数据备份(可选,主要防止异常情况下数据丢失)。
- 根据flexvolume格式的pv,准备csi格式的pv的yaml文件关联已有存储。
执行如下命令,配置名为“pv-example.yaml”的创建pv的yaml文件。
touch pv-example.yaml
vi pv-example.yaml
云硬盘存储卷pv的配置示例如下:apiversion: v1 kind: persistentvolume metadata: labels: failure-domain.beta.kubernetes.io/region: cn-north-4 failure-domain.beta.kubernetes.io/zone: <zone name> annotations: pv.kubernetes.io/provisioned-by: everest-csi-provisioner name: pv-evs-example spec: accessmodes: - readwriteonce capacity: storage: 10gi csi: driver: disk.csi.everest.io fstype: ext4 volumeattributes: everest.io/disk-mode: scsi everest.io/disk-volume-type: sas storage.kubernetes.io/csiprovisioneridentity: everest-csi-provisioner volumehandle: 0992dbda-6340-470e-a74e-4f0db288ed82 persistentvolumereclaimpolicy: delete storageclassname: csi-disk
加粗标红字段需要重点关注,其中参数说明如下:
表1 云硬盘存储卷pv配置参数说明 参数
描述
failure-domain.beta.kubernetes.io/region
云硬盘所在region,可参考flexvolume pv的相同字段。
failure-domain.beta.kubernetes.io/zone
云硬盘所在可用区,可参考flexvolume pv的相同字段。
name
pv资源的名称,集群下唯一。
storage
云硬盘的容量,单位为gi。可参考flexvolume pv的spec.capacity.storage。
driver
挂载依赖的存储驱动,evs云硬盘配置为“disk.csi.everest.io”。
volumehandle
云硬盘的volumeid,可参考flexvolume pv的spec.flexvolume.options.volumeid。
everest.io/disk-mode
云硬盘磁盘模式,可参考flexvolume pv的spec.flexvolume.options.disk-mode。
everest.io/disk-volume-type
云硬盘类型,当前支持高i/o(sas)、超高i/o(ssd)。可参考flexvolume pv的spec.storageclassname对应的sc中的parameters."kubernetes.io/volumetype"。
storageclassname
存储卷动态供应关联的k8s storage class名称;云硬盘需使用“csi-disk”。
文件存储卷pv配置示例如下:
apiversion: v1 kind: persistentvolume metadata: name: pv-sfs-example annotations: pv.kubernetes.io/provisioned-by: everest-csi-provisioner spec: accessmodes: - readwritemany capacity: storage: 10gi csi: driver: nas.csi.everest.io fstype: nfs volumeattributes: everest.io/share-export-location: sfs-nas01.cn-south-1.myhuaweicloud.com:/share-436304e8 storage.kubernetes.io/csiprovisioneridentity: everest-csi-provisioner volumehandle: 682f00bb-ace0-41d8-9b3e-913c9aa6b695 persistentvolumereclaimpolicy: delete storageclassname: csi-nas
加粗标红字段需要重点关注,其中参数说明如下:
表2 文件存储卷pv配置参数说明 参数
描述
name
pv资源的名称,集群下唯一。
storage
文件存储的大小,单位为gi。可参考flexvolume pv的spec.capacity.storage。
driver
挂载依赖的存储驱动,文件存储配置为“nas.csi.everest.io”。
everest.io/share-export-location
文件存储的共享路径。可参考flexvolume pv的spec.flexvolume.options.devicemountpath。
volumehandle
文件存储的id。可参考flexvolume pv的spec.flexvolume.options.volumeid。
storageclassname
k8s storage class名称;需配置为"csi-nas"。
对象存储卷pv配置示例如下:
apiversion: v1 kind: persistentvolume metadata: name: pv-obs-example annotations: pv.kubernetes.io/provisioned-by: everest-csi-provisioner spec: accessmodes: - readwritemany capacity: storage: 1gi csi: driver: obs.csi.everest.io fstype: s3fs volumeattributes: everest.io/obs-volume-type: standard everest.io/region: cn-north-4 storage.kubernetes.io/csiprovisioneridentity: everest-csi-provisioner volumehandle: obs-normal-static-pv persistentvolumereclaimpolicy: delete storageclassname: csi-obs
加粗标红字段需要重点关注,其中参数说明如下:
表3 对象存储卷pv配置参数说明 参数
描述
name
pv资源的名称,集群下唯一。
storage
存储容量,单位为gi。此处配置为固定值1gi。
driver
挂载依赖的存储驱动,对象存储配置为“obs.csi.everest.io”。
fstype
文件类型,支持“obsfs”与“s3fs”,取值为s3fs时创建是obs对象桶,配套使用s3fs挂载;取值为obsfs时创建的是obs并行文件系统,配套使用obsfs挂载。可参考flexvolume pv的spec.flexvolume.options.posix的对应关系:true(obsfs)、false/空值(s3fs)。
everest.io/obs-volume-type
存储类型,包括standard(标准桶)、warm(低频访问桶)。可参考flexvolume pv的spec.flexvolume.options.storage_class的对应关系:standard(标准桶)、standard_ia(低频访问桶)。
everest.io/region
对象存储所在的region。可参考flexvolume pv的spec.flexvolume.options.region。
volumehandle
对象存储的桶名称。可参考flexvolume pv的spec.flexvolume.options.volumeid。
storageclassname
k8s storage class名称;需配置为"csi-obs”。
极速文件存储卷pv配置示例如下:
apiversion: v1 kind: persistentvolume metadata: name: pv-efs-example annotations: pv.kubernetes.io/provisioned-by: everest-csi-provisioner spec: accessmodes: - readwritemany capacity: storage: 10gi csi: driver: sfsturbo.csi.everest.io fstype: nfs volumeattributes: everest.io/share-export-location: 192.168.0.169:/ storage.kubernetes.io/csiprovisioneridentity: everest-csi-provisioner volumehandle: 8962a2a2-a583-4b7f-bb74-fe76712d8414 persistentvolumereclaimpolicy: delete storageclassname: csi-sfsturbo
加粗标红字段需要重点关注,其中参数说明如下:
表4 极速文件存储卷pv配置参数说明 参数
描述
name
pv资源的名称,集群下唯一。
storage
文件存储的大小。可参考flexvolume pv的spec.capacity.storage。
driver
挂载依赖的存储驱动,极速文件存储配置为“sfsturbo.csi.everest.io”。
everest.io/share-export-location
极速文件存储的共享路径。可参考flexvolume pv的spec.flexvolume.options.devicemountpath。
volumehandle
极速文件存储的id。可参考flexvolume pv的spec.flexvolume.options.volumeid。
storageclassname
指定k8s storage class名称;极速文件存储卷需配置为"csi-sfsturbo”。
- 根据flexvolume格式的pvc,准备csi格式的pvc的yaml文件关联上述步骤准备的静态pv。
执行如下命令,配置名为“pvc-example.yaml”的创建pvc的yaml文件。
touch pvc-example.yaml
vi pvc-example.yaml
云硬盘存储卷pvc的配置示例如下:
apiversion: v1 kind: persistentvolumeclaim metadata: labels: failure-domain.beta.kubernetes.io/region: cn-north-4 failure-domain.beta.kubernetes.io/zone: <zone name> annotations: everest.io/disk-volume-type: sas volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner name: pvc-evs-example namespace: default spec: accessmodes: - readwriteonce resources: requests: storage: 10gi volumename: pv-evs-example storageclassname: csi-disk
加粗标红字段需要重点关注,其中参数说明如下:
表5 云硬盘存储卷pvc配置参数说明 参数
描述
failure-domain.beta.kubernetes.io/region
集群所在region。可参考flexvolume pvc的相同字段。
failure-domain.beta.kubernetes.io/zone
evs云硬盘所在可用区。可参考flexvolume pvc的相同字段。
everest.io/disk-volume-type
云硬盘存储类型,支持sas、ssd。和上述步骤的pv保持一致。
name
pvc资源名称,同namespace下唯一。保证在namespace下唯一即可。(若pvc是由有状态应用动态创建,则保持和flexvolume pvc的name一致)。
namespace
pvc资源命名空间。可参考flexvolume pvc的相同字段。
storage
pvc申请容量,必须和已有pv的storage大小保持一致。
volumename
pv的名称。使用上述步骤的静态pv的名称。
storageclassname
指定k8s storage class名称;云硬盘需使用“csi-disk”。
文件存储卷pvc配置示例如下:
apiversion: v1 kind: persistentvolumeclaim metadata: annotations: volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner name: pvc-sfs-example namespace: default spec: accessmodes: - readwritemany resources: requests: storage: 10gi storageclassname: csi-nas volumename: pv-sfs-example
加粗标红字段需要重点关注,其中参数说明如下:
表6 文件存储卷pvc配置参数说明 参数
描述
name
pvc资源名称,同namespace下唯一。保证在namespace下唯一即可。(若pvc是由有状态应用动态创建,则保持和flexvolume pvc的name一致)。
namespace
pvc资源命名空间。可参考flexvolume pvc的相同字段。
storage
存储容量,单位gi,必须和已有pv的storage大小保持一致。
storageclassname
需配置为"csi-nas"。
volumename
pv的名称。参考上述步骤的静态pv的名称。
对象存储卷pvc配置示例如下:
apiversion: v1 kind: persistentvolumeclaim metadata: annotations: volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner everest.io/obs-volume-type: standard csi.storage.k8s.io/fstype: s3fs name: pvc-obs-example namespace: default spec: accessmodes: - readwritemany resources: requests: storage: 1gi storageclassname: csi-obs volumename: pv-obs-example
加粗标红字段需要重点关注,其中参数说明如下:
表7 对象存储卷pvc配置参数说明 参数
描述
everest.io/obs-volume-type
obs存储类型;当前支持标准(standard)和低频(warm)两种存储类型。和上述步骤的pv保持一致。
csi.storage.k8s.io/fstype
指定文件类型,支持“obsfs”与“s3fs”。与上述步骤中静态obs存储的pv的fstype保持一致。
name
pvc资源名称,同namespace下唯一。保证在namespace下唯一即可。(若pvc是由有状态应用动态创建,则保持和flexvolume pvc的name一致)。
namespace
pvc资源命名空间。可参考flexvolume pvc的相同字段。
storage
存储容量,单位为gi。此处配置为固定值1gi。
storageclassname
k8s storage class名称;需配置为"csi-obs”。
volumename
pv的名称。参考上述步骤创建的静态pv的名称。
极速文件存储卷pvc配置示例如下:
apiversion: v1 kind: persistentvolumeclaim metadata: annotations: volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner name: pvc-efs-example namespace: default spec: accessmodes: - readwritemany resources: requests: storage: 10gi storageclassname: csi-sfsturbo volumename: pv-efs-example
加粗标红字段需要重点关注,其中参数说明如下:
表8 极速文件存储卷pvc配置参数说明 参数
描述
name
pvc资源名称,同namespace下唯一。保证在namespace下唯一即可。(若pvc是由有状态应用动态创建,则保持和flexvolume pvc的name一致)。
namespace
pvc资源命名空间。可参考flexvolume pvc的相同字段。
storageclassname
指定k8s storage class名称;需配置为"csi-sfsturbo”。
storage
存储容量,单位gi,必须和已有pv的storage大小保持一致。
volumename
pv的名称。参考上述步骤创建的静态pv的名称。
- 应用升级替换成新的pvc。
无状态应用
- 通过kubectl create -f的形式创建pv和pvc。
kubectl create -f pv-example.yaml
kubectl create -f pvc-example.yaml
- 进入应用更新升级界面:更新升级 - 高级设置 - 数据存储 - 云存储。
- 卸载老存储,同时添加csi格式的pvc的云存储,容器内挂载路径和以前保持一致,实现存储迁移。
- 单击提交,确认后升级生效。
- 等待pod running。
升级使用已有存储的有状态应用
- 通过kubectl create -f的形式创建pv和pvc
kubectl create -f pv-example.yaml
kubectl create -f pvc-example.yaml
- 通过kubectl edit的方式修改有状态应使用新建的pvc。
kubectl edit sts sts-example -n xxx
命令中的sts-example为待升级的有状态应用的名称,请以实际为准。xxx指代有状态应用所在的命名空间。
- 等待pod running。
当前界面暂未提供有状态应用添加新的云存储,因此升级替换成新pvc需要通过后台kubectl命里实现。
升级使用动态分配存储的有状态应用
- 备份当前有状态应用使用的flexvolume格式的pv和pvc。
kubectl get pvc xxx -n {namespaces} -oyaml > pvc-backup.yaml
kubectl get pv xxx -n {namespaces} -oyaml > pv-backup.yaml
- 将应用的实例数修改成0。
- 在存储界面解关联有状态应用使用的flexvolume格式的pvc。
- 通过kubectl create -f的形式创建pv和pvc。
kubectl create -f pv-example.yaml
kubectl create -f pvc-example.yaml
- 将应用的实例数恢复,等待pod running。
有状态应用动态创建存储是通过volumeclaimtemplates机制实现,而该字段k8s无法修改,因此无法通过更换新pvc的方式实现数据迁移。
volumeclaimtemplates的pvc命名格式是固定的,当符合命名格式的pvc已经存在的时候则直接使用该pvc。
因此需要些解关联原有pvc之后,创建同名的csi格式的pvc来实现存储迁移。
6. 迁移完成,但是如果不重建有状态应用,扩容时仍是flexvolume格式的pvc(按需操作)。
- 获取当前有状态应用yaml:
kubectl get sts xxx -n {namespaces} -oyaml > sts.yaml
- 备份当前有状态应用yaml:
cp sts.yaml sts-backup.yaml
- 修改有状态应用yaml中volumeclaimtemplates的定义:
vi sts.yaml
云硬盘存储卷volumeclaimtemplates的配置示例如下:
volumeclaimtemplates: - metadata: name: pvc-161070049798261342 namespace: default creationtimestamp: null annotations: everest.io/disk-volume-type: sas spec: accessmodes: - readwriteonce resources: requests: storage: 10gi storageclassname: csi-disk
其中参数和上述步骤创建的云硬盘存储卷的pvc保持一致。
文件存储卷volumeclaimtemplates配置示例如下:
volumeclaimtemplates: - metadata: name: pvc-161063441560279697 namespace: default creationtimestamp: null spec: accessmodes: - readwritemany resources: requests: storage: 10gi storageclassname: csi-nas
其中参数和上述步骤创建的文件存储卷pvc保持一致。
对象存储卷pvc配置示例如下:
volumeclaimtemplates: - metadata: name: pvc-161070100417416148 namespace: default creationtimestamp: null annotations: csi.storage.k8s.io/fstype: s3fs everest.io/obs-volume-type: standard spec: accessmodes: - readwritemany resources: requests: storage: 1gi storageclassname: csi-obs
其中参数和上述步骤创建的对象存储卷pvc保持一致。
- 删除原有状态应用:
kubectl delete sts xxx -n {namespaces}
- 创建新的有状态应用
kubectl create -f sts.yaml
- 通过kubectl create -f的形式创建pv和pvc。
- 检查业务功能。
- 检查业务功能是否正常。
- 检查数据是否丢失。
若功能或数据检查异常需要回退,请执行步骤4,选择flexvolume格式的pvc并单击提交升级。
- 卸载flexvolume格式的pvc。
检查正常,存储管理界面执行解关联操作。
也可以后台通过kubectl指令删除flexvolume格式的pvc和pv。
在删除之前需要修改pv的回收策略persistentvolumereclaimpolicy为retain,否则底层存储会被回收。
在存储迁移执行前已完成集群升级可能会导致无法删除pv,可以去除pv的保护字段finalizers来实现pv删除
kubectl patch pv {pv_name} -p '{"metadata":{"finalizers":null}}'
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨