Alibaba Cloud NAS ボリュームを Container Service の Kubernetes クラスターで使用できます。

Alibaba Cloud の NAS ファイルシステム を Kubernetes クラスターに、以下の 2 つのタイプのボリュームとしてマウントできます。

  • 静的ボリューム
    静的ボリュームを以下の 2 つの方法のどちらかで使用できます。
    • FlexVolume プラグインを通じた静的ボリュームの使用
      • 静的ボリュームを直接使用します。
      • PV (Persistent Volume) および PVC (Persistent Volume Claim) を通じて、静的ボリュームを使用します。
    • Kubernetes の NFS ドライバーを通じた静的ボリュームの使用
  • 動的ボリューム

前提条件

NAS コンソールで NAS ファイルシステムを作成し、そのファイルシステムで Kubernetes クラスター用のマウントポイントを追加しておく必要があります。 NAS ファイルシステム、およびお使いのクラスターが同一の VPC 上にあることをご確認ください。

静的ボリューム

Alibaba Cloud NAS ファイルストレージサービスを、Alibaba Cloud により提供される FlexVolume プラグイン、または Kubernetes の NFS ドライバーにより使用できます。

FlexVolume プラグインを通じた静的ボリュームの使用

FlexVolume プラグインにより、Alibaba Cloud NAS ボリュームを直接使用、または PV および PVC を通じて使用できます。

  • NAS: 複数のポッドに対して同時にストレージサービスを提供する、共有ストレージシステムです。
  • server: NAS ファイルシステムのマウントポイントを定義します。
  • path: NAS ボリュームに接続するマウントディレクトリを定義します。 NAS サブディレクトリを指定し、お使いの NAS ボリュームをマウントすることができます。 指定した NAS サブディレクトリが存在しない場合、システムは自動的に NAS サブディレクトリを作成し、お使いの NAS ボリュームをマウントします。
  • vers: NFS マウントプロトコルのバージョンナンバーを定義します。 NFS ファイルシステムバージョン 3.0 および 4.0 がサポートされます。
  • mode: マウントディレクトリのアクセス権限を定義します。 マウントディレクトリが NAS ファイルシステムのルートディレクトリの場合、ルートディレクトリに対するアクセス権限は設定されません。 大量のデータが保存された NAS ファイルシステムへ "mode" パラメーターが設定された場合は、クラスターへの NAS ファイルシステムのマウント処理に極端に時間がかかったり、失敗することがあります。

静的ボリュームの直接使用

nas-deploy.yaml ファイルを使用し、以下のとおりポッドを作成します。

apiVersion: v1
kind: Pod
metadata:
  name: "flexvolume-nas-example"
spec:
  containers:
    - name: "nginx"
      image: "nginx"
      volumeMounts:
        - name: "nas1"
          mountPath: "/data"
  volumes:
    - name: "nas1"
      flexVolume:
        driver: "alicloud/nas"
        options:
          server: "0cd8b4a576-grs79.cn-hangzhou.nas.aliyuncs.com"
          path: "/k8s"
          vers: "3"

PV および PVC を通じた静的ボリュームの使用

手順 1: PV の作成

NAS ボリュームを YAML ファイルによって、または Alibaba Cloud Container Service コンソールによって作成できます。

  • YAM ファイルによる PV の作成

    nas-pv.yaml ファイルを使用した PV の作成は以下のようになります。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nas
    spec:
      capacity:
        storage: 5Gi
      storageClassName: nas
      accessModes:
        - ReadWriteMany
      flexVolume:
        driver: "alicloud/nas"
        options:
          server: "0cd8b4a576-uih75.cn-hangzhou.nas.aliyuncs.com"
          path: "/k8s"
          vers: "3"
  • Container Service コンソールでの NAS ボリュームの作成
    1. Container Service コンソール にログインします。
    2. Container Service-Kubernetes の左側のナビゲーションウインドウで、 [クラスター] > [ボリューム] を選択します。
    3. [ボリューム] ページで、目的のクラスターを選択し、[作成] をクリックします。
    4. 表示されるダイアログ ボックスで、永続ボリュームのパラメーターを設定します。
      • PV タイプ: この例では "NAS" が選択されています。
      • ボリューム名: ボリューム名をカスタマイズします。 ボリューム名はクラスター内で固有である必要があります。 この例では、"pv-nas" がボリューム名として設定されています。
      • 容量: ボリュームの容量を設定します。 ボリュームの容量が NAS ファイルシステムの容量を超えていないことを確認してください。
      • アクセスモード: デフォルトでは、 "ReadWriteOnce" に設定されています。
      • マウントポイントドメイン名: NAS ファイルシステムが Kubernetes クラスターへマウントされるために使用される、マウントポイントのマウントアドレスを入力します。
      • パス: NAS パス上のサブディレクトリです。これはスラッシュ ( / ) から始まります。 サブディレクトリを指定した場合、お使いのボリュームは、サブディレクトリにマウントされます。
        • サブディレクトリが NAS ファイルシステムのルートディレクトリに存在しない場合、デフォルトでシステムにより自動的にサブディレクトリが作成されます。
        • このパラメーターはオプションです。 デフォルトでは、NAS ボリュームは NAS ファイルシステムのルートディレクトリにマウントされます。
      • 権限: マウントディレクトリのアクセス権限を設定します。 たとえば、このパラメーターを 755、644 または 777 に設定できます。
        • NAS ボリュームを NAS サブディレクトリにマウントする場合にのみ、このパラメーターを設定できます。 NAS ボリュームを NAS ルートディレクトリにマウントする場合は、このパラメーターを設定できません。
        • このパラメーターはオプションです。 デフォルトでは、NAS ファイルシステムへの元のアクセス権限が使用されます。
      • バージョン: ボリュームのバージョンを設定します。
      • タグ: ボリュームにタグを追加します。
    5. [作成] をクリックします。

