ここでは、ステートフルサービスの作成時に OSS (Object Storage Service) バケットが必要となる典型的なシナリオ、および バケットの使用方法を解説します。

シナリオと方法

Alibaba Cloud OSS は大規模でセキュリティ保護された低コストの高可用性クラウドストレージサービスを提供しています。 OSS バケットは複数のポッドにマウントすることができます。

シナリオ

  • 高いディスク I/O パフォーマンスを必要としない場合。
  • ファイル、図、および短いビデオなどの共有サービスを設定する必要がある場合。

方法

  1. バケットを手動で作成します。
  2. AccessKey IDAccessKey シークレット を取得します。
  3. PV (Persistent Volume) および PVC (Persistent Volume Claim) を手動で作成します。

前提条件

注意事項

  • Alibaba Cloud Container Service の Kubernetes クラスターのアップグレードにより、kubelet および OSSFS ドライバーが再起動されます。 その結果、OSS ディレクトリが利用できなくなります。 このような場合、OSS バケットを使用するポッドを再度作成する必要があります。 お使いのアプリケーションの YAML ファイルにヘルスチェックの設定を追加することを推奨します。 お使いのクラスターにヘルスチェックの設定を追加した場合、お使いのコンテナー内の OSS ディレクトリが利用できなくなった際にポッドが自動的に再起動され、OSS バケットが再マウントされます。
  • 最新の Kubernetes クラスターをお使いの場合、上記の問題の影響はありません。

PV の作成

  1. pv-oss.yaml ファイルを作成します。
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-oss
      labels:
        alicloud-pvname: pv-oss
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteMany
      storageClassName: oss
      flexVolume:
        driver: "alicloud/oss"
        options:
          bucket: "docker"                        ////Replace this value with your bucket name.
          url: "oss-cn-hangzhou.aliyuncs.com"     ////Replace this value with your URL.
          akId: "***"                             ////Replace this value with your AccessKey ID.
          akSecret: "***"                         ////Replace this value with your AccessKey Secret.
          otherOpts: "-o max_stat_cache_size=0 -o allow_other"   ////Replace this value with your specified otherOpts value.
    パラメーターの説明
    • alicloud-pvname: PV 名です。 このパラメーターの値は PV と関連付けられた PVC の selector フィールドで使用される必要があります。
    • bucket: バケット名です。 Kubernetes クラスターへマウントされるバケットのみです。 バケット上のサブディレクトリまたはファイルは、どの Kubernetes クラスターにもマウントできません。
    • url: OSS バケットのアクセスに使われるドメイン名、つまりエンドポイントです。 詳しくは、「リージョンとエンドポイント」をご参照ください。 OSS コンソールから 作成された OSS バケットのエンドポイントを参照することもできます。 OSS コンソールにログインし、対象となるバケットを選択します。"ドメイン名" エリアに [エンドポイント] が表示されます。
    • akId: お使いの AccessKey ID です。 Container Service で右上角の をクリックします。 プライマリアカウントに関しては、[アクセスキー] を選択します。 RAM ユーザーに関しては。[AccessKey] を選択します。 その後、お使いの AccessKey ID および AccessKey シークレット が作成できます。
    • akSecret: お使いの AccessKey Secretです。 このパラメーターの値を取得した方法と同じ方法で、akId パラメーターの値を取得します。
    • otherOpts: OSS バケットのマウントに関するカスタマイズパラメーターを示します。 このパラメーターを -o *** -o *** の形式で設定します。 詳しくは、「よくある質問」をご参照ください。
  2. 以下のコマンドを実行し、PV を作成します。
    $ kubectl create -f pv-oss.yaml

結果

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

PVC の作成

OSS バケットへの PVC を作成します。 特に、selector フィールドを設定し、作成された PV へのフィルタリングをする必要があります。これにより、PVC が適切な PV と関連付けられます。 storageClassName を設定して、OSS タイプの PV のみと PVC を関連付けます。

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

