すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:データが保存されていないクラスターの FlexVolume から CSI への移行

最終更新日:Jul 31, 2025

FlexVolume は Container Service for Kubernetes (ACK) で非推奨となり、新しく作成された ACK クラスタではサポートされなくなりました。既存の ACK クラスタの FlexVolume を Container Storage Interface (CSI) に移行することをお勧めします。FlexVolume を CSI に移行するには、FlexVolume をアンインストールしてから CSI プラグインをインストールするか、ノードプールの構成を変更するか、既存のノードの構成を変更します。このトピックでは、データが保存されていないクラスターの FlexVolume を CSI に移行する方法について説明します。

FlexVolume と CSI の違い

次の表は、CSI と FlexVolume の違いを示しています。

プラグイン

コンポーネント

kubelet パラメーター

参照

CSI

  • CSI-Provisioner (Deployment としてデプロイ)

    このコンポーネントは、ボリュームの自動作成と自動スナップショット作成を実行するために使用されます。また、このコンポーネントは、Container Network File System (CNFS) ストレージと、データが誤って削除された後のデータ復旧もサポートしています。

  • CSI-Plugin (DaemonSet としてデプロイ)

    このコンポーネントは、ボリュームの自動マウントと自動アンマウントを実行するために使用されます。複数のディスクボリュームタイプがサポートされています。

CSI プラグインに必要な kubelet パラメーターは、FlexVolume プラグインに必要なものとは異なります。

CSI プラグインを実行するには、各ノードで kubelet パラメーター enable-controller-attach-detachtrue に設定する必要があります。

ストレージ

FlexVolume

  • Disk-Controller (Deployment としてデプロイ)

    このコンポーネントは、ボリュームの自動作成を実行するために使用されます。

  • FlexVolume (DaemonSet としてデプロイ)

    このコンポーネントは、ボリュームのマウントとアンマウントを実行するために使用されます。

FlexVolume プラグインに必要な kubelet パラメーターは、CSI プラグインに必要なものとは異なります。

FlexVolume プラグインを実行するには、各ノードで kubelet パラメーター enable-controller-attach-detachtrue に設定する必要があります。

FlexVolume の概要

シナリオ

CSI プラグインは、FlexVolume プラグインよりも安定性と効率性に優れています。次のシナリオでは、FlexVolume から CSI に移行することをお勧めします。

  • FlexVolume を使用してクラスターにボリュームがマウントされておらず、FlexVolume を使用してクラスターにデータが保存されていない。

  • FlexVolume を使用してボリュームがクラスターにマウントされていたが、ボリューム内の関連データが削除されている。FlexVolume を使用してクラスターにデータが保存されていない。

ステップ 1: FlexVolume をアンインストールする

  1. OpenAPI Explorer コンソール にログインし、[UnInstallClusterAddons] 操作を呼び出して、FlexVolume プラグインをアンインストールします。

    • [ClusterId]: クラスターの ID に設定します。クラスター ID は、クラスターの詳細ページの [基本情報] タブで確認できます。

    • [name]: 値を Flexvolume に設定します。

    詳細については、「クラスターからコンポーネントをアンインストールする」をご参照ください。

  2. 次のコマンドを実行して、[alicloud-disk-controller] コンポーネントと [alicloud-nas-controller] コンポーネントを削除します。

    kubectl delete deploy -n kube-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 のプロビジョナーは 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 はクラスターから削除されています。

ステップ 2: CSI プラグインをインストールする

  • クラスターで csi-compatible-controller プラグインを使用している場合、CSI プラグインは既にクラスターにインストールされています。ただし、この CSI プラグインは標準の CSI プラグインではなく、カスタマイズされた CSI プラグインです。標準の CSI プラグインをインストールする前に、次のコマンドを実行してカスタマイズされた CSI プラグインを削除する必要があります。

    kubectl delete deploy csi-provisioner -n kube-system
    kubectl delete ds csi-plugin -n kube-system
    kubectl delete csidriver diskplugin.csi.alibabacloud.com nasplugin.csi.alibabacloud.com ossplugin.csi.alibabacloud.com
    説明

    クラスターからカスタマイズされた CSI プラグインを削除しても、クラスター内の既存のポッドは影響を受けません。ただし、クラスターからカスタマイズされた CSI プラグインを削除した後、標準の CSI プラグインがインストールされるまで、クラスター内のポッドを変更することはできません。

  • クラスターで csi-compatible-controller プラグインを使用していない場合は、API 操作を呼び出して標準の CSI プラグインをインストールできます。

  1. OpenAPI Explorer コンソール にログインし、[InstallClusterAddons] を呼び出して、CSI プラグインをインストールします。

    • [ClusterId]: クラスターの ID に設定します。

    • [name]: 値を csi-provisioner に設定します。

    • [version]: 最新バージョンが自動的に指定されます。CSI バージョンの詳細については、「csi-provisioner」をご参照ください。

    CSI プラグインのインストール方法の詳細については、「ACK クラスタにコンポーネントをインストールする」をご参照ください。

  2. 次のコマンドを実行して、CSI プラグインがクラスター内で想定どおりに実行されているかどうかを確認します。

    kubectl get pods -n kube-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 プラグインはクラスター内で想定どおりに実行されています。

