ここでは、ステートフルサービス作成時に NAS ファイルシステムが必要となる典型的なシナリオ、および NAS ファイルシステムの使用方法を解説します。

シナリオと方法

複数のポッドに NAS ファイルシステムがマウントされている場合、ポッドは NAS ファイルシステム上のデータを共有します。 ポッドにより、NAS ファイルシステム上に保存されたデータが変更された後、ポッドがサポートするアプリケーションは、他のポッドに対し、変更されたデータを自動的に更新する必要があります。

NAS ファイルシステムを使用するシナリオ
  • 高いディスク I/O パフォーマンスを要求するアプリケーションを作成。
  • OSS よりも高い読み取りと書き込み性能を備えたストレージサービスが必要。
  • 異なるホスト間でファイルを共有。 たとえば、NAS ファイルシステムをサーバーとして使用したい場合です。

NAS ファイルシステムの使用方法

  1. NAS ファイルシステムを手動で作成し、マウントポイントへ追加します。
  2. PV および PVC を手動で作成します。

ここでは、Alibaba Cloud により提供される flexvolume プラグインを使用し、PV/PVC モードでの Alibaba Cloud NAS サービスの使用方法を解説します。

前提条件

  • Kubernetes クラスターの作成が必要です。 詳しくは、「Kubernetes クラスターの作成」をご参照ください。
  • kubectl を利用して Kubernetes クラスターへ接続されている必要があります。「kubectl を利用した Kubernetes クラスターへの接続」をご参照ください。
  • NAS コンソールで NAS ファイルシステムが作成されている必要があります。 詳しくは、「ファイルシステムの作成」をご参照ください。 NAS ファイルシステムおよびお使いの Kubernetes クラスターが同一のゾーンにあることを確認する必要があります。
  • 作成された NAS ファイルシステム上の Kubernetes クラスターのマウントポイントが追加されている必要があります。 詳しくは、「マウントポイントの追加」をご参照ください。 NAS ファイルシステムおよびお使いのクラスターが同一の VPC にあることを確認する必要があります。

PV の作成

  1. pv-nas.yaml ファイルの作成
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nas
      labels:
        alicloud-pvname: pv-nas
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteMany
      flexVolume:
        driver: "alicloud/nas"
        options:
          server: "***-**.cn-hangzhou.nas.aliyuncs.com"   ////Replace this value with your mount point.
          path: "/k8s1"
          vers: "4.0"

    パラメーターの説明

    • alicloud-pvname: PV 名です。
    • server: NAS のマウントポイントです。 お使いのマウントポイントを参照するには、NAS コンソールにログインし、左側のナビゲーションウィンドウから [ファイルシステムリスト] をクリックします。[操作] 列の [管理] をクリックし、[マウントポイント] エリアで [マウントアドレス] を参照します。 マウントアドレスはお使いの NAS ファイルシステムのマウントポイントです。

    • path: NAS マウントディレクトリです。 NAS サブディレクトリをお使いのクラスターにマウントすることもできます。 指定した NAS サブディレクトリが存在しない場合、システムにより自動的に NAS サブディレクトリが作成され、お使いのクラスターにマウントされます。
    • vers: (オプション) NFS マウントプロトコルのバージョンナンバーです。 NFS ファイルシステム V3.0 および V4.0 が利用できます。 デフォルトは、V4.0 です。
    • mode: (オプション) マウントディレクトリへのアクセス権限です。 デフォルトでは、このパラメーターは設定されていません。
      • NAS ファイルシステムのルートディレクトリへのアクセス権限は設定できません。
      • 大量のデータが保存された NAS ファイルシステムへ mode パラメーターを設定した場合、NAS ファイルシステムのクラスターへのマウント処理に極端に時間がかかったり、失敗することがあります。 このパラメーターを設定しないことを推奨します。
  2. 以下のコマンドを実行し、PV を作成します。
    $ kubectl create -f pv-nas.yaml

結果

Kubernetes で、左側のナビゲーションウィンドウから [クラスター] > [ボリューム] をクリックし、対象となるクラスターを選択し、作成した PV を参照します。

PVC の作成

NAS ファイルシステムへ PVC を作成します。 特に、"selector" フィールドを設定し、作成された PV へのフィルタリングをする必要があります。これにより、PVC が適切な PV と関連付けられます。

  1. "pvc-nas.yaml" ファイルを作成します。
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-nas
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      selector:
        matchLabels:
          alicloud-pvname: pv-nas
  2. 以下のコマンドを実行し、PVC を作成します。
    $ kubectl create -f pvc-nas.yaml

結果

Kubernetes の左側ナビゲーションウィンドウから [アプリケーション] > [ボリューム要求] をクリックします。対象となるクラスターおよび名前空間を選択し、作成した PVC を参照します。

