7.3. ストレージクラスの定義

現時点で、StorageClass オブジェクトはグローバルスコープオブジェクトであり、cluster-admin または storage-admin ユーザーによって作成される必要があります。

重要

Cluster Storage Operator は、使用されるプラットフォームに応じてデフォルトのストレージクラスをインストールする可能性があります。このストレージクラスは Operator によって所有され、制御されます。アノテーションとラベルを定義するほかは、これを削除したり、変更したりすることはできません。異なる動作が必要な場合は、カスタムストレージクラスを定義する必要があります。

以下のセクションでは、StorageClass オブジェクトの基本的な定義とサポートされている各プラグインタイプの具体的な例について説明します。

7.3.1. 基本 StorageClass オブジェクト定義

以下のリソースは、ストレージクラスを設定するために使用するパラメーターおよびデフォルト値を示しています。この例では、AWS ElasticBlockStore (EBS) オブジェクト定義を使用します。

StorageClass 定義の例

kind: StorageClass 1
apiVersion: storage.k8s.io/v1 2
metadata:
  name: gp2 3
  annotations: 4
    storageclass.kubernetes.io/is-default-class: 'true'
    ...
provisioner: kubernetes.io/aws-ebs 5
parameters: 6
  type: gp2
...

1
(必須) API オブジェクトタイプ。
2
(必須) 現在の apiVersion。
3
(必須) ストレージクラスの名前。
4
(オプション) ストレージクラスのアノテーション。
5
(必須) このストレージクラスに関連付けられているプロビジョナーのタイプ。
6
(オプション) 特定のプロビジョナーに必要なパラメーター。これはプラグインによって異なります。

7.3.2. ストレージクラスのアノテーション

ストレージクラスをクラスター全体のデフォルトとして設定するには、以下のアノテーションをストレージクラスのメタデータに追加します。

storageclass.kubernetes.io/is-default-class: "true"

以下に例を示します。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
...

これにより、特定のストレージクラスを指定しない永続ボリューム要求 (PVC) がデフォルトのストレージクラスによって自動的にプロビジョニングされるようになります。ただし、クラスターには複数のストレージクラスを設定できますが、それらのうちの 1 つのみをデフォルトのストレージクラスにすることができます。

注記

ベータアノテーションの storageclass.beta.kubernetes.io/is-default-class は依然として使用可能ですが、今後のリリースで削除される予定です。

ストレージクラスの記述を設定するには、以下のアノテーションをストレーククラスのメタデータに追加します。

kubernetes.io/description: My Storage Class Description

以下に例を示します。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    kubernetes.io/description: My Storage Class Description
...

7.3.3. RHOSP Cinder オブジェクトの定義

cinder-storageclass.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gold
provisioner: kubernetes.io/cinder
parameters:
  type: fast  1
  availability: nova 2
  fsType: ext4 3

1
Cinder で作成されるボリュームタイプ。デフォルトは空です。
2
アベイラビリティーゾーン。指定しない場合、ボリュームは通常 OpenShift Container Platform クラスターのノードがあるすべてのアクティブゾーンでラウンドロビンされます。
3
動的にプロビジョニングされたボリュームで作成されるファイルシステム。この値は、動的にプロビジョニングされる永続ボリュームの fsType フィールドにコピーされ、ボリュームの初回マウント時にファイルシステムが作成されます。デフォルト値は ext4 です。

7.3.4. RHOSP Manila Container Storage Interface (CSI) オブジェクト定義

インストールが完了すると、OpenStack Manila CSI Driver Operator および ManilaDriver は、動的プロビジョニングに必要なすべての利用可能な Manila 共有タイプに必要なストレージクラスを自動的に作成します。

7.3.5. AWS Elastic Block Store (EBS) オブジェクト定義

aws-ebs-storageclass.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: slow
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1 1
  iopsPerGB: "10" 2
  encrypted: "true" 3
  kmsKeyId: keyvalue 4
  fsType: ext4 5

1
(必須) io1gp2sc1st1 から選択します。デフォルトは gp2 です。有効な Amazon Resource Name (ARN) 値については、AWS のドキュメント を参照してください。
2
(オプション) io1 ボリュームのみ。1 GiB あたり 1 秒あたりの I/O 処理数。AWS ボリュームプラグインは、この値と要求されたボリュームのサイズを乗算してボリュームの IOPS を算出します。値の上限は、AWS でサポートされる最大値である 20,000 IOPS です。詳細については、AWS のドキュメント を参照してください。
3
(オプション) EBS ボリュームを暗号化するかどうかを示します。有効な値は true または false です。
4
(オプション) ボリュームを暗号化する際に使用するキーの完全な ARN。値を指定しない場合でも encyptedtrue に設定されている場合は、AWS によってキーが生成されます。有効な ARN 値については、AWS のドキュメント を参照してください。
5
(オプション) 動的にプロビジョニングされたボリュームで作成されるファイルシステム。この値は、動的にプロビジョニングされる永続ボリュームの fsType フィールドにコピーされ、ボリュームの初回マウント時にファイルシステムが作成されます。デフォルト値は ext4 です。

7.3.6. Azure Disk オブジェクト定義

azure-advanced-disk-storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-premium
provisioner: kubernetes.io/azure-disk
volumeBindingMode: WaitForFirstConsumer 1
allowVolumeExpansion: true
parameters:
  kind: Managed 2
  storageaccounttype: Premium_LRS 3
reclaimPolicy: Delete

1
WaitForFirstConsumer を使用することが強く推奨されます。これにより、Pod を利用可能なゾーンから空きのあるワーカーノードにスケジュールするのに十分なストレージがボリュームプロビジョニングされます。
2
許容値は、Shared (デフォルト)、Managed、および Dedicated です。
重要

