すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:OSS ベースの FlexVolume を使用したデータの永続化

最終更新日:Feb 25, 2025

クラスター内のノードが実行を停止すると、ノード上のステートフル アプリケーションのコンテナー内のデータが失われ、データの信頼性が損なわれる可能性があります。データ損失のリスクを排除するために、永続ストレージを使用してデータを永続化できます。このトピックでは、Object Storage Service (OSS) ボリュームを使用してデータを永続化する方法について説明します。

背景情報

OSS は、Alibaba Cloud が提供する安全で費用対効果が高く、大容量で信頼性の高いクラウドストレージサービスです。 OSS バケットは、Container Service for Kubernetes (ACK) クラスタ内の複数のポッドにマウントできます。

シナリオ:

  • ディスク I/O の平均要件。

  • 構成ファイル、イメージ、小さなビデオファイルなど、データを共有するための要件。

OSS ボリュームのマウント手順:

  1. OSS バケットを作成します。

  2. Alibaba Cloud アカウントの [アクセスキー ID][アクセスキー シークレット] を取得します。

  3. シークレットを使用して永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。

前提条件

使用上の注意

  • クラスターをアップグレードすると、kubelet と ossfs ドライバーが再起動される場合があります。その結果、マウントされた OSS ディレクトリが使用できなくなります。この場合は、OSS ボリュームがマウントされているポッドを再作成する必要があります。ポッドの YAML ファイルにヘルスチェック設定を追加し、OSS ディレクトリが使用できなくなったときにポッドを再起動して OSS ボリュームを再マウントできます。

  • 上記のエラーは、最新のコンポーネントバージョンで修正されています。

PV を作成する

  1. 次のコマンドを実行して、シークレットを作成します。

    次のコマンドの <your AccessKey ID><your AccessKey Secret> を、Alibaba Cloud アカウントの実際のアクセスキー ID とアクセスキー シークレットに置き換えます。 Alibaba Cloud アカウントの AccessKey ペアを取得するには、ACK コンソールに移動し、ポインターを user アイコンの上に移動して、[アクセスキー] をクリックします。

    kubectl create secret generic osssecret --from-literal=akId='<your AccessKey ID>' --from-literal=akSecret='<your AccessKey Secret>' --type=alicloud/oss -n default

    osssecret: シークレットの名前。カスタム名を指定できます。

    akId: アクセスキー ID。

    akSecret: アクセスキー シークレット。

    --type: シークレットのタイプ。この例では、値は alicloud/oss に設定されています。シークレットとシークレットを使用するポッドは、同じ名前空間に属している必要があります。

  2. 次の pv-oss.yaml ファイルを使用して PV を作成します。

    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"
        secretRef:
          name: "osssecret"  # 前の手順で作成したシークレットの名前に置き換えます。
        options:
          bucket: "docker"                        // OSS バケットの名前に置き換えます。
          path: /path                             // マウントする OSS サブディレクトリの相対パスに置き換えます。
          url: "oss-cn-hangzhou.aliyuncs.com"     // OSS バケットのエンドポイントに置き換えます。
          otherOpts: "-o max_stat_cache_size=0 -o allow_other"   // カスタムパラメーター値に置き換えます。

    パラメーター

    • alicloud-pvname: PV の名前。 PVC の selector フィールドで PV 名を指定して、PV を PVC にバインドできます。

    • Bucket Name: OSS バケットの名前。

    • path: マウントする OSS バケットのルートディレクトリからの相対パス。デフォルト値: /。このパラメーターは、csi-plugin 1.14.8.32-c77e277b-aliyun 以降でサポートされています。

    • url: OSS バケットのエンドポイント。エンドポイントを取得するには、次の手順を実行します。

      1. OSS コンソール にログインします。

      2. 左側のナビゲーションウィンドウで、バケット をクリックします。 [バケット] ページで、内部エンドポイントを取得するバケットの名前をクリックします。

      3. 左側のナビゲーションツリーで、概要 をクリックします。

      4. [ポート] セクションで、バケットのエンドポイントを表示できます。

    • otherOpts: OSS バケットのマウントに使用されるカスタムパラメーター。パラメーターは -o *** -o *** 形式である必要があります。

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

    kubectl create -f pv-oss.yaml

予期される出力:

  1. ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のペインで、[ボリューム] > [永続ボリューム] を選択します。

  3. [永続ボリューム] ページに、新しく作成された PV が表示されます。

PVC を作成する

OSS バケットの PVC を作成します。作成した PV を選択するように PVC の selector パラメーターを構成します。こうすることで、PVC の作成後に PV が PVC に自動的にバインドされます。 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

予期される出力:

  1. ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のペインで、[ボリューム] > [永続ボリューム要求] を選択します。

  3. [永続ボリューム要求] ページに、新しく作成された 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: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            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 フィールドを設定して、ヘルスチェック設定を構成できます。詳細については、「OSS ボリューム」をご参照ください。

  2. 次のコマンドを実行して、デプロイメントを作成します。

    kubectl create -f oss-static.yaml d

予期される出力:

  1. ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のペインで、[ワークロード] > [デプロイメント] を選択します。

  3. [デプロイメント] ページに、新しく作成されたデプロイメントが表示されます。

データの永続性を検証する

  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. 次のコマンドを実行して、tmpfile という名前のファイルを /data パスに作成します。

    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. 別のターミナルウィンドウを開き、次のコマンドを実行して、ポッドがどのように削除および再作成されるかを確認します。

    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. 次のコマンドを実行して、再作成されたポッドの名前をクエリします。

    kubectl get pod

    予期される出力:

    NAME                             READY   STATUS    RESTARTS   AGE
    oss-static-66fbb85b67-zlvmw      1/1     Running   0          40s
  8. 次のコマンドを実行して、tmpfile ファイルが /data パスにまだ存在するかどうかを確認します。 tmpfile が /data パスにまだ存在する場合、データは OSS ボリュームに永続化されます。

    kubectl exec oss-static-66fbb85b67-zlvmw -- ls /data | grep tmpfile

    予期される出力:

    tmpfile