結果

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

アプリケーションの作成

  1. oss-static.yaml ファイルの作成
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: oss-static
      labels:
        app: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
            volumeMounts:
              - name: pvc-oss
                mountPath: "/data"
              - name: pvc-oss
                mountPath: "/data1"
            livenessProbe:
              exec:
                command:
                - sh
                - -c
                - cd /data
              initialDelaySeconds: 30
              periodSeconds: 30
          volumes:
            - name: pvc-oss
              persistentVolumeClaim:
                claimName: pvc-oss
    LivenessProbe については詳しくは、「Alibaba Cloud OSS ボリュームの使用」をご参照ください。
  2. 以下のコマンドを実行し、デプロイを作成します。
    $ kubectl create -f oss-static.yaml d
結果
Kubernetes で、左側のナビゲーションウィンドウから [アプリケーション] > [デプロイ] をクリックします。対象となるクラスターおよび名前空間を選択し、作成されたデプロイを参照します。

OSS バケット上のデータが永続的に保存されることを確認する

  1. 以下のコマンドを実行し、作成されたデプロイが存在するポッドを表示します。
    $ kubectl get pod
    NAME                             READY   STATUS    RESTARTS   AGE
    oss-static-66fbb85b67-dqbl2      1/1     Running   0          1h
  2. 以下のコマンドを実行し、/data パスにあるファイルを表示します。
    $ kubectl exec oss-static-66fbb85b67-dqbl2 ls /data | grep tmpfile
    /data パスは空です。
  3. 以下のコマンドを実行し、/data パスに tmpfile という名前のファイルを作成します。
    $ kubectl exec oss-static-66fbb85b67-dqbl2 touch /data/tmpfile
  4. 以下のコマンドを実行し、/data パスのファイルを表示します。
    $ kubectl exec oss-static-66fbb85b67-dqbl2 ls /data | grep tmpfile
    tmpfile
  5. 以下のコマンドを実行し、oss-static-66fbb85b67-dqbl2 という名前のポッドを削除します。
    $ kubectl delete pod oss-static-66fbb85b67-dqbl2
    pod "oss-static-66fbb85b67-dqbl2" deleted
  6. もう 1 つの kubectl インターフェイスを開きます。以下のコマンドを実行し、上記でポッドを削除した処理を表示します。さらに、Kubernetes により新しいポッドが作成されます。
    $ kubectl get pod -w -l app=nginx
    NAME                             READY   STATUS    RESTARTS   AGE
    oss-static-66fbb85b67-dqbl2      1/1     Running   0          78m
    oss-static-66fbb85b67-dqbl2   1/1   Terminating   0     78m
    oss-static-66fbb85b67-zlvmw   0/1   Pending   0     <invalid>
    oss-static-66fbb85b67-zlvmw   0/1   Pending   0     <invalid>
    oss-static-66fbb85b67-zlvmw   0/1   ContainerCreating   0     <invalid>
    oss-static-66fbb85b67-dqbl2   0/1   Terminating   0     78m
    oss-static-66fbb85b67-dqbl2   0/1   Terminating   0     78m
    oss-static-66fbb85b67-dqbl2   0/1   Terminating   0     78m
    oss-static-66fbb85b67-zlvmw   1/1   Running   0     <invalid>
  7. 以下のコマンドを実行し、Kubernetes により作成されたポッドを表示します。
    $ kubectl get pod
    NAME                             READY   STATUS    RESTARTS   AGE
    oss-static-66fbb85b67-zlvmw      1/1     Running   0          40s
  8. 以下のコマンドを実行し、data 内の tmpfile という名前で作成されたファイルが削除されていないことを確認します。これは、OSS バケットのデータが永続的に保存されることを示します。
    $ kubectl exec oss-static-66fbb85b67-zlvmw ls /data | grep tmpfile
    tmpfile