由于Flexvolume存儲插件已棄用,新建集群已不再支持Flexvolume存儲插件。對于現有使用Flexvolume插件的集群,建議遷移改用CSI插件。您可以通過卸載Flexvolume插件,并安裝新的CSI插件,修改節點池配置和現有節點配置等方法完成插件的遷移。本文介紹如何將無存儲集群的Flexvolume遷移至CSI。
插件區別
CSI和Flexvolume存儲插件的區別如下表所示。
插件 | 組成 | kubelet參數 | 相關文檔 |
CSI |
| 插件運行依賴的kubelet參數不同。 配置kubelet的 | |
Flexvolume |
| 插件運行依賴的kubelet參數不同。 配置kubelet的 |
使用場景
CSI插件體系較Flexvolume更加穩定高效,在以下場景中,推薦您將集群從Flexvolume插件遷移到CSI插件方案。
集群沒有使用Flexvolume掛載過數據卷,當前集群中不包含Flexvolume類型的存儲數據。
集群使用Flexvolume掛載過數據卷,但相關存儲數據已被刪除,當前集群中不包含Flexvolume類型的存儲數據。
步驟一:卸載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刪除成功。
步驟二:安裝CSI插件
如果您使用了csi-compatible-controller插件,說明集群中已存在CSI插件。但是該CSI插件是定制化的,不是標準的CSI插件。您需要先通過以下命令,刪除之前定制化的CSI組件,再安裝標準的CSI插件。
kubectl delete deploy csi-provisioner -nkube-system kubectl delete ds csi-plugin -nkube-system kubectl delete csidriver diskplugin.csi.alibabacloud.com nasplugin.csi.alibabacloud.com ossplugin.csi.alibabacloud.com
說明以上刪除操作不影響集群內現有的Pod應用,但是在刪除后,安裝標準的CSI插件之前,不能有Pod變更。
如果未使用csi-compatible-controller插件,您可以直接調用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插件正常運行。
步驟三:修改集群中所有節點池的配置
由于節點池的配置隨著集群的存儲組件變化而變化,您在安裝新的CSI標準組件后,已經存在的節點池配置不會自動更改,需要手動修改節點池配置觸發更新。如果更新成功,該節點池上新建節點的kubelet參數--enable-controller-attach-detach
將會由false
更新為true
。
手動修改節點池配置觸發更新的操作會重啟kubelet,建議您在業務低峰期操作,確認在某個節點池上更新無誤后,再逐步更新其他節點池。
您可以通過添加任意一個實例規格或修改節點池登錄密碼兩種方式修改集群中所有節點池的配置,更新后臺集群存儲插件類型,觸發后臺更新節點初始化腳本,確保新擴容的節點參數設置無誤。
您也可以新建一個節點池,然后逐步將舊節點池的節點縮容,直到最后刪除舊的節點池,然后直接使用新的節點池。這種方式不需要進行如下操作步驟。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在節點池頁面,單擊目標節點池右側操作列下的編輯。
在彈出的節點池信息頁面,您可以通過以下兩種方式修改集群的節點池配置。
添加任意一個實例規格。
添加節點后,可以觸發更新后臺集群存儲插件類型。待節點池配置修改生效后,可以將此處添加的節點刪除。
修改節點池的登錄密碼。
單擊確認。
步驟四:修改現有節點配置
執行以下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
后續步驟
Flexvolume插件類型的集群遷移完成后,您可以通過使用云盤動態存儲卷的操作,驗證遷移后的CSI插件已正常工作。具體操作,請參見使用云盤動態存儲卷。