FlexVolume プラグインは非推奨です。新しい Container Service for Kubernetes (ACK) クラスタは、FlexVolume をサポートしていません。既存のクラスタについては、FlexVolume から Container Storage Interface (CSI) に移行することをお勧めします。このトピックでは、CSI を使用して、FlexVolume によって管理されていた静的にプロビジョニングされた File Storage NAS (NAS) ボリュームを引き継ぐ方法について説明します。
FlexVolume と CSI の違い
次の表は、CSI と FlexVolume の違いを示しています。
プラグイン | コンポーネント | kubelet パラメーター | 参照 |
CSI |
| CSI プラグインに必要な kubelet パラメーターは、FlexVolume プラグインに必要なものとは異なります。 CSI プラグインを実行するには、各ノードで kubelet パラメーター | |
FlexVolume |
| FlexVolume プラグインに必要な kubelet パラメーターは、CSI プラグインに必要なものとは異なります。 FlexVolume プラグインを実行するには、各ノードで kubelet パラメーター |
シナリオ
FlexVolume がクラスタにインストールされ、静的にプロビジョニングされた NAS ボリュームのマウントに使用されています。クラスタ内に FlexVolume によって管理されているディスク ボリュームもある場合は、「csi-compatible-controller を使用して FlexVolume から CSI に移行する」を参照してください。
注意事項
FlexVolume から CSI に移行すると、永続ボリューム要求 (PVC) が再作成されます。その結果、ポッドが再作成され、ビジネスが中断されます。オフピーク時に CSI への移行、PVC の再作成、アプリケーションの変更、またはポッドの再起動を伴うその他の操作を実行することをお勧めします。
準備
移行前に、クラスタに CSI を手動でインストールします。
csi-plugin.yaml と csi-provisioner.yaml という名前のファイルを作成します。
次のコマンドを実行して、クラスタに csi-plugin と csi-provisioner をデプロイします。
kubectl apply -f csi-plugin.yaml -f csi-provisioner.yaml
次のコマンドを実行して、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 は正常に動作しています。
手順
この例では、StatefulSet ワークロードを使用して、静的にプロビジョニングされた NAS ボリュームを FlexVolume から CSI に移行する方法を示します。次の図はワークフローを示しています:
手順 1: クラスタ内のボリュームの状態を確認する
次のコマンドを実行して、ポッドの状態をクエリします。
kubectl get pod
期待される出力:
NAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 11m
次のコマンドを実行して、ポッドで使用されている PVC の状態をクエリします。
kubectl describe pod nas-static-1 |grep ClaimName
期待される出力:
ClaimName: nas-pvc
次のコマンドを実行して、PVC の状態をクエリします。
kubectl get pvc
期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nax-pv 512Gi RWX 7m23s
手順 2: CSI によって管理される静的にプロビジョニングされた NAS ボリュームの PVC と PV を作成する
方法 1: Flexvolume2CSI CLI による自動変換Flexvolume2CSI CLI を使用した移行
FlexVolume によって管理される PV と PVC を、CSI によって管理される PV と PVC に変換します。
次のコマンドを実行して、NAS ボリュームの PVC と PV を作成します。
nas-pv-pvc-csi.yaml
は、Flexvolume2CSI CLI を使用して元の PVC と PV を変換した後に、CSI によって管理される PVC と PV を定義する YAML ファイルです。kubectl apply -f nas-pv-pvc-csi.yaml
次のコマンドを実行して、PVC の状態をクエリします。
kubectl get pvc
期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nas-pv 512Gi RWX nas 30m nas-pvc-csi Bound nas-pv-csi 512Gi RWX nas 2s
方法 2: PVC/PV 構成のボリューム プラグインを変更することによる手動変換PVC/PV 構成のボリューム プラグインを変更することで永続ボリュームをプロビジョニングする
FlexVolume によって管理される PV オブジェクトと PVC オブジェクトを保存します。
次のコマンドを実行して、FlexVolume によって管理される PVC オブジェクトを保存します。
kubectl get pvc nas-pvc -oyaml > nas-pvc-flexvolume.yaml cat nas-pvc-flexvolume.yaml
期待される出力:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nas-pvc namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 512Gi selector: matchLabels: alicloud-pvname: nas-pv storageClassName: nas
次のコマンドを実行して、FlexVolume によって管理される永続ボリューム (PV) オブジェクトを保存します。
kubectl get pv nas-pv -oyaml > nas-pv-flexvolume.yaml cat nas-pv-flexvolume.yaml
期待される出力:
apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: nas-pv name: nas-pv spec: accessModes: - ReadWriteMany capacity: storage: 512Gi flexVolume: driver: alicloud/nas options: path: /aliyun server: ***.***.nas.aliyuncs.com vers: "3" persistentVolumeReclaimPolicy: Retain storageClassName: nas
PVC と PV を定義することにより、CSI によって管理される静的にプロビジョニングされた NAS ボリュームを作成します。
nas-pv-pvc-csi.yaml という名前のファイルを作成し、次の YAML コンテンツをファイルに追加して、CSI によって管理される静的にプロビジョニングされた NAS ボリュームを作成します。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nas-pvc-csi namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 512Gi selector: matchLabels: alicloud-pvname: nas-pv-csi storageClassName: nas --- apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: nas-pv-csi name: nas-pv-csi spec: accessModes: - ReadWriteMany capacity: storage: 512Gi csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: nas-pv-csi volumeAttributes: server: "***.***.nas.aliyuncs.com" path: "/aliyun" mountOptions: - nolock,tcp,noresvport - vers=3 persistentVolumeReclaimPolicy: Retain storageClassName: nas
次のコマンドを実行して、NAS ボリュームの PVC と PV を作成します。
kubectl apply -f nas-pv-pvc-csi.yaml
次のコマンドを実行して、PVC の状態をクエリします。
kubectl get pvc
期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nas-pvc Bound nax-pv 512Gi RWX 7m23s
手順 3: アプリケーションに関連付けられている PVC を変更する
次のコマンドを実行して、アプリケーションの構成ファイルを変更します。
kubectl edit sts nas-static
PVC を CSI によって管理されるものに変更します。
volumes: - name: pvc-nas persistentVolumeClaim: claimName: nas-pvc-csi
次のコマンドを実行して、ポッドが再起動されたかどうかを確認します。
kubectl get pod
期待される出力:
NAME READY STATUS RESTARTS AGE nas-static-1 1/1 Running 0 70s
次のコマンドを実行して、マウント情報をクエリします。
kubectl exec nas-static-1 -- mount |grep nas
次の出力が返された場合、ポッドは移行されています。
# マウント情報を表示する ***.***.nas.aliyuncs.com:/aliyun on /var/lib/kubelet/pods/ac02ea3f-125f-4b38-9bcf-9b117f62***/volumes/kubernetes.io~csi/nas-pv-csi/mount type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.XX.XX,mountvers=3,mountport=2049,mountproto=tcp,local_lock=all,addr=192.168.XX.XX)
手順 4: FlexVolume をアンインストールする
OpenAPI Explorer コンソール にログインし、[UnInstallClusterAddons] 操作を呼び出して、FlexVolume プラグインをアンインストールします。
[ClusterId]: クラスタの ID に設定します。クラスタ ID は、クラスタの詳細ページの [基本情報] タブで確認できます。
[name]: 値を Flexvolume に設定します。
詳細については、「クラスタからコンポーネントをアンインストールする」をご参照ください。
次のコマンドを実行して、[alicloud-disk-controller] コンポーネントと [alicloud-nas-controller] コンポーネントを削除します。
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 を削除します。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 はクラスタから削除されています。
手順 5: API を呼び出して CSI をインストールする
OpenAPI Explorer コンソール にログインし、[InstallClusterAddons] を呼び出して、CSI プラグインをインストールします。
[ClusterId]: クラスタの ID に設定します。
[name]: 値を csi-provisioner に設定します。
[version]: 最新バージョンが自動的に指定されます。 CSI バージョンの詳細については、「Csi-provisioner」をご参照ください。
CSI プラグインのインストール方法の詳細については、「ACK クラスタにコンポーネントをインストールする」をご参照ください。
次のコマンドを実行して、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 プラグインはクラスタ内で期待どおりに動作しています。
手順 6: 既存のノードの構成を変更する
次の 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