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

Container Service for Kubernetes:データを格納しないクラスターのFlexVolumeをCSIにアップグレードする

最終更新日:Nov 10, 2024

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 (デプロイとしてデプロイ)

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

  • CSIプラグイン (DaemonSetとしてデプロイ)

    このコンポーネントは、自動ボリュームマウントとアンマウントを実装するために使用されます。 デフォルトでは、このコンポーネントはディスクボリューム、Apsara File Storage NAS (NAS) ボリューム、およびObject Storage Service (OSS) ボリュームをサポートします。

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

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

CSIの概要

FlexVolume

  • ディスクコントローラー (配置として配置)

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

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

    このコンポーネントは、ボリュームマウントとアンマウントを実装するために使用されます。 デフォルトでは、このコンポーネントはディスクボリューム、NASボリューム、およびOSSボリュームをサポートしています。

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 -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のプロビジョニングは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 -nkube-system
    kubectl delete ds csi-plugin -nkube-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コンソールを呼び出し、InstallClusterAddonsCSIプラグインをインストールします。

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

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

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

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

  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プラグインはクラスターで期待どおりに実行されます。

手順3: クラスター内のすべてのノードプールの設定を変更する

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

重要

ノードプール設定を手動で変更すると、kubeletが再起動します。 オフピーク時にこの操作を実行し、他のノードプールを更新する前に、あるノードプールの更新が正しいことを確認することをお勧めします。

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

説明

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

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

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

  3. On theノードプールページで、変更するノードプールを見つけて、編集で、アクション列を作成します。

  4. 表示されるダイアログボックスで、次のいずれかの方法を使用して、ノードプールの設定を変更します。

    • 新しいインスタンスタイプを追加します。

      ノードを追加すると、システムはバックグラウンドでクラスターのボリュームプラグインを自動的に更新します。 新しいノードプール設定が有効になった後、ノードを削除できます。

    • ノードプールのログインパスワードを変更します。

  5. クリック確認.

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

次のコードブロックに基づいてYAMLファイルを作成します。 次に、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";
            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にアップグレードした後、CSIプラグインを使用して動的にプロビジョニングされたディスクボリュームを作成することで、CSIプラグインが期待どおりに実行されるかどうかを確認できます。 詳細については、「動的にプロビジョニングされたディスクボリュームの使用」をご参照ください。