第2章 永続ストレージの設定
2.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 のテクノロジープレビュー機能のサポート範囲についての詳細は、https://access.redhat.com/ja/support/offerings/techpreview/ を参照してください。
Kubernetes 永続ボリュームフレームワークは、管理者がクラスターのプロビジョニングを永続ストレージを使用して実行できるようにし、ユーザーが基礎となるインフラストラクチャーの知識がなくてもこれらのリソースを要求できるようにします。AWS Elastic Block Store ボリュームは動的にプロビジョニングできます。永続ボリュームは単一のプロジェクトまたは namespace にバインドされず、それらは OpenShift Container Platform クラスター間で共有できます。PersistentVolumeClaim (永続ボリューム要求、PVC) はプロジェクトまたは namespace に固有のもので、ユーザーによって要求されます。
前提条件
- EFS ボリュームのセキュリティーグループからのインバウンド NFS トラフィックを許可するように AWS セキュリティーグループを設定します。
- AWS EFS ボリュームを、任意のホストからの着信 SSH トラフィックを許可するように設定します。
その他の参考資料
2.1.1. EFS 変数を ConfigMap に保存します。
ConfigMap を使用して、EFS プロビジョナーに必要なすべての環境変数を含めることが推奨されます。
手順
以下の内容が含まれる
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
ファイルを設定したら、以下のコマンドを実行してクラスター内にこのファイルを作成します。
$ oc create -f configmap.yaml -n <namespace>
2.1.2. EFS ボリュームの認可の設定
EFS プロビジョナーは、OpenShift Container Platform ストレージリソースを確認し、更新することに加えて、AWS エンドポイントと通信することができる必要があります。以下の手順では、EFS プロビジョナーに必要なパーミッションを作成します。
手順
efs-provisioner
サービスアカウントを作成します。$ oc create serviceaccount efs-provisioner
必要なパーミッションを定義する
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"]
定義されたロールをサービスアカウントに割り当てるクラスターのロールバインディングを定義する
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 で実行されている場合、この値は更新する必要があります。
必要なパーミッションを持つロールを定義する
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"]
このロールをサービスアカウントに割り当てるロールバインディングを定義する
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 で実行されている場合、この値は更新する必要があります。
OpenShift Container Platform クラスター内にリソースを作成します。
$ oc create -f clusterrole.yaml,clusterrolebinding.yaml,role.yaml,rolebinding.yaml
2.1.3. EFS StorageClass の作成
PersistentVolumeClaim を作成する前に、StorageClass が OpenShift Container Platform クラスターに存在している必要があります。以下の手順では、EFS プロビジョナーの StorageClass を作成します。
手順
以下の内容を含む
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
ファイルを設定したら、以下のコマンドを実行してクラスター内にこのファイルを作成します。
$ oc create -f storageclass.yaml
2.1.4. EFS プロビジョナーの作成
EFS プロビジョナーは、EFS ボリュームを NFS 共有としてマウントする OpenShift Container Platform Pod です。
前提条件
- EFS 環境変数を定義する ConfigMap を作成します。
- 必要なクラスターおよびロールパーミッションを含むサービスアカウントを作成します。
- ボリュームをプロビジョニングするための StorageClass を作成します。
- Amazon Web Services (AWS) セキュリティーグループを、すべての OpenShift Container Platform ノード上での着信 NFS トラフィックを許可するように設定します。
- AWS EFS ボリュームセキュリティーグループを、すべてのソースからの着信 SSH トラフィックを許可するように設定します。
手順
以下の内容を含む
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 を手動で作成することが推奨されます。存在しないディレクトリーを指定すると、エラーが発生します。
ファイルを設定したら、以下のコマンドを実行してクラスター内にこのファイルを作成します。
$ oc create -f provisioner.yaml
2.1.5. EFS PersistentVolumeClaim の作成
EFS PersistentVolumeClaim は、Pod が基礎となる EFS ストレージをマウントできるように作成されます。
前提条件
- EFS プロビジョナー Pod を作成します。
手順 (UI)
-
OpenShift Container Platform コンソールで、Storage
Persistent Volume Claims をクリックします。 - Persistent Volume Claim (永続ボリューム要求、PVC) の概要で、Create Persistent Volume Claim をクリックします。
結果のページで必要なオプションを定義します。
- 一覧から作成したストレージクラスを選択します。
- ストレージ要求の一意の名前を入力します。
- アクセスモードを選択し、作成されるストレージ要求の読み取り/書き込みアクセスを決定します。
ストレージ要求のサイズを定義します。
注記サイズを入力する必要がありますが、EFS ボリュームにアクセスするすべての Pod には無制限のストレージがあります。
1Mi
などの値を定義します。これにより、ストレージサイズは無制限になります。
- Create をクリックして Persistent Volume Claim (永続ボリューム要求、PVC) を作成し、永続ボリュームを生成します。
手順 (CLI)
または、以下の内容でファイル
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
ファイルを設定したら、以下のコマンドを実行してクラスター内にこのファイルを作成します。
$ oc create -f pvc.yaml