ボリューム拡張の使用


Google Kubernetes Engine(GKE)バージョン 1.24 以降では、Kubernetes ボリューム拡張機能を使用して、永続ボリュームの作成後に容量を変更できます。

ボリューム拡張の詳細については、オープンソースの Kubernetes ドキュメントをご覧ください。

前提条件

ボリューム拡張には次の前提条件があります。

  • サイズを変更するボリュームが CSI ドライバによって管理されている場合:
    • GKE クラスタのバージョンが 1.16 以上であることを確認します。 クラスタに Windows ノードプールがある場合は、GKE クラスタのバージョンが 1.18 以降であることを確認します。マネージド GKE Filestore CSI ドライバを使用している場合、クラスタのバージョンは 1.21 以降でなければなりません。
    • ストレージ ベンダーのドキュメントで、CSI ドライバがボリューム拡張をサポートしていることを確認します。Compute Engine Persistent Disk の CSI ドライバと Filestore CSI ドライバは、ボリューム拡張をサポートしています。
  • サイズを変更するボリュームがツリー内ボリューム プラグインによって管理されている場合:
    • GKE クラスタのバージョンが 1.11 以上であることを確認します。GKE クラスタ バージョン 1.11-1.14 では、ツリー内プラグインによって管理されているボリュームの拡張をサポートしますが、ボリューム拡張を完了するには、ボリュームを使用するすべての Pod を終了する必要があります。
    • ストレージ ベンダーのドキュメントを参照して、ツリー内ボリューム プラグインがボリューム拡張をサポートしていることを確認します(Compute Engine Persistent Disk のプラグインはサポートしています)。
  • ReadOnlyMany アクセス モードを使用している場合、ボリュームの拡張は使用できません。

ボリューム拡張の使用

ボリューム拡張を使用するには、次の操作を行います。

  1. StorageClass にまだフィールドがない場合は、allowVolumeExpansion: true を StorageClass に追加します。次に例を示します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: standard
    provisioner: my.driver
    ...
    allowVolumeExpansion: true
    
  2. PersistentVolumeClaim の spec.resources.requests.storage フィールドを編集して、ボリューム容量の変更をリクエストします。

     kubectl edit pvc pvc-name
    

    たとえば、次の PVC のディスクを 30 ギビバイト(GiB)から 40 GiB に変更できます。

    編集前:

     # pvc-demo.yaml
     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
       name: pvc-demo
     spec:
       accessModes:
         - ReadWriteOnce
       resources:
         requests:
           storage: 30Gi
    

    編集後:

     # pvc-demo.yaml
     apiVersion: v1
     kind: PersistentVolumeClaim
     metadata:
       name: pvc-demo
     spec:
       accessModes:
         - ReadWriteOnce
       resources:
         requests:
           storage: 40Gi
    
  3. PVC を表示して変更を確認します。PVC を表示するには、次のコマンドを実行します。

    kubectl get pvc pvc-name -o yaml
    

    最終的に、status.capacity フィールドに新しいボリュームが表示されます。例:

    ...
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 40Gi
      storageClassName: standard
      volumeMode: Filesystem
      volumeName: pvc-078b7484-cc8d-4077-9bcb-2c17d8d4550c
    status:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: 40Gi
    ...
    

PersistentVolume の容量を直接変更すると、コンテナ ファイルシステムが不正になる可能性があります。これらの問題を解決するには、ボリューム拡張の変更のトラブルシューティングをご覧ください。

StatefulSet でのボリューム拡張の管理

Kubernetes の StatefulSet 内の Pod で使用されるボリュームのサイズを増やす必要がある場合は、Pod に関連付けられた PersistentVolumeClaim(PVC)の spec.resources.requests.storage フィールドを調整する必要があります。StatefulSet オブジェクトで volumeClaimTemplates フィールドを直接変更しようとすると、エラーが発生します。

また、StatefulSet のレプリカ数を増やしても、元のサイズの PVC が作成されます。StatefulSet によって管理される Pod 用にプロビジョニングされたボリュームのサイズを永続的に変更するには、StatefulSet オブジェクトを削除して、volumeClaimTemplates フィールドで指定された更新後のサイズで再作成する必要があります。StatefulSet で PVC の自動削除が有効になっていない場合、StatefulSet を削除しても StatefulSet Pod のみが削除され、対応する PVC は削除されません。これらの PVC に更新後のサイズを反映するには、PVC を削除して再作成する必要があります。PVC の ReclaimPolicy によっては、基盤となるストレージも削除されることがあります。

元の Pod を稼働させながら、StatefulSet を調整して新しいボリュームサイズで将来のレプリカをプロビジョニングするには、次の手順を行います。

  1. 既存の StatefulSet をファイルに保存します。

    kubectl get StatefulSet statefulset-name -o yaml > sts-backup.yaml
    
  2. Pod をスタンドアロン Pod として実行したまま、クラスタから StatefulSet オブジェクトを削除します。

    kubectl delete sts statefulset-name --cascade=orphan
    
  3. ローカルに保存された sts-backup.yaml ファイルの新しいボリューム ストレージ サイズ(具体的には、spec.volumeClaimTemplates.spec.resources.requests.storage の値)を編集します。

  4. クラスタに StatefulSet を再作成します。

    kubectl apply -f sts-backup.yaml
    

次のステップ