由于Flexvolume存储插件已弃用,新建集群已不再支持Flexvolume存储插件。对于现有使用Flexvolume插件的集群,建议迁移改用CSI插件。本文介绍如何将Flexvolume类型的OSS静态存储卷迁移至CSI。
索引
插件区别
CSI和Flexvolume存储插件的区别如下表所示。
插件 | 组成 | kubelet参数 | 相关文档 |
CSI |
| 插件运行依赖的kubelet参数不同。 配置kubelet的 | |
Flexvolume |
| 插件运行依赖的kubelet参数不同。 配置kubelet的 |
使用场景
集群已使用Flexvolume挂载OSS静态存储卷,即当前集群中包含Flexvolume类型的OSS静态存储卷。如果您的集群中也有Flexvolume类型的云盘存储卷,请参考通过csi-compatible-controller组件迁移Flexvolume至CSI。
注意事项
插件迁移时,PVC重建将导致Pod重建和业务中断。您需要选择合适时间对集群进行插件迁移、PVC重建、应用变更等一系列的重启操作。
准备工作
手动安装CSI插件
使用以下内容,分别创建csi-plugin.yaml和csi-provisioner.yaml文件。
执行以下命令,在ACK集群中部署csi-plugin和csi-provisioner。
kubectl apply -f csi-plugin.yaml -f csi-provisioner.yaml
执行以下命令,查看CSI插件是否正常。
kubectl get pods -nkube-system | grep csi
预期输出:
csi-plugin-577mm 4/4 Running 0 3d20h csi-plugin-k9mzt 4/4 Running 0 41d csi-provisioner-6b58f46989-8wwl5 9/9 Running 0 41d csi-provisioner-6b58f46989-qzh8l 9/9 Running 0 6d20h
存在以上预期输出,说明集群中CSI插件正常运行。
本文以1个StatefulSet使用Flexvolume类型的OSS静态存储卷,存储卷的密钥信息保存在oss-secret中为例,介绍如何将Flexvolume类型的OSS静态存储卷迁移至CSI。流程如下图所示。
步骤一:查看集群存储状态
执行以下命令,查看Pod状态。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE oss-sts-1 1/1 Running 0 11m
执行以下命令,查看Pod使用的PVC。
kubectl describe pod oss-sts-1 |grep ClaimName
预期输出:
ClaimName: oss-pvc
执行以下命令,查看当前PVC状态。
kubectl get pvc
预期输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE oss-pvc Bound oss-pv 5Gi RWX 7m23s
步骤二:创建CSI类型OSS静态存储的PVC和PV
方式一:通过Flexvolume2CSI命令行工具转换
将Flexvolume类型的PVC和PV转换为CSI类型的PVC和PV。具体操作,请参见使用Flexvolume2CSI命令行工具批量转换YAML。
执行以下命令,创建CSI类型OSS静态存储的PVC和PV对象。
其中,
oss-pv-pvc-csi.yaml
文件为通过Flexvolume2CSI命令行工具转换得到的CSI类型的PVC和PV的YAML文件。kubectl apply -f oss-pv-pvc-csi.yaml
执行以下命令,查看当前PVC状态。
kubectl get pvc
预期输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE oss-pvc-csi Bound oss-pv-csi 5Gi RWO 7m15s oss-pvc Bound oss-pv 5Gi RWX 52m
方式二:通过手动保存Flexvolume类型PVC和PV并修改存储驱动的方式转换
保存Flexvolume类型的PVC和PV模板。
执行以下命令,保存Flexvolume类型的PVC对象。
kubectl get pvc oss-pvc -oyaml > oss-pvc-flexvolume.yaml cat oss-pvc-flexvolume.yaml
预期输出:
apiVersion: v1 kind: PersistentVolumeClaim name: oss-pvc namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi volumeMode: Filesystem volumeName: oss-pv
执行以下命令,保存Flexvolume类型的PV对象。
kubectl get pv oss-pv -oyaml > oss-pv-flexvolume.yaml cat oss-pv-flexvolume.yaml
预期输出:
apiVersion: v1 kind: PersistentVolume metadata: name: oss-pv spec: accessModes: - ReadWriteMany capacity: storage: 5Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: oss-pvc namespace: default flexVolume: driver: alicloud/oss nodePublishSecretRef: name: oss-secret namespace: default options: bucket: xxx otherOpts: -o max_stat_cache_size=0 -o allow_other url: xxx.aliyuncs.com persistentVolumeReclaimPolicy: Retain volumeMode: Filesystem
创建CSI类型OSS静态存储的PVC和PV。
使用以下YAML内容,创建CSI类型OSS静态存储的oss-pv-pvc-csi.yaml文件。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: oss-pvc-csi spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: oss-pv-csi --- apiVersion: v1 kind: PersistentVolume metadata: name: oss-pv-csi labels: alicloud-pvname: oss-pv-csi spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: oss-pv-csi nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: "***" url: "***.aliyuncs.com" otherOpts: "-o max_stat_cache_size=0 -o allow_other"
执行以下命令,创建CSI类型OSS静态存储的PVC和PV对象。
kubectl apply -f oss-pv-pvc-csi.yaml
执行以下命令,查看当前PVC状态。
kubectl get pvc
预期输出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE oss-pvc-csi Bound oss-pv-csi 5Gi RWO 7m15s oss-pvc Bound oss-pv 5Gi RWX 52m
步骤三:更新应用关联的PVC
执行以下命令,编辑应用配置文件。
kubectl edit sts oss-sts
修改PVC配置内容,将数据卷配置改为CSI类型的PVC。
volumes: - name: oss persistentVolumeClaim: claimName: oss-pvc-csi
执行以下命令,查看Pod是否重启成功。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE oss-sts-1 1/1 Running 0 70s
执行以下命令,查看挂载信息。
kubectl exec oss-sts-1 -- mount |grep ossfs
预期输出:
# 查看挂载信息。 ***:/ on /var/lib/kubelet/pods/ac02ea3f-125f-4b38-9bcf-9b117f62eaf0/volumes/kubernetes.io~csi/oss-pv-csi/mount type ossfs (rw,relatime,max_stat_cache_size=0,allow_other)
存在以上预期输出,表示Pod迁移成功。
步骤四:卸载Flexvolume插件
登录OpenAPI平台,调用UnInstallClusterAddons卸载Flexvolume插件。
ClusterId:您的集群ID。您可以通过集群的基本信息页面,查看集群ID。
name:Flexvolume。
具体操作,请参见卸载集群组件。
执行以下命令,删除alicloud-disk-controller和alicloud-nas-controller。
kubectl delete deploy -nkube-system alicloud-disk-controller alicloud-nas-controller
执行以下命令,检查集群中Flexvolume插件是否卸载完成。
kubectl get pods -n kube-system | grep 'flexvolume\|alicloud-disk-controller\|alicloud-nas-controller'
输出为空,说明集群中Flexvolume插件已卸载完成。
执行以下命令,删除集群中Flexvolume类型的StorageClass,Flexvolume类型的StorageClass PROVISIONER类型为alicloud/disk。
kubectl delete storageclass alicloud-disk-available alicloud-disk-efficiency alicloud-disk-essd alicloud-disk-ssd
预期输出:
storageclass.storage.k8s.io "alicloud-disk-available" deleted storageclass.storage.k8s.io "alicloud-disk-efficiency" deleted storageclass.storage.k8s.io "alicloud-disk-essd" deleted storageclass.storage.k8s.io "alicloud-disk-ssd" deleted
存在以上输出,说明StorageClass删除成功。
步骤五:使用OpenAPI安装CSI插件
登录OpenAPI平台,调用InstallClusterAddons安装CSI插件。
ClusterId:您的集群ID。
name:csi-provisioner。
version:最新CSI插件版本。关于CSI版本信息,请参见csi-provisioner。
具体操作,请参见安装集群组件。
执行以下命令,检查集群中CSI插件是否正常运行。
kubectl get pods -nkube-system | grep csi
预期输出:
csi-plugin-577mm 4/4 Running 0 3d20h csi-plugin-k9mzt 4/4 Running 0 41d csi-provisioner-6b58f46989-8wwl5 9/9 Running 0 41d csi-provisioner-6b58f46989-qzh8l 9/9 Running 0 6d20h
存在以上预期输出,说明集群中CSI插件正常运行。
步骤六:修改现有节点配置
执行以下YAML内容,修改插件运行依赖的kubelet参数,使其匹配CSI插件的运行要求。 该DaemonSet有将现有节点的kubelet参数--enable-controller-attach-detach
修改为true
的能力,当本步骤操作执行完成后,可以将该DaemonSet删除。
执行以下YAML文件时,会重启kubelet,请评估对现有应用的影响。
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: kubelet-set
spec:
selector:
matchLabels:
app: kubelet-set
template:
metadata:
labels:
app: kubelet-set
spec:
tolerations:
- operator: "Exists"
hostNetwork: true
hostPID: true
containers:
- name: kubelet-set
securityContext:
privileged: true
capabilities:
add: ["SYS_ADMIN"]
allowPrivilegeEscalation: true
image: registry.cn-hangzhou.aliyuncs.com/acs/csi-plugin:v1.26.5-56d1e30-aliyun
imagePullPolicy: "Always"
env:
- name: enableADController
value: "true"
command: ["sh", "-c"]
args:
- echo "Starting kubelet flag set to $enableADController";
ifFlagTrueNum=`cat /host/etc/systemd/system/kubelet.service.d/10-kubeadm.conf | grep enable-controller-attach-detach=$enableADController | grep -v grep | wc -l`;
echo "ifFlagTrueNum is $ifFlagTrueNum";
if [ "$ifFlagTrueNum" = "0" ]; then
curValue="true";
if [ "$enableADController" = "true" ]; then
curValue="false";
fi;
sed -i "s/enable-controller-attach-detach=$curValue/enable-controller-attach-detach=$enableADController/" /host/etc/systemd/system/kubelet.service.d/10-kubeadm.conf;
restartKubelet="true";
echo "current value is $curValue, change to expect "$enableADController;
fi;
if [ "$restartKubelet" = "true" ]; then
/nsenter --mount=/proc/1/ns/mnt systemctl daemon-reload;
/nsenter --mount=/proc/1/ns/mnt service kubelet restart;
echo "restart kubelet";
fi;
while true;
do
sleep 5;
done;
volumeMounts:
- name: etc
mountPath: /host/etc
volumes:
- name: etc
hostPath:
path: /etc