従来のストレージソリューションにおける複雑なアクセスパスと高いレイテンシーは、しばしば I/O パフォーマンスを低下させます。サンドボックス化されたコンテナーに Network Attached Storage (NAS) ファイルシステムを直接マウントすると、ストレージパスが最適化され、コンテナーが NAS ファイルシステムに直接読み書きできるようになり、パフォーマンスが大幅に向上します。このトピックでは、このダイレクトマウントの仕組みと実装方法について説明します。
背景情報
Virtio-fs は、ボリューム、シークレット、ConfigMap などのリソースを仮想マシンのゲストオペレーティングシステムと共有できる共有ファイルシステムです。この設定により、NAS ファイルシステムをボリューム経由でネイティブにマウントできます。
しかし、この設定では、NAS はホストノードにマウントされます。コンテナーが NAS にアクセスする場合、その I/O は virtio-fs を経由してホストにマウントされたファイルシステムに到達する必要があり、これによりパフォーマンスのオーバーヘッドが発生します。
サンドボックス化されたコンテナーは、NAS ファイルシステムのダイレクトマウントをサポートしています。これを実現するために、システムはホストから NAS マウントポイントをアンマウントし、ゲストオペレーティングシステム内に NAS ファイルシステムをマウントし、それをコンテナーにバインドマウントします。このプロセスにより、コンテナーは NAS ファイルシステムに直接読み書きできるようになり、ネイティブに近いパフォーマンスを提供します。
仕組み
サンドボックス化されたコンテナーにおける NAS ファイルシステムのダイレクトマウントプロセスは次のとおりです。
Kubelet は CSI-Plugin に NAS ボリュームのマウントをリクエストします。
CSI-Plugin はホストに NAS ファイルシステムをマウントします。
Kubelet は Kangaroo-Runtime にコンテナーの作成をリクエストします。
Kangaroo-Runtime は NAS マウント情報を解析し、それをゲストオペレーティングシステムに渡し、同時にホストから NAS ファイルシステムをアンマウントします。
Kangaroo-Runtime は Agent にコンテナーの作成をリクエストします。
Agent はゲストオペレーティングシステム内に NAS ファイルシステムをマウントします。
Agent はゲストオペレーティングシステムからコンテナーに NAS ファイルシステムをバインドマウントします。
前提条件
NAS ファイルシステムを作成し、NAS ファイルシステムのマウントポイント情報を取得します。
重要NAS ファイルシステムと ACK クラスターは、同じ Virtual Private Cloud (VPC) 内にある必要があります。
手順
静的にプロビジョニングされた PersistentVolume (PV) を作成します。
次の YAML を
nas-pv-csi.yamlとして保存します。apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: nas-pv-csi name: nas-pv-csi spec: accessModes: - ReadWriteMany capacity: storage: 5Gi csi: driver: nasplugin.csi.alibabacloud.com volumeAttributes: options: noresvport,nolock path: /csi server: ${nas-server-address} # 実際の NAS マウントポイントアドレスに置き換えます。 # フォーマット: file-system-id.region.nas.aliyuncs.com # 取得方法: 1) NAS コンソール > ファイルシステムに移動します。 # 2) ファイルシステムを選択し、「マウントポイント」タブに移動します。 # 3) 「マウントターゲットドメイン名」をコピーします。 vers: "3" volumeHandle: nas-pv-csi persistentVolumeReclaimPolicy: Retain次のコマンドを実行して、静的にプロビジョニングされた PV を作成します。
kubectl create -f nas-pv-csi.yaml
NAS ストレージ用の PersistentVolumeClaim (PVC) を作成します。
selector.matchLabelsを使用して、そのラベルによって PVC を PV にバインドします。次の YAML を
nas-pvc-csi.yamlとして保存します。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nas-pvc-csi namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: nas-pv-csi次のコマンドを実行して PVC を作成します。
kubectl create -f nas-pvc-csi.yaml
アプリケーションを作成し、PVC をマウントします。
次の YAML を
deploy-nas-csi.yamlとして保存します。apiVersion: apps/v1 kind: Deployment metadata: name: deploy-nas-csi spec: replicas: 2 selector: matchLabels: app: busybox template: metadata: labels: app: busybox annotations: storage.alibabacloud.com/enable_nas_passthrough: "true" spec: runtimeClassName: runv containers: - name: busybox image: registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 command: - tail - -f - /dev/null volumeMounts: - name: nas-pvc mountPath: "/data" restartPolicy: Always volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-pvc-csi # PVC をバインドするには、前のステップで作成した PVC 名と一致させる必要があります。デフォルトでは、Pod の NAS ダイレクトマウントは無効になっています。NAS パススルー機能を有効にするには、Pod テンプレートに次のアノテーションを追加します。
annotations: storage.alibabacloud.com/enable_nas_passthrough: "true"次のコマンドを実行してアプリケーションを作成します。
kubectl create -f deploy-nas-csi.yaml
マウントを検証します。
次のコマンドを実行して Pod 情報を表示します。
kubectl get pods期待される出力:
NAME READY STATUS RESTARTS AGE deploy-nas-csi-847f8b****-qmv2m 1/1 Running 0 47s deploy-nas-csi-847f8b****-wj8k5 1/1 Running 0 47s次のコマンドを実行して、指定した Pod でシェルを開きます。
kubectl exec -it deploy-nas-csi-847f8b****-qmv2m -- sh次のコマンドを実行してマウント情報を表示します。
mount出力に
/dataマウントポイントのエントリが含まれている場合、マウントは成功です。マウントが成功すると、次のような出力が生成されます。