第3章 永続ストレージの設定

3.1. AWS Elastic File System を使用した永続ストレージ

OpenShift Container Platform では、Amazon Web Services (AWS) Elastic File System ボリューム (EFS) を使用できます。AWS EC2 を使用して、OpenShift Container Platform クラスターに永続ストレージをプロビジョニングできます。これには、Kubernetes および AWS についてのある程度の理解があることが前提となります。

重要

Elastic File System はテクノロジープレビュー機能です。テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。Red Hat は実稼働環境でこれらを使用することを推奨していません。これらの機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様は機能性をテストし、開発プロセス中にフィードバックをお寄せいただくことができます。

Red Hat のテクノロジープレビュー機能のサポート範囲についての詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

Kubernetes 永続ボリュームフレームワークは、管理者がクラスターのプロビジョニングを永続ストレージを使用して実行できるようにし、ユーザーが基礎となるインフラストラクチャーの知識がなくてもこれらのリソースを要求できるようにします。AWS Elastic Block Store ボリュームは動的にプロビジョニングできます。永続ボリュームは単一のプロジェクトまたは namespace にバインドされず、それらは OpenShift Container Platform クラスター間で共有できます。PersistentVolumeClaim (永続ボリューム要求、PVC) はプロジェクトまたは namespace に固有のもので、ユーザーによって要求されます。

3.1.1. 前提条件

  • EFS ボリュームのセキュリティーグループからのインバウンド NFS トラフィックを許可するように AWS セキュリティーグループを設定します。
  • AWS EFS ボリュームを、任意のホストからの着信 SSH トラフィックを許可するように設定します。

3.1.2. EFS 変数を ConfigMap に保存します。

ConfigMap を使用して、EFS プロビジョナーに必要なすべての環境変数を含めることが推奨されます。

手順

  1. 以下の内容が含まれる configmap.yaml ファイルを作成して、環境変数を含む OpenShift Container Platform ConfigMap を定義します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: efs-provisioner
    data:
      file.system.id: <file-system-id> 1
      aws.region: <aws-region> 2
      provisioner.name: openshift.org/aws-efs 3
      dns.name: "" 4
    1
    Amazon Web Services (AWS) EFS ファイルシステム ID を定義します。
    2
    EFS ファイルシステムの AWS リージョン (例: us-east-1)。
    3
    関連付けられた StorageClass のプロビジョナーの名前。
    4
    EFS ボリュームが置かれる新規 DNS 名を指定するオプションの引数。DNS 名が指定されていない場合、プロビジョナーは <file-system-id>.efs.<aws-region>.amazonaws.com で EFS ボリュームを検索します。
  2. ファイルを設定したら、以下のコマンドを実行してクラスター内にこのファイルを作成します。

    $ oc create -f configmap.yaml -n <namespace>

3.1.3. EFS ボリュームの認可の設定

EFS プロビジョナーは、OpenShift Container Platform ストレージリソースを確認し、更新することに加えて、AWS エンドポイントと通信することができる必要があります。以下の手順では、EFS プロビジョナーに必要なパーミッションを作成します。

手順

  1. efs-provisioner サービスアカウントを作成します。

    $ oc create serviceaccount efs-provisioner
  2. 必要なパーミッションを定義する clusterrole.yaml ファイルを作成します。

    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: efs-provisioner-runner
    rules:
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["events"]
        verbs: ["create", "update", "patch"]
      - apiGroups: ["security.openshift.io"]
        resources: ["securitycontextconstraints"]
        verbs: ["use"]
        resourceNames: ["hostmount-anyuid"]
  3. 定義されたロールをサービスアカウントに割り当てるクラスターのロールバインディングを定義する clusterrolebinding.yaml ファイルを作成します。

    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: run-efs-provisioner
    subjects:
      - kind: ServiceAccount
        name: efs-provisioner
        namespace: default 1
    roleRef:
      kind: ClusterRole
      name: efs-provisioner-runner
      apiGroup: rbac.authorization.k8s.io
    1
    EFS プロビジョナー Pod が実行される namespace。EFS プロビジョナーが default以外の namespace で実行されている場合、この値は更新する必要があります。
  4. 必要なパーミッションを持つロールを定義する role.yaml ファイルを作成します。

    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-efs-provisioner
    rules:
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["get", "list", "watch", "create", "update", "patch"]
  5. このロールをサービスアカウントに割り当てるロールバインディングを定義する rolebinding.yaml ファイルを作成します。

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-efs-provisioner
    subjects:
      - kind: ServiceAccount
        name: efs-provisioner
        namespace: default 1
    roleRef:
      kind: Role
      name: leader-locking-efs-provisioner
      apiGroup: rbac.authorization.k8s.io
    1
    EFS プロビジョナー Pod が実行される namespace。EFS プロビジョナーが default以外の namespace で実行されている場合、この値は更新する必要があります。
  6. OpenShift Container Platform クラスター内にリソースを作成します。

    $ oc create -f clusterrole.yaml,clusterrolebinding.yaml,role.yaml,rolebinding.yaml

3.1.4. EFS StorageClass の作成

PersistentVolumeClaim を作成する前に、StorageClass が OpenShift Container Platform クラスターに存在している必要があります。以下の手順では、EFS プロビジョナーの StorageClass を作成します。

