全部產品
Search
文件中心

Container Service for Kubernetes:將無儲存叢集的Flexvolume遷移至CSI

更新時間:Jun 19, 2024

由於Flexvolume儲存外掛程式已棄用,建立叢集已不再支援Flexvolume儲存外掛程式。對於現有使用Flexvolume外掛程式的叢集,建議遷移改用CSI外掛程式。您可以通過卸載Flexvolume外掛程式,並安裝新的CSI外掛程式,修改節點池配置和現有節點配置等方法完成外掛程式的遷移。本文介紹如何將無儲存叢集的Flexvolume遷移至CSI。

外掛程式區別

CSI和Flexvolume儲存外掛程式的區別如下表所示。

外掛程式

組成

Kubelet參數

相關文檔

CSI

  • CSI-Provisioner(Deployment)

    實現儲存卷、快照自動建立的能力。支援儲存誤刪除後的恢複功能、CNFS儲存等功能。

  • CSI-Plugin(DaemonSet)

    實現儲存卷的自動掛載和卸載能力。支援多種儲存類型,預設支援雲端硬碟、NAS、OSS三種儲存類型。

外掛程式運行依賴的Kubelet參數不同。

配置Kubelet的enable-controller-attach-detachtrue

儲存CSI概述

Flexvolume

  • Disk-Controller(Deployment)

    實現雲端硬碟卷的自動建立能力。

  • Flexvolume(DaemonSet)

    實現資料卷的掛載、卸載功能。ACK預設提供雲端硬碟、NAS、OSS三種儲存卷的掛載能力。

外掛程式運行依賴的Kubelet參數不同。

配置Kubelet的enable-controller-attach-detachfalse

儲存Flexvolume概述

使用情境

CSI外掛程式體系較Flexvolume更加穩定高效,在以下情境中,推薦您將叢集從Flexvolume外掛程式遷移到CSI外掛程式方案。

  • 叢集沒有使用Flexvolume掛載過資料卷,當前叢集中不包含Flexvolume類型的儲存資料。

  • 叢集使用Flexvolume掛載過資料卷,但相關儲存資料已被刪除,當前叢集中不包含Flexvolume類型的儲存資料。

步驟一:卸載Flexvolume外掛程式

  1. 登入OpenAPI平台,調用UnInstallClusterAddons卸載Flexvolume外掛程式。

    • ClusterId:您的叢集ID。您可以通過叢集的基本資料頁面,查看叢集ID。

    • name:Flexvolume。

    具體操作,請參見卸載叢集組件

  2. 執行以下命令,刪除alicloud-disk-controlleralicloud-nas-controller

    kubectl delete deploy -nkube-system alicloud-disk-controller alicloud-nas-controller
  3. 執行以下命令,檢查叢集中Flexvolume外掛程式是否卸載完成。

    kubectl get pods -n kube-system | grep 'flexvolume\|alicloud-disk-controller\|alicloud-nas-controller'

    輸出為空白,說明叢集中Flexvolume外掛程式已卸載完成。

  4. 執行以下命令,刪除叢集中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外掛程式。

  1. 登入OpenAPI平台,調用InstallClusterAddons安裝CSI外掛程式。

    • ClusterId:您的叢集ID。

    • name:csi-provisioner。

    • version:最新CSI外掛程式版本。關於CSI版本資訊,請參見csi-provisioner

    具體操作,請參見安裝叢集組件

  2. 執行以下命令,檢查叢集中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

您可以通過添加任意一個執行個體規格或修改節點池登入密碼兩種方式修改叢集中所有節點池的配置,更新後台叢集儲存外掛程式類型,觸發後台更新節點初始化指令碼,確保新擴容的節點參數設定無誤。

說明

您也可以建立一個節點池,然後逐步將舊節點池的節點都縮容,直到最後刪除舊的節點池,然後直接使用新的節點池,此方式不需要進行如下操作步驟。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇節點管理 > 節點池

  3. 節點池頁面,單擊目標節點池右側操作列下的編輯

  4. 在彈出的節點池資訊頁面,您可以通過以下兩種方式修改叢集的節點池配置。

    • 添加任意一個執行個體規格。

      添加節點後,可以觸發更新後台叢集儲存外掛程式類型。待節點池配置修改生效後,可以將此處添加的節點刪除。

    • 修改節點池的登入密碼。

  5. 單擊確認

步驟四:修改現有節點配置

執行以下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外掛程式已正常工作。具體操作,請參見使用雲端硬碟動態儲存裝置卷