从 Flexvolume UDisk 存储卷升级到 CSI UDisk 存储卷

Kubernetes v1.13 以及更早版本的用户,Pod 通过 Flexvolume 存储卷的方式挂载 UDisk 块存储卷。由于不支持拓扑感知动态调度等基础特性,Flexvolume 方案早已停止演进,而 CSI 已经成为容器存储实现标准。

使用 Flexvolume 创建 UDisk 挂载卷的 UK8S 早期用户目前面临着集群升级时将 Flexvolume PV 转换成 CSI PV 的问题,本文档提供一个示例,用于说明如何完成这一转换。

⚠️ 升级时会造成服务中断,请合理规划迁移时间,并做好相关备份。

1. Flexvolume UDisk 存储卷说明

如下是一个已经挂载了 Flexvolume UDisk 存储卷 Workload 的 yaml 文件 nginx-fv.yaml,它包含了一个 StorageClass,一个 Pod 声明和其引用的 PVC。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: udisk-ssd-flexvolume
parameters:
  type: ssd # 磁盘类型,枚举值为ssd,sata,rssd
provisioner: ucloud/udisk
reclaimPolicy: Delete
volumeBindingMode: Immediate
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-fv
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: udisk-ssd-flexvolume
  resources:
    requests:
      storage: 10Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: uhub.service.ucloud.cn/ucloud/nginx:latest
    imagePullPolicy: Always
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: nginxdisk
      mountPath: /data
  volumes:
  - name: nginxdisk
    persistentVolumeClaim:
      claimName: nginx-fv

执行 kubectl apply -f nginx-fv.yaml,发现相应的 StorageClass、Pod 及相关联的 PVC 已经创建成功,此外 cloudprovider 还会为这个 PVC 创建并绑定一个 PV 对象(名称与 PVC 对象的 Volume 值相同),如下所示:

Name:            pvc-8b7946f7-1214-11ec-8f6b-5254003e805f-bsm-upc4bc0v
Labels:          <none>
Annotations:     pv.kubernetes.io/provisioned-by: ucloud/udisk
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    udisk-ssd-flexvolume
Status:          Bound
Claim:           default/nginx-fv
Reclaim Policy:  Delete
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        10Gi
Node Affinity:   <none>
Message:         
Source:
    Type:       FlexVolume (a generic volume resource that is provisioned/attached using an exec based plugin)
    Driver:     ucloud/flexv
    FSType:     
    SecretRef:  nil
    ReadOnly:   false
    Options:    map[diskId:bsm-upc4bc0v]
Events:         <none>

在 Source.Options 可以发现,这个 PV 对应的实际 UDisk 实例为 bsm-upc4bc0v。

2. 升级步骤

⚠️ 升级时会造成服务中断,请合理规划迁移时间,准备好所有需要的 yaml 文件,并做好相关备份。

2.1 确认原有 PV 回收策略为 Retain

如果 PV 的回收策略不是 Retain,则需要通过以下命令将其回收策略改成 Retain。这时即使您删除 Pod 和对应的 PVC,可以发现,PV 依然存在,对应的 UDisk 实例也依然保留。

⚠️ 如删除 Flexvolume 创建的 PV,则对应的 UDisk 会被删除,如需要相应的 UDisk,请确保该 PV 不会被删除。

kubectl patch pv <your-pv-name1> <your-pv-name2> <your-pv-name3> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

2.2 确认集群中已安装 CSI 插件

首先,请参考CSI 升级指南中命令行升级的方法,为集群安装最新的 CSI 插件。

2.3 删除原有 Pod 及 PVC

通过 kubectl delete -f nginx-fv.yaml,删除原有 PVC 及 Pod,这时可以发现由于 PV 回收策略为 Retain,PV 及相应的 UDisk 仍被保留,PV 状态为 Release

2.4 通过 CSI 以指定 UDisk 创建新的 PV 及 PVC

接下来,我们将以原先的 UDisk 数据盘,创建 PV 并关联 PVC,详见在 UK8S 中使用 UDisk文档中「使用已有 UDisk 部分」。

以下为示例文件 nginx-csi-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-csi
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 10Gi
  csi:
    driver: udisk.csi.ucloud.cn
    volumeAttributes:
      type: ssd
    volumeHandle: bsm-upc4bc0v # 请修改为自己的UDiskId
  persistentVolumeReclaimPolicy: Retain
  storageClassName: udisk-ssd
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-csi
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: udisk-ssd
  resources:
    requests:
      storage: 10Gi
  volumeName: nginx-csi

执行 kubectl apply -f nginx-csi-pv.yaml 后,我们可以看到新的 PV 和 PVC 已经创建成功。

2.5 将 PVC 挂载到相应的 Pod

详见在 UK8S 中使用 UDisk文档,以下为示例 yaml 文件 nginx-csi.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: uhub.service.ucloud.cn/ucloud/nginx:latest
    imagePullPolicy: Always
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: nginxdisk
      mountPath: /data
  volumes:
  - name: nginxdisk
    persistentVolumeClaim:
      claimName: nginx-csi # 注意名称与新的 PVC 相对应

执行 kubectl apply -f nginx-csi.yaml 后,我们可以看到新的 Pod 已经创建成功,并与相应的 PVC 绑定。

升级成功后,原有的 FlexVolume 安装文件可保留,只要在申明新的 StorageClass、PV 和 PVC 时,按照 CSI 相应的规范进行声明即可。

最近更新时间:2025-03-19 09:32:08