手順

  1. 以下の内容を含む storageclass.yaml を作成して、環境変数を含む OpenShift Container Platform ConfigMap を定義します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: aws-efs
    provisioner: openshift.org/aws-efs
    parameters:
      gidMin: "2048" 1
      gidMax: "2147483647" 2
      gidAllocate: "true" 3
    1
    ボリュームの割り当てに使用する最小グループ ID (GID) を定義するオプションの引数。デフォルト値は 2048 です。
    2
    ボリューム割り当てに使用する最大の GID を定義するオプションの引数。デフォルト値は 2147483647 です。
    3
    GID がボリュームに割り当てられているかどうかを判別するオプションの引数。false の場合、動的にプロビジョニングされるボリュームには GID が割り当てられません。これにより、すべてのユーザーによる作成されたボリュームの読み取りおよび書き込みが可能になります。デフォルト値は true です。
  2. ファイルを設定したら、以下のコマンドを実行してクラスター内にこのファイルを作成します。

    $ oc create -f storageclass.yaml

3.1.5. EFS プロビジョナーの作成

EFS プロビジョナーは、EFS ボリュームを NFS 共有としてマウントする OpenShift Container Platform Pod です。

前提条件

  • EFS 環境変数を定義する ConfigMap を作成します。
  • 必要なクラスターおよびロールパーミッションを含むサービスアカウントを作成します。
  • ボリュームをプロビジョニングするための StorageClass を作成します。
  • Amazon Web Services (AWS) セキュリティーグループを、すべての OpenShift Container Platform ノード上での着信 NFS トラフィックを許可するように設定します。
  • AWS EFS ボリュームセキュリティーグループを、すべてのソースからの着信 SSH トラフィックを許可するように設定します。

手順

  1. 以下の内容を含む provisioner.yaml を作成し、EFS プロビジョナーを定義します。

    kind: Pod
    apiVersion: v1
    metadata:
      name: efs-provisioner
    spec:
      serviceAccount: efs-provisioner
      containers:
        - name: efs-provisioner
          image: quay.io/external_storage/efs-provisioner:latest
          env:
            - name: PROVISIONER_NAME
              valueFrom:
                configMapKeyRef:
                  name: efs-provisioner
                  key: provisioner.name
            - name: FILE_SYSTEM_ID
              valueFrom:
                configMapKeyRef:
                  name: efs-provisioner
                  key: file.system.id
            - name: AWS_REGION
              valueFrom:
                configMapKeyRef:
                  name: efs-provisioner
                  key: aws.region
            - name: DNS_NAME
              valueFrom:
                configMapKeyRef:
                  name: efs-provisioner
                  key: dns.name
                  optional: true
          volumeMounts:
            - name: pv-volume
              mountPath: /persistentvolumes
      volumes:
        - name: pv-volume
          nfs:
            server: <file-system-id>.efs.<region>.amazonaws.com 1
            path: / 2
    1
    EFS ボリュームの DNS 名が含まれます。このフィールドは、Pod が EFS ボリュームを検出できるように更新される必要があります。
    2
    EFS ボリュームのマウントパス。それぞれの永続ボリュームは EFS ボリューム上に別々のサブディレクトリーとして作成されます。この EFS ボリュームが OpenShift Container Platform 外の他のプロジェクトに使用される場合、プロジェクトの別のプロジェクトのデータへのアクセスを防ぐために、クラスターの EFS に一意のサブディレクトリー OpenShift Container Platform を手動で作成することが推奨されます。存在しないディレクトリーを指定すると、エラーが発生します。
  2. ファイルを設定したら、以下のコマンドを実行してクラスター内にこのファイルを作成します。

    $ oc create -f provisioner.yaml

3.1.6. EFS PersistentVolumeClaim の作成

EFS PersistentVolumeClaim は、Pod が基礎となる EFS ストレージをマウントできるように作成されます。

前提条件

  • EFS プロビジョナー Pod を作成します。

手順 (UI)

  1. OpenShift Container Platform コンソールで、StoragePersistent Volume Claims をクリックします。
  2. Persistent Volume Claim (永続ボリューム要求、PVC) の概要で、Create Persistent Volume Claim をクリックします。
  3. 結果のページで必要なオプションを定義します。

    1. 一覧から作成したストレージクラスを選択します。
    2. ストレージ要求の一意の名前を入力します。
    3. アクセスモードを選択し、作成されるストレージ要求の読み取り/書き込みアクセスを決定します。
    4. ストレージ要求のサイズを定義します。

      注記

      サイズを入力する必要がありますが、EFS ボリュームにアクセスするすべての Pod には無制限のストレージがあります。1Mi などの値を定義します。これにより、ストレージサイズは無制限になります。

  4. Create をクリックして Persistent Volume Claim (永続ボリューム要求、PVC) を作成し、永続ボリュームを生成します。

手順 (CLI)

  1. または、以下の内容でファイル pvc.yamlを作成して EFS の PersistentVolumeClaim を定義することができます。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: efs-claim 1
      namespace: test-efs
      annotations:
        volume.beta.kubernetes.io/storage-provisioner: openshift.org/aws-efs
      finalizers:
        - kubernetes.io/pvc-protection
    spec:
      accessModes:
        - ReadWriteOnce 2
      resources:
        requests:
          storage: 5Gi 3
      storageClassName: aws-efs 4
      volumeMode: Filesystem
    1
    PVC の一意の名前。
    2
    作成された PVC の読み取りおよび書き込みアクセスを判別するためのアクセスモード。
    3
    PVC のサイズを定義します。
    4
    EFS プロビジョナーの StorageClass の名前。
  2. ファイルを設定したら、以下のコマンドを実行してクラスター内にこのファイルを作成します。

    $ oc create -f pvc.yaml