動的プロビジョニングは、File Storage NAS (NAS) ファイルシステム内にサブディレクトリを自動的に作成し、それを永続ボリューム (PV) にマッピングします。Container Service for Kubernetes (ACK) クラスター内のアプリケーションは、永続ボリューム要求 (PVC) を通じてこれらの PV を使用できます。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
-
FlexVolume プラグインがインストールされた ACK マネージドクラスターまたは専用クラスターがあること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
-
クラスターにデプロイされている
alicloud-nas-controllerコンポーネント。 詳細については、「FlexVolume をインストールおよびアップグレードする」をご参照ください。
alicloud-nas-controller が実行されていることを確認するには:
kubectl get pods -n kube-system | grep alicloud-nas-controller
想定される出力:
alicloud-nas-controller-xxxxxxxxx-xxxxx 1/1 Running 0 1d
アプリケーションテンプレートで securityContext.fsgroup が設定されている場合、ボリュームがマウントされた後、kubelet は chmod または chown を実行します。これにより、マウント時間が増加します。詳細については、「NAS ボリュームのマウントに時間がかかるのはなぜですか」をご参照ください。
このトピックでは、FlexVolume プラグインを介して NAS ボリュームを動的にプロビジョニングするため、FlexVolume プラグインがすでにインストールされている既存のクラスターにのみ適用されます。 クラスターを作成すると、1.12 より後のすべての Kubernetes バージョンでは ボリュームプラグイン パラメーターがデフォルトで CSI に設定され、サンドボックス化されたコンテナランタイムを実行するクラスターは常に CSI を使用します。 コンソールから永続ボリュームを作成する場合も、CSI ストレージドライバーが使用されます。 お使いのクラスターで CSI を使用している場合は、このトピックの手順に従わずに、nas-csi-plugin を使用して NAS ボリュームをプロビジョニングしてください。
ステップ 1: StorageClass の作成
-
次の YAML コンテンツを
nas-sc.yamlとして保存します。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas mountOptions: - nolock,tcp,noresvport - vers=3 parameters: server: "23a9649583-i****.cn-shenzhen.nas.aliyuncs.com:/nasroot1/" driver: flexvolume provisioner: alicloud/nas reclaimPolicy: Delete -
StorageClass を作成します。
kubectl apply -f nas-sc.yaml -
StorageClass を確認します。
kubectl get sc alicloud-nas想定される出力:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE alicloud-nas alicloud/nas Delete Immediate false 10s
StorageClass パラメータ
|
パラメータ |
説明 |
|
mountOptions |
永続ボリューム (PV) に適用される NAS ボリュームのマウントオプション。 |
|
server |
PV をプロビジョニングするためのマウントターゲットリストです。形式: nfsurl1:/path1,nfsurl2:/path2。複数のサーバーは、ラウンドロビン順で PV を分配します。Extreme NAS ファイルシステムの場合、パスは /share で始まる必要があります。 |
|
driver |
ボリュームドライバータイプ。デフォルト: |
|
reclaimPolicy |
PV リクレームポリシー。 有効な値: |
ステップ 2: NAS ボリュームを使用する StatefulSet のデプロイ
-
次の YAML コンテンツを
nas-statefulset.yamlとして保存します。これにより、動的にプロビジョニングされた NAS ボリュームを使用するヘッドレス Service と StatefulSet が作成されます。apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 5 volumeClaimTemplates: - metadata: name: html spec: accessModes: - ReadWriteOnce storageClassName: alicloud-nas resources: requests: storage: 2Gi template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine volumeMounts: - mountPath: "/data" name: html -
Service と StatefulSet をデプロイします。
kubectl apply -f nas-statefulset.yaml -
永続ボリューム要求 (PVC) がバインドされていることを確認します。
kubectl get pvc想定される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE html-web-0 Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 2Gi RWO alicloud-nas 2m html-web-1 Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 2Gi RWO alicloud-nas 2m html-web-2 Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 2Gi RWO alicloud-nas 1m html-web-3 Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 2Gi RWO alicloud-nas 1m html-web-4 Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 2Gi RWO alicloud-nas 1m -
すべての Pod が実行されていることを確認します。
kubectl get pods -l app=nginx想定される出力:
NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 3m web-1 1/1 Running 0 2m web-2 1/1 Running 0 2m web-3 1/1 Running 0 1m web-4 1/1 Running 0 1m
データの永続性の確認
StatefulSet が実行された後、Pod の再起動後もデータが永続化されることを確認します。
-
Pod にテストファイルを書き込みます。
kubectl exec web-0 -- sh -c "echo 'Hello from NAS' > /data/test.txt" -
ファイルを読み取ります。
kubectl exec web-0 -- cat /data/test.txt想定される出力:
Hello from NAS -
Pod を削除し、Kubernetes が再作成するのを待ちます。
kubectl delete pod web-0 kubectl wait --for=condition=Ready pod/web-0 --timeout=120s -
Pod の再作成後、再度ファイルを読み取ります。
kubectl exec web-0 -- cat /data/test.txt出力に引き続き
Hello from NASと表示される場合、NAS ボリュームはデータを正しく永続化しています。
リソースのクリーンアップ
以下の順序でリソースを削除します:
-
StatefulSet を削除します。
kubectl delete statefulset web -
Service を削除します。
kubectl delete service nginx -
永続ボリューム要求 (PVC) を削除します。
kubectl delete pvc -l app=nginx -
StorageClass を削除します。
kubectl delete sc alicloud-nas
reclaimPolicy が Delete に設定されている場合、PVC が削除されると、PV は自動的に削除され、対応する NAS サブディレクトリは名前が変更されてアーカイブされます。サブディレクトリをアーカイブする代わりに完全に削除するには、StorageClass で archiveOnDelete を false に設定します。reclaimPolicy が Retain に設定されている場合、PVC を削除した後、PV と NAS サブディレクトリを手動で削除する必要があります。