FlexVolume ストレージプラグインは非推奨となり、新規クラスターではサポートされなくなりました。FlexVolume プラグインを使用している既存のクラスターについては、Container Storage Interface (CSI) プラグインへの移行を推奨します。移行するには、FlexVolume プラグインのアンインストール、CSI プラグインのインストール、およびノードプールと既存ノード設定の更新を実行します。本トピックでは、FlexVolume で管理されているデータのないクラスターの移行プロセスについて説明します。
プラグインの比較
次の表は、CSI ストレージプラグインと FlexVolume ストレージプラグインを比較したものです。
|
プラグイン |
コンポーネント |
kubelet パラメーター |
参考資料 |
|
CSI |
|
このプラグインでは、特定の kubelet パラメーターが必要です。 kubelet パラメーター |
|
|
FlexVolume |
|
このプラグインでは、特定の kubelet パラメーターが必要です。 kubelet パラメーター |
ユースケース
CSI プラグインは FlexVolume プラグインよりも安定性と効率性に優れています。クラスターが次のいずれかの条件を満たす場合、FlexVolume プラグインから CSI プラグインへの移行を推奨します。
-
FlexVolume を使用してクラスターにマウントされたボリュームが存在しません。
-
以前に FlexVolume を使用してボリュームをマウントしましたが、関連データは削除されています。
ステップ 1: FlexVolume のアンインストール
-
OpenAPI Explorer コンソールにログインし、UnInstallClusterAddons API を呼び出して FlexVolume プラグインをアンインストールします。
-
ClusterId: クラスター ID です。クラスターの 基本情報 ページで確認できます。
-
name: Flexvolume.
詳細については、「クラスターアドオンのアンインストール」をご参照ください。
-
-
alicloud-disk-controller および alicloud-nas-controller Deployment を削除します。
kubectl delete deploy -n kube-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 リソースを削除します。これらのリソースのプロビジョナーは 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 コンポーネントを削除する必要があります。
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説明これらの削除操作は、クラスター内の既存の Pod に影響しません。ただし、カスタムコンポーネントを削除してから標準 CSI プラグインをインストールするまでの間、Pod に変更を加えないでください。
-
csi-compatible-controller プラグインを使用していない場合は、OpenAPI を直接呼び出して標準 CSI プラグインをインストールできます。
-
OpenAPI Explorer コンソールにログインし、InstallClusterAddons API を呼び出して CSI プラグインをインストールします。
-
ClusterId: ご利用のクラスター ID。
-
name: csi-provisioner.
-
バージョン: CSI プラグインの最新バージョンです。CSI バージョンの詳細については、「csi-provisioner」をご参照ください。
詳細については、「クラスターアドオンのインストール」をご参照ください。
-
-
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 コンポーネントをインストールした後、既存のノードプールの設定は自動的に更新されません。ノードプールの設定を手動で変更して更新をトリガーする必要があります。更新が正常に完了すると、ノードプール内の新しいノードの --enable-controller-attach-detach kubelet パラメーターは false から true に更新されます。
ノードプールの設定を手動で変更すると、そのプール内のノードで kubelet が再起動します。業務への影響が少ない時間帯にこの操作を実行することを推奨します。1 つのノードプールが正常に更新されたことを確認した後、残りのノードプールを段階的に更新してください。
更新をトリガーするには、インスタンスタイプを追加するか、ログインパスワードを変更して、すべてのノードプールを変更します。このアクションにより、バックエンドでストレージプラグインタイプが更新され、ノード初期化スクリプトの更新がトリガーされ、新しいノードが正しいパラメーターで設定されるようになります。
または、新しいノードプールを作成してから、古いプールを段階的にスケールダウンして削除することもできます。この方法を使用する場合、次の手順をスキップできます。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
-
ノードプール ページで、対象のノードプールを見つけ、編集 列の アクション をクリックします。
-
表示されたダイアログボックスで、ノードプールのインスタンスタイプ設定を変更し、OK をクリックします。
説明この変更は、バックエンドのストレージプラグインタイプの更新をトリガーするためだけに行います。更新が適用された後、この変更を元に戻すことができます。
ステップ 4: 既存ノード設定の変更
次の YAML を適用して、CSI の要件を満たすように kubelet パラメーターを更新します。この DaemonSet は、既存のノードで --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 "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`;
echo "ifFlagTrueNum は $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 "現在の値は $curValue です。$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 "kubelet を再起動します";
fi;
while true;
do
sleep 5;
done;
volumeMounts:
- name: etc
mountPath: /host/etc
volumes:
- name: etc
hostPath:
path: /etc
次のステップ
移行が完了したら、動的にプロビジョニングされたディスクボリュームを作成して、CSI プラグインが正常に動作していることを確認できます。詳細については、「動的にプロビジョニングされたディスクボリュームの使用」をご参照ください。