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

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

最終更新日:Feb 26, 2026

ノード障害発生時、ステートフルアプリケーションのコンテナーに保存されたデータが失われたり、信頼性が低下したりする可能性があります。データ損失を防ぐには、永続ストレージを使用します。このトピックでは、Object Storage Service (OSS) ボリュームを使用してデータを永続化する方法について説明します。

背景情報

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

一般的なユースケースは次のとおりです。

  • ディスク I/O が低い場合。

  • 構成ファイル、イメージ、ショートビデオファイルなどの共有ワークロード。

OSS の使用方法

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

  2. AccessKey IDAccessKey Secret を取得します。

  3. Secret を使用して、永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。

前提条件

注意事項

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

  • この問題は、最新バージョンを使用して OSS をマウントすることで解決されています。

PV の作成

  1. 次のコマンドを実行して Secret を作成します。

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

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

    osssecret: Secret の名前。カスタム名を指定できます。

    akId: AccessKey ID。

    akSecret: AccessKey Secret。

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

  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"  # Replace with the name of the Secret you created in the previous step.
        options:
          bucket: "docker"                        // Replace with your bucket name.
          path: /path                             // Replace with your relative subdirectory path.
          url: "oss-cn-hangzhou.aliyuncs.com"     // Replace with your endpoint.
          otherOpts: "-o max_stat_cache_size=0 -o allow_other"   // Replace with your custom parameters.

    パラメーター:

    • alicloud-pvname: PV の名前。このラベルを PVC の selector フィールドで使用して、PV を PVC にバインドします。

    • bucket: OSS バケットの名前。

    • path: バケットのルートからの相対パス。デフォルトは / です。csi-plugin v1.14.8.32-c77e277b-aliyun 以降でサポートされています。

    • url: OSS バケットのエンドポイント。見つけるには:

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

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

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

      4. アクセスタイプ セクションで、バケットの エンドポイントを 確認します。

    • otherOpts: カスタムマウントパラメーター。形式: -o *** -o ***

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

    kubectl create -f pv-oss.yaml

期待される結果:

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

  2. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ボリューム] > [永続ボリューム] を選択します。

  3. ボリューム ページに、作成したばかりの PV が表示されます。

PVC の作成

OSS バケットの永続ボリューム要求 (PVC) を作成します。selector フィールドを使用して PV と一致させます。これにより、PVC と PV の間の正確なバインディングが保証されます。storageClassName フィールドを使用して、OSS タイプの PV のみにバインディングを制限します。

  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 コンソールにログインします。ACK コンソール。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. ボリュームクレーム ページで、作成したばかりの 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. 次のコマンドを実行して Deployment を作成します。

    kubectl create -f oss-static.yaml

期待される結果:

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

  2. [デプロイメント] ページで、新しく作成されたデプロイメントを表示できます。

OSS 永続ストレージ

  1. 次のコマンドを実行して、Deployment を実行している Pod の名前を取得します。

    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 という名前の Pod を削除します。

    kubectl delete pod oss-static-66fbb85b67-dqbl2

    期待される出力:

    pod "oss-static-66fbb85b67-dqbl2" deleted
  6. 別のターミナルウィンドウで、次のコマンドを実行して Pod の削除と再作成のプロセスを監視します。

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

    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