ここでは、ステートフルサービスの作成に静的クラウドディスクが必要とされる典型的なシナリオおよび、静的クラウドディスクの使用手順を解説します。

シナリオと方法

クラウドディスクを利用するシナリオ
  • 高いディスク I/O パフォーマンスを要求するアプリケーションを作成したいが、共有データが必要ない場合。 たとえば、MySQL、Redis および他のデータストレーサービスなどです。
  • 高速書き込みをするログが必要な場合。
  • お使いの保存データを永続的に存在させる場合。 ポッドのライフサイクルが終了してもデータが存在します。

静的クラウドディスクを利用するシナリオ

クラウドディスクを購入した場合。

静的クラウドディスクの使用方法

手動で PV (Persistent Volume) および PVC (Persistent Volume Claim) を作成します。

前提条件

制限

  • クラウドディスクは非共有ストレージデバイスで、Alibaba Cloud Storage Team により提供されます。 それぞれのクラウドディスクが 1 つのポッドにのみマウントできます。
  • Kubernetes クラスターにおいて、クラウドディスクは、クラウドディスクと同一のゾーンにあるノードに対してのみマウントできます。

PV の作成

  1. pv-static.yaml ファイルを作成します。
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: <your-disk-id>
      labels:
        alicloud-pvname: <your-disk-id>
        failure-domain.beta.kubernetes.io/zone: <your-zone>
        failure-domain.beta.kubernetes.io/region: <your-region>
    spec:
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      flexVolume:
        driver: "alicloud/disk"
        fsType: "ext4"
        options:
          volumeId: "<your-disk-id>"
    • alicloud-pvname: <your-disk-id>: PV 名です。 このパラメーターは、volumeID パラメーターの値と同様のものである必要があります。クラウドディスク ID です。
    • failure-domain.beta.kubernetes.io/zone: <your-zone>: クラウドディスクがあるゾーンです。 たとえば、cn-hangzhou-b となります。
    • failure-domain.beta.kubernetes.io/region: <your-region>: クラウドディスクがあるリージョンです。 たとえば、cn-hangzhou となります。

    複数のゾーンにある Kuberneters クラスターを使用する場合、failure-domain.beta.kubernetes.io/zone パラメーターおよび failure-domain.beta.kubernetes.io/region パラメーターを設定する必要があります。これにより、お使いのポッドがクラウドディスクのあるゾーンに対してスケジューリングされることが確実になります。

  2. 以下のコマンドを実行し、PV を作成します。
    $ kubectl create -f pv-static.yaml

結果

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

PVC の作成

クラウドディスク用の PVC を作成します。 特に、selector フィールドを作成された PV に対してフィルターするために設定する必要があります。これにより、PVC と正しい PV を関連付けることができます。

  1. pvc-static.yaml ファイルの作成
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-disk
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      selector:
        matchLabels:
          alicloud-pvname: <your-disk-id>
  2. 以下のコマンドを実行し、PVC を作成します。
    $ kubectl create -f pvc-static.yaml

結果

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

アプリケーションの作成

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

結果

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

静的クラウドディスク上の永続データストレージ

  1. 以下のコマンドを実行し、作成されたデプロイがあるポッドを表示します。
    $ kubectl get pod | grep static
    nginx-static-78c7dcb9d7-g9lll   2/2     Running     0          32s
  2. 以下のコマンドを実行し、新しいクラウドディスクが /data パスにマウントされたかどうかを確認します。
    $ kubectl exec nginx-static-78c7dcb9d7-g9lll df | grep data
    /dev/vdf        20511312    45080  20449848   1% /data
  3. 以下のコマンドを実行し、/data パスにあるファイルを表示します。
    $ kubectl exec nginx-static-78c7dcb9d7-g9lll ls /data
    lost+found
  4. 以下のコマンドを実行し、/data パスに static という名前のファイルを作成します。
    $ kubectl exec nginx-static-78c7dcb9d7-g9lll touch /data/static
  5. 以下のコマンドを実行し、/data パスにあるファイルを表示します。
    $ kubectl exec nginx-static-78c7dcb9d7-g9lll ls /data
    static
    lost+found
  6. 以下のコマンドを実行し、nginx-static-78c7dcb9d7-g9lll という名前のポッドを削除します。
    $ kubectl delete pod nginx-static-78c7dcb9d7-g9lll
    pod "nginx-static-78c7dcb9d7-g9lll" deleted
  7. もう 1 つの Kubernetes インターフェイスを開きます。以下のコマンドを実行し、上記のポッドの削除、および Kubernetes により新しいポッドが作成されたことを確認します。
    $ kubectl get pod -w -l app=nginx
    NAME                            READY   STATUS    RESTARTS   AGE
    nginx-static-78c7dcb9d7-g9lll   2/2     Running   0          50s
    nginx-static-78c7dcb9d7-g9lll   2/2   Terminating   0     72s
    nginx-static-78c7dcb9d7-h6brd   0/2   Pending   0     0s
    nginx-static-78c7dcb9d7-h6brd   0/2   Pending   0     0s
    nginx-static-78c7dcb9d7-h6brd   0/2   Init:0/1   0     0s
    nginx-static-78c7dcb9d7-g9lll   0/2   Terminating   0     73s
    nginx-static-78c7dcb9d7-h6brd   0/2   Init:0/1   0     5s
    nginx-static-78c7dcb9d7-g9lll   0/2   Terminating   0     78s
    nginx-static-78c7dcb9d7-g9lll   0/2   Terminating   0     78s
    nginx-static-78c7dcb9d7-h6brd   0/2   PodInitializing   0     6s
    nginx-static-78c7dcb9d7-h6brd   2/2   Running   0     8sg   0     8s
  8. 以下のコマンドを実行し、Kubernetes により新しく作成されたポッドを表示します。
    $ kubectl get pod
    NAME                            READY   STATUS      RESTARTS   AGE
    nginx-static-78c7dcb9d7-h6brd   2/2     Running     0          14s
  9. 以下のコマンドを実行し、/data パスに static という名前で作成されたファイルが削除されていないことを確認します。これは、静的クラウドディスク上のデータが永続的に保存されることを示しています。
    $ kubectl exec nginx-static-78c7dcb9d7-h6brd ls /data
    static
    lost+found