手順 2: PVC の作成

nas-pvc.yaml ファイルを使用して、以下のように PVC を作成します。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nas
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nas
  resources:
    requests:
      storage: 5Gi

手順 3: ポッドの作成

nas-pod.yaml ファイルを使用して、以下のようにポッドを作成します。

apiVersion: v1
kind: Pod
metadata:
  name: "flexvolume-nas-example"
spec:
  containers:
    - name: "nginx"
      image: "nginx"
      volumeMounts:
          - name: pvc-nas
            mountPath: "/data"
  volumes:
  - name: pvc-nas
    persistentVolumeClaim:
        claimName: pvc-nas
Kubernetes NFS ドライバーの使用
Alibaba Cloud NAS は NFS 3.0 および NFS 4.0 をサポートしています。 NAS ボリューム作成時に、利用可能な NFS バージョンを設定する必要があります。

手順 1: NAS ファイルシステムの作成

NAS コンソール にログインし、NAS ファイルシステムを作成します。

NAS ファイルシステムとクラスターが,同じリージョンにあることを確認する必要があります。

たとえば、お使いの NAS ファイルシステムのマウントポイントが 055f84ad83-ixxxx.cn-hangzhou.nas.aliyuncs.com であると仮定します。

手順 2: PV の作成

NAS ボリュームを、オーケストレーションテンプレート、または Alibaba Cloud Container Service により作成できます。

  • オーケストレーションテンプレートを使用した NAS ボリュームの作成

    nas-pv.yaml ファイルを使用して PV を作成します。

    次のコマンドを実行して、NAS PV を作成します。

    root@master # cat << EOF |kubectl apply -f -
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: nas
    spec:
      capacity:
        storage: 8Gi
      accessModes:
        - ReadWriteMany
      mountOptions:
        - nolock,tcp,noresvport
        - nfsvers=3
      persistentVolumeReclaimPolicy: Retain
      nfs:
        path: /
        server: 055f84ad83-ixxxx.cn-hangzhou.nas.aliyuncs.com
    EOF
  • Container Service コンソールでの NAS ボリュームの作成

    詳しくは、「PV および PVC の利用」をご参照ください。

手順 2: PVC の作成

PV のバインドをリクエストする PVC を作成します。

root@master # cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
     name: nasclaim
spec:
     accessModes:
       - ReadWriteMany
     resources:
       requests:
         storage: 8Gi
EOF

手順 3: ポッドの作成

マウントを宣言するアプリケーションを作成し、ボリュームを使用します。

root@master # cat << EOF |kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
     name: mypod
spec:
     containers:
       - name: myfrontend
         image: registry.aliyuncs.com/spacexnice/netdia:latest
         volumeMounts:
         - mountPath: "/var/www/html"
           name: mypd
     volumes:
       - name: mypd
         persistentVolumeClaim:
           claimName: nasclaim
EOF

NAS ファイルシステムは、ポッドで実行するアプリケーションへ正常にマウントされました。

動的ボリューム

動的な NAS ボリュームを使用するため、手動でドライバープラグインをインストールし、NAS マウントポイントを設定する必要があります。
動的な NAS ボリュームの生成は、既存の NAS ファイルシステム上のディレクトリへの自動的な生成となります。 このディレクトリはターゲットボリュームとして定義されます。
プラグインのインストール
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-nas
mountOptions:
- nolock,tcp,noresvport
- vers=3
provisioner: alicloud/nas
reclaimPolicy: Retain

---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: alicloud-nas-controller
  namespace: kube-system
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: alicloud-nas-controller
    spec:
      tolerations:
      - effect: NoSchedule
        operator: Exists
        key: node-role.kubernetes.io/master
      - effect: NoSchedule
        operator: Exists
        key: node.cloudprovider.kubernetes.io/uninitialized
      nodeSelector:
        node-role.kubernetes.io/master: ""
      serviceAccount: admin
      containers:
        - name: alicloud-nas-controller
          image: registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v3.1.0-k8s1.11
          volumeMounts:
          - mountPath: /persistentvolumes
            name: nfs-client-root
          env:
            - name: PROVISIONER_NAME
              value: alicloud/nas
            - name: NFS_SERVER
              value: 0cd8b4a576-mmi32.cn-hangzhou.nas.aliyuncs.com
            - name: NFS_PATH
              value: /
      volumes:
      - name: nfs-client-root
        flexVolume:
          driver: alicloud/nas
          options:
            path: /
            server: 0cd8b4a576-mmi32.cn-hangzhou.nas.aliyuncs.com
            vers: "3"

動的ボリュームの使用

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 2
  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: "/usr/share/nginx/html/"
          name: html