ステップ 3: クラスター内のすべてのノードプールの構成を変更する

クラスターのボリュームプラグインが変更されると、ノードプールの構成も変更されます。クラスターに新しい標準 CSI プラグインをインストールした後、クラスター内の元のノードプールの構成は自動的には変更されません。この場合、これらのノードプールの構成を手動で更新する必要があります。更新が成功すると、kubelet パラメーター --enable-controller-attach-detach が新しく追加されたノードで true に設定されます。

重要

ノードプールの構成を手動で変更すると、kubelet が再起動されます。この操作は、オフピーク時に実行することをお勧めします。また、他のノードプールを更新する前に、1 つのノードプールの更新が正しいことを確認してください。

新しいインスタンスタイプを追加するか、ログインパスワードを変更することで、各ノードプールの構成を変更してボリュームプラグインを更新できます。このようにして、システムはバックグラウンドでノードの初期化スクリプトを自動的に更新し、新しく追加されたノードが新しい構成を使用するようにします。

説明

または、新しいノードプールを作成し、元のノードプール内のすべてのノードをスケールインして、古いノードプールが削除されるまでスケールインすることもできます。その後、新しいノードプールを直接使用します。この方法を使用する場合、次の手順を実行する必要はありません。

  1. ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。

  3. [ノードプール] ページで、ターゲットノードプールを見つけ、[アクション] 列の [編集] をクリックします。

  4. 表示されるダイアログボックスで、ノードプールの構成を変更し、[確認] をクリックします。

    説明

    この変更は、バックグラウンドでクラスター ボリューム プラグインの更新をトリガーすることを目的としています。ノードプール 構成の変更が有効になったら、元の設定に戻すことができます。

ステップ 4:既存ノードの構成を変更する

次の YAML テンプレートを使用して、CSI プラグインの互換性のために Kubelet パラメーターを変更します。この DaemonSet は、既存ノードの kubelet パラメーター --enable-controller-attach-detach の値を true に変更できます。このステップが完了したら、DaemonSet を削除できます。

重要

YAML ファイルをデプロイすると、kubelet が再起動されます。 YAML ファイルをデプロイする前に、アプリケーションへの影響を評価することをお勧めします。

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";  // kubelet フラグの設定を開始 $enableADController に設定
            ifFlagTrueNum=`cat /host/etc/systemd/system/kubelet.service.d/10-kubeadm.conf | grep enable-controller-attach-detach=$enableADController | grep -v grep | wc -l`; // enable-controller-attach-detach=$enableADController の行数を取得
            echo "ifFlagTrueNum is $ifFlagTrueNum"; // ifFlagTrueNum は $ifFlagTrueNum です
            if [ "$ifFlagTrueNum" = "0" ]; then // ifFlagTrueNum が 0 の場合
                curValue="true"; // curValue を true に設定
                if [ "$enableADController" = "true" ]; then // enableADController が true の場合
                    curValue="false"; // 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; // enable-controller-attach-detach の値を置換
                restartKubelet="true"; // restartKubelet を true に設定
                echo "current value is $curValue, change to expect "$enableADController; // 現在の値は $curValue で、期待値 $enableADController に変更
            fi;
            if [ "$restartKubelet" = "true" ]; then // restartKubelet が true の場合
                /nsenter --mount=/proc/1/ns/mnt systemctl daemon-reload; // systemctl daemon-reload を実行
                /nsenter --mount=/proc/1/ns/mnt service kubelet restart; // kubelet を再起動
                echo "restart kubelet"; // kubelet を再起動
            fi;
            while true; // 無限ループ
            do
                sleep 5; // 5 秒待機
            done;
          volumeMounts:
          - name: etc
            mountPath: /host/etc
      volumes:
        - name: etc
          hostPath:
            path: /etc

次のステップ

FlexVolume から CSI に移行した後、CSI プラグインを使用して動的にプロビジョニングされたディスク ボリュームを作成することで、CSI プラグインが期待どおりに動作するかどうかを確認できます。詳細については、「動的にプロビジョニングされたディスク ボリュームを使用する」をご参照ください。