アプリケーションの作成

  1. nas.yaml を作成します。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nas-static
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
            volumeMounts:
              - name: pvc-nas
                mountPath: "/data"
          volumes:
            - name: pvc-nas
              persistentVolumeClaim:
                claimName: pvc-nas
  2. 以下のコマンドを実行し、デプロイを作成します。
    $ kubectl create -f nas.yaml

結果

Kubernetes の左側ナビゲーションウィンドウから [アプリケーション] > [デプロイ] をクリックします。対象となるクラスターおよび名前空間を選択し、作成されたデプロイを参照します。

ポッドによる NAS ファイルシステムの共有を確認

  1. 以下のコマンドを実行し、作成されたデプロイがあるポッドを表示します。
    $ kubectl get pod
    NAME                             READY   STATUS    RESTARTS   AGE
    nas-static-f96b6b5d7-rcb2f       1/1     Running   0          9m
    nas-static-f96b6b5d7-wthmb       1/1     Running   0          9m
  2. 以下のコマンドを実行し、それぞれのポッドの "/data" パスにあるファイルを表示します。
    $ kubectl exec nas-static-f96b6b5d7-rcb2f ls /data
    $ kubectl exec nas-static-f96b6b5d7-wthmb ls /data
    2 つの "/data" パスが空です。
  3. 以下のコマンドを実行し、1 のポッドの "/data" パスにファイル "nas" を作成します。
    $ kubectl exec nas-static-f96b6b5d7-rcb2f touch /data/nas
  4. 以下のコマンドを実行し、それぞれのポッドの "/data" パスにあるファイルを表示します。
    $ kubectl exec nas-static-f96b6b5d7-rcb2f ls /data
    nas
    $ kubectl exec nas-static-f96b6b5d7-wthmb ls /data
    nas
    1 つのポッドの "/data" パスにファイルを作成すると、2 つのポッドの "/data" パスの両方にファイルが存在します。 これは、2 つのポッドが NAS ファイルシステムを共有していることを意味しています。

NAS ファイルシステム上のデータが永続的に保存されることを確認

  1. 以下のコマンドを実行し、作成したアプリケーションのすべてのポッドを削除します。
    $ kubectl delete pod nas-static-f96b6b5d7-rcb2f nas-static-f96b6b5d7-wthmb
    pod "nas-static-f96b6b5d7-rcb2f" deleted
    pod "nas-static-f96b6b5d7-wthmb" deleted
  2. もう 1 つの Kubernetes インターフェイスを開きます。以下のコマンドを実行し、元のポッドを削除した処理を表示します。さらに、Kubernetes により新しいポッドが作成されます。
    $ kubectl get pod -w -l app=nginx
    NAME                             READY   STATUS    RESTARTS   AGE
    nas-static-f96b6b5d7-rcb2f       1/1     Running   0          27m
    nas-static-f96b6b5d7-wthmb       1/1     Running   0          27m
    nas-static-f96b6b5d7-rcb2f   1/1   Terminating   0     28m
    nas-static-f96b6b5d7-wnqdj   0/1   Pending   0     0s
    nas-static-f96b6b5d7-wnqdj   0/1   Pending   0     0s
    nas-static-f96b6b5d7-wnqdj   0/1   ContainerCreating   0     0s
    nas-static-f96b6b5d7-wthmb   1/1   Terminating   0     28m
    nas-static-f96b6b5d7-nwkds   0/1   Pending   0     0s
    nas-static-f96b6b5d7-nwkds   0/1   Pending   0     0s
    nas-static-f96b6b5d7-nwkds   0/1   ContainerCreating   0     0s
    nas-static-f96b6b5d7-rcb2f   0/1   Terminating   0     28m
    nas-static-f96b6b5d7-wthmb   0/1   Terminating   0     28m
    nas-static-f96b6b5d7-rcb2f   0/1   Terminating   0     28m
    nas-static-f96b6b5d7-rcb2f   0/1   Terminating   0     28m
    nas-static-f96b6b5d7-wnqdj   1/1   Running   0     10s
    nas-static-f96b6b5d7-wthmb   0/1   Terminating   0     28m
    nas-static-f96b6b5d7-wthmb   0/1   Terminating   0     28m
    nas-static-f96b6b5d7-nwkds   1/1   Running   0     17s
  3. 以下のコマンドを実行し、Kubernetes により作成された新しいポッドを表示します。
    $ kubectl get pod
    NAME                             READY   STATUS    RESTARTS   AGE
    nas-static-f96b6b5d7-nwkds       1/1     Running   0          21s
    nas-static-f96b6b5d7-wnqdj       1/1     Running   0          21s
  4. 以下のコマンドを実行し、それぞれのポッドの "/data" パスにあるファイルを表示します。
    $ kubectl exec nas-static-f96b6b5d7-nwkds ls /data 
    nas
    $ kubectl exec nas-static-f96b6b5d7-wnqdj ls /data
    nas
    作成されたファイル "nas" が削除されていません。 これは、NAS ファイルシステム上のデータが永続的に保存されることを示しています。