由於Flexvolume儲存外掛程式已棄用,建立叢集已不再支援Flexvolume儲存外掛程式。對於現有使用Flexvolume外掛程式的叢集,建議遷移改用CSI外掛程式。本文介紹如何將Flexvolume類型的NAS靜態儲存卷遷移至CSI。
索引
外掛程式區別
CSI和Flexvolume儲存外掛程式的區別如下表所示。
外掛程式 | 組成 | kubelet參數 | 相關文檔 |
CSI |
| 外掛程式運行依賴的kubelet參數不同。 配置kubelet的 | |
Flexvolume |
| 外掛程式運行依賴的kubelet參數不同。 配置kubelet的 |
使用情境
叢集已使用Flexvolume掛載NAS靜態儲存卷,即當前叢集中包含Flexvolume類型的NAS靜態儲存卷。如果您的叢集中也有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類型的NAS靜態儲存卷為例,介紹如何將Flexvolume類型的NAS靜態儲存卷遷移至CSI。流程如下圖所示。
步驟一:查看叢集儲存情況
執行以下命令,查看Pod狀態。
kubectl get pod
預期輸出:
NAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 11m
執行以下命令,查看Pod使用的PVC。
kubectl describe pod nas-static-1 |grep ClaimName
預期輸出:
ClaimName: nas-pvc
執行以下命令,查看當前PVC狀態。
kubectl get pvc
預期輸出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nax-pv 512Gi RWX 7m23s
步驟二:建立CSI類型NAS靜態儲存的PVC和PV
方式一:通過Flexvolume2CSI命令列工具轉換
將Flexvolume類型的PVC和PV轉換為CSI類型的PVC和PV。具體操作,請參見使用Flexvolume2CSI命令列工具批量轉換YAML。
執行以下命令,建立CSI類型NAS靜態儲存的PVC和PV對象。
其中,
nas-pv-pvc-csi.yaml
檔案為通過Flexvolume2CSI命令列工具轉換得到的CSI類型的PVC和PV的YAML檔案。kubectl apply -f nas-pv-pvc-csi.yaml
執行以下命令,查看當前PVC狀態。
kubectl get pvc
預期輸出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nas-pv 512Gi RWX nas 30m nas-pvc-csi Bound nas-pv-csi 512Gi RWX nas 2s
方式二:通過手動儲存Flexvolume類型PVC和PV並修改儲存驅動的方式轉換
儲存Flexvolume類型NAS靜態儲存的PVC和PV模板。
執行以下命令,儲存Flexvolume類型的PVC對象。
kubectl get pvc nas-pvc -oyaml > nas-pvc-flexvolume.yaml cat nas-pvc-flexvolume.yaml
預期輸出:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nas-pvc namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 512Gi selector: matchLabels: alicloud-pvname: nas-pv storageClassName: nas
執行以下命令,儲存Flexvolume類型的PV對象。
kubectl get pv nas-pv -oyaml > nas-pv-flexvolume.yaml cat nas-pv-flexvolume.yaml
預期輸出:
apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: nas-pv name: nas-pv spec: accessModes: - ReadWriteMany capacity: storage: 512Gi flexVolume: driver: alicloud/nas options: path: /aliyun server: ***.***.nas.aliyuncs.com vers: "3" persistentVolumeReclaimPolicy: Retain storageClassName: nas
建立CSI類型NAS靜態儲存的PVC和PV。
使用以下YAML內容,建立CSI類型NAS靜態儲存的nas-pv-pvc-csi.yaml檔案。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nas-pvc-csi namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 512Gi selector: matchLabels: alicloud-pvname: nas-pv-csi storageClassName: nas --- apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: nas-pv-csi name: nas-pv-csi spec: accessModes: - ReadWriteMany capacity: storage: 512Gi csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: nas-pv-csi volumeAttributes: server: "***.***.nas.aliyuncs.com" path: "/aliyun" mountOptions: - nolock,tcp,noresvport - vers=3 persistentVolumeReclaimPolicy: Retain storageClassName: nas
執行以下命令,建立CSI類型NAS靜態儲存的PVC和PV對象。
kubectl apply -f nas-pv-pvc-csi.yaml
執行以下命令,查看當前PVC狀態。
kubectl get pvc
預期輸出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nax-pv 512Gi RWX 7m23s
步驟三:更新應用關聯的PVC
執行以下命令,編輯應用設定檔。
kubectl edit sts nas-static
修改PVC配置內容,將資料卷配置改為CSI類型的PVC。
volumes: - name: pvc-nas persistentVolumeClaim: claimName: nas-pvc-csi
執行以下命令,查看Pod是否重啟成功。
kubectl get pod
預期輸出:
NAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 70s
執行以下命令,查看掛載資訊。
kubectl exec nas-static-1 -- mount |grep nas
預期輸出:
# 查看掛載資訊。 ***.***.nas.aliyuncs.com:/aliyun on /var/lib/kubelet/pods/ac02ea3f-125f-4b38-9bcf-9b117f62***/volumes/kubernetes.io~csi/nas-pv-csi/mount type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.XX.XX,mountvers=3,mountport=2049,mountproto=tcp,local_lock=all,addr=192.168.XX.XX)
存在以上預期輸出,表示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