Red Hat は、ストレージクラスでの kind: Managed の使用のみをサポートします。

Shared および Dedicated の場合、Azure は管理対象外のディスクを作成しますが、OpenShift Container Platform はマシンの OS (root) ディスクの管理ディスクを作成します。ただし、Azure Disk はノードで管理ディスクおよび管理対象外ディスクの両方の使用を許可しないため、Shared または Dedicated で作成された管理対象外ディスクを OpenShift Container Platform ノードに割り当てることはできません。

3
Azure ストレージアカウントの SKU 層。デフォルトは空です。プレミアム VM は Standard_LRS ディスクと Premium_LRS ディスクの両方を割り当て、標準 VM は Standard_LRS ディスクのみを、マネージド VM はマネージドディスクのみを、アンマネージド VM はアンマネージドディスクのみを割り当てることができます。
  1. kindShared に設定されている場合は、Azure は、クラスターと同じリソースグループにあるいくつかの共有ストレージアカウントで、アンマネージドディスクをすべて作成します。
  2. kindManaged に設定されている場合は、Azure は新しいマネージドディスクを作成します。
  3. kindDedicated に設定されており、storageAccount が指定されている場合には、Azure は、クラスターと同じリソースグループ内にある新規のアンマネージドディスク用に、指定のストレージアカウントを使用します。これを機能させるには、以下が前提となります。

    • 指定のストレージアカウントが、同じリージョン内にあること。
    • Azure Cloud Provider にストレージアカウントへの書き込み権限があること。
  4. kindDedicated に設定されており、storageAccount が指定されていない場合には、Azure はクラスターと同じリソースグループ内の新規のアンマネージドディスク用に、新しい専用のストレージアカウントを作成します。

7.3.7. Azure File のオブジェクト定義

Azure File ストレージクラスはシークレットを使用して Azure ストレージアカウント名と Azure ファイル共有の作成に必要なストレージアカウントキーを保存します。これらのパーミッションは、以下の手順の一部として作成されます。

手順

  1. シークレットの作成および表示を可能にする ClusterRole オブジェクトを定義します。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    #  name: system:azure-cloud-provider
      name: <persistent-volume-binder-role> 1
    rules:
    - apiGroups: ['']
      resources: ['secrets']
      verbs:     ['get','create']
    1
    シークレットを表示し、作成するためのクラスターロールの名前。
  2. クラスターロールをサービスアカウントに追加します。

    $ oc adm policy add-cluster-role-to-user <persistent-volume-binder-role>

    出力例

     system:serviceaccount:kube-system:persistent-volume-binder

  3. Azure File StorageClass オブジェクトを作成します。

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: <azure-file> 1
    provisioner: kubernetes.io/azure-file
    parameters:
      location: eastus 2
      skuName: Standard_LRS 3
      storageAccount: <storage-account> 4
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    1
    ストレージクラス名永続ボリューム要求 (PVC) は、関連する永続ボリュームをプロビジョニングするためにこのストレージクラスを使用します。
    2
    eastus などの Azure ストレージアカウントの場所。デフォルトは空であり、新規 Azure ストレージアカウントが OpenShift Container Platform クラスターの場所に作成されます。
    3
    Standard_LRS などの Azure ストレージアカウントの SKU 層。デフォルトは空です。つまり、新しい Azure ストレージアカウントは Standard_LRS SKU で作成されます。
    4
    Azure ストレージアカウントの名前。ストレージアカウントが提供されると、skuName および location は無視されます。ストレージアカウントを指定しない場合、ストレージクラスは、定義された skuName および location に一致するアカウントのリソースグループに関連付けられたストレージアカウントを検索します。

7.3.7.1. Azure File を使用する場合の考慮事項

以下のファイルシステム機能は、デフォルトの Azure File ストレージクラスではサポートされません。

  • シンボリックリンク
  • ハードリンク
  • 拡張属性
  • スパースファイル
  • 名前付きパイプ

また、Azure File がマウントされるディレクトリーの所有者 ID (UID) は、コンテナーのプロセス UID とは異なります。uid マウントオプションは StorageClass オブジェクトに指定して、マウントされたディレクトリーに使用する特定のユーザー ID を定義できます。

以下の StorageClass オブジェクトは、マウントされたディレクトリーのシンボリックリンクを有効にした状態で、ユーザーおよびグループ ID を変更する方法を示しています。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: azure-file
mountOptions:
  - uid=1500 1
  - gid=1500 2
  - mfsymlinks 3
provisioner: kubernetes.io/azure-file
parameters:
  location: eastus
  skuName: Standard_LRS
reclaimPolicy: Delete
volumeBindingMode: Immediate
1
マウントされたディレクトリーに使用するユーザー ID を指定します。
2
マウントされたディレクトリーに使用するグループ ID を指定します。
3
シンボリックリンクを有効にします。

7.3.8. GCE PersistentDisk (gcePD) オブジェクトの定義

gce-pd-storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard 1
  replication-type: none
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
reclaimPolicy: Delete

1
pd-standard または pd-ssd のいずれかを選択します。デフォルトは pd-standard です。

7.3.9. VMWare vSphere オブジェクトの定義

vsphere-storageclass.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: slow
provisioner: kubernetes.io/vsphere-volume 1
parameters:
  diskformat: thin 2

1
OpenShift Container Platform で VMware vSphere を使用する方法の詳細については、VMware vSphere のドキュメント を参照してください。
2
diskformat: thinzeroedthick および eagerzeroedthick はすべて有効なディスクフォーマットです。ディスクフォーマットの種類に関する詳細は、vSphere のドキュメントを参照してください。デフォルト値は thin です。