第3章 永続ボリュームの作成
OpenShift Container Platform クラスターは、GlusterFS を使用している 永続ストレージ を使ってプロビジョニングすることが可能です。
永続ボリューム (PV) と Persistent Volume Claim (永続ボリューム要求、PVC) は、単一プロジェクトでボリュームを共有できます。PV 定義に含まれる GlusterFS に固有の情報は、Pod 定義で直接定義することも可能ですが、この方法の場合にはボリュームが一意のクラスターリソースとして作成されされないため、ボリュームが競合の影響を受けやすくなります。
ラベルおよびセレクターによる PV のバインド
ラベルは OpenShift Container Platform の機能であり、ユーザー定義のタグ (キーと値のペア) をオブジェクトの仕様の一部としてサポートします。その主な目的は、オブジェクト間で同一ラベルを定義してオブジェクトを任意にグループ化できるようにすることです。定義したラベルをセレクターでターゲットとして指定すると、指定のラベル値を持つすべてのオブジェクトが一致します。この機能により、PVC を PV にバインドすることができます。
ラベルを使用して、ボリューム間で共有している共通の属性や特性を識別できます。たとえば、gluster ボリュームを定義し、storage-tier という名前のカスタム属性 (キー) を持たせて、gold という値を割り当てることができます。要求で storage-tier=gold を使用して PV を選択すると、その PV に一致します。
ファイルベースのストレージでのボリュームのプロビジョニングに関する詳細は、「ファイルストレージ」を参照してください。同様に、ブロックベースのストレージでボリュームをプロビジョニングする方法は、「Block Storage」で提供されています。
3.1. ファイルストレージ
ファイルストレージ (ファイルレベルまたはファイルベースのストレージとも呼ばれます) は、データを階層構造に保存します。データはファイルとフォルダーに保存され、格納しているシステムと取得するシステムの両方に同じ形式で表示されます。ボリュームは、ファイルベースのストレージ用に静的または動的にプロビジョニングできます。
3.1.1. ボリュームの静的プロビジョニング
OpenShift および Kubernetes で永続ボリュームのサポートを有効にするには、いくつかのエンドポイントとサービスを作成する必要があります。
OpenShift Container Storage が (デフォルトの)Ansible インストーラーを使用してデプロイされた場合、以下の手順は必要ありません。
glusterfs エンドポイントファイルのサンプル (sample-gluster-endpoints.yaml) および glusterfs サービスファイルのサンプル (sample-gluster-service.yaml) は、/usr/share/heketi/templates/ ディレクトリーで利用できます。
Ansible デプロイメントの場合、/usr/share/heketi/templates/ ディレクトリーは作成されないため、サンプルエンドポイントやサービスファイルは利用できません。
サンプル glusterfs エンドポイントファイル / glusterfs サービスファイルを任意の場所にコピーしてから、コピーしたファイルを編集してください。以下に例を示します。
# cp /usr/share/heketi/templates/sample-gluster-endpoints.yaml /<_path_>/gluster-endpoints.yaml
作成するエンドポイントを指定するには、コピーした sample-gluster-endpoints.yaml ファイルを、環境に基づいて作成されるエンドポイントで更新します。Red Hat Gluster Storage の信頼済みストレージプールには、それぞれ、信頼済みストレージプールのノードの IP を持つ独自のエンドポイントが必要です。
# cat sample-gluster-endpoints.yaml apiVersion: v1 kind: Endpoints metadata: name: glusterfs-cluster subsets: - addresses: - ip: 192.168.10.100 ports: - port: 1 - addresses: - ip: 192.168.10.101 ports: - port: 1 - addresses: - ip: 192.168.10.102 ports: - port: 1
- name
- エンドポイントの名前。
- ip
- Red Hat Gluster Storage ノードの IP アドレス。
以下のコマンドを実行してエンドポイントを作成します。
# oc create -f <name_of_endpoint_file>
以下に例を示します。
# oc create -f sample-gluster-endpoints.yaml endpoints "glusterfs-cluster" created
エンドポイントが作成されたことを確認するには、以下のコマンドを実行します。
# oc get endpoints
以下に例を示します。
# oc get endpoints NAME ENDPOINTS AGE storage-project-router 192.168.121.233:80,192.168.121.233:443,192.168.121.233:1936 2d glusterfs-cluster 192.168.121.168:1,192.168.121.172:1,192.168.121.233:1 3s heketi 10.1.1.3:8080 2m heketi-storage-endpoints 192.168.121.168:1,192.168.121.172:1,192.168.121.233:1 3m
以下のコマンドを実行して gluster サービスを作成します。
# oc create -f <name_of_service_file>
以下に例を示します。
# cat sample-gluster-service.yaml apiVersion: v1 kind: Service metadata: name: glusterfs-cluster spec: ports: - port: 1
# oc create -f sample-gluster-service.yaml service "glusterfs-cluster" created
サービスが作成されたことを確認するには、以下のコマンドを実行します。
# oc get service
以下に例を示します。
# oc get service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE storage-project-router 172.30.94.109 <none> 80/TCP,443/TCP,1936/TCP 2d glusterfs-cluster 172.30.212.6 <none> 1/TCP 5s heketi 172.30.175.7 <none> 8080/TCP 2m heketi-storage-endpoints 172.30.18.24 <none> 1/TCP 3m
注記エンドポイントとサービスは、永続ストレージを必要とする各プロジェクトに対して作成する必要があります。
GlusterFS から Replica 3 の 100 G 永続ボリュームを作成し、このボリュームを記述する永続ボリュームの仕様を pv001.json ファイルに出力します。
$ heketi-cli volume create --size=100 --persistent-volume-file=pv001.json
cat pv001.json { "kind": "PersistentVolume", "apiVersion": "v1", "metadata": { "name": "glusterfs-f8c612ee", "creationTimestamp": null }, "spec": { "capacity": { "storage": "100Gi" }, "glusterfs": { "endpoints": "TYPE ENDPOINT HERE", "path": "vol_f8c612eea57556197511f6b8c54b6070" }, "accessModes": [ "ReadWriteMany" ], "persistentVolumeReclaimPolicy": "Retain" }, "status": {}
重要Labels 情報は .json ファイルに手動で追加する必要があります。
以下は、参照用の YAML ファイルの例です。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-storage-project-glusterfs1 labels: storage-tier: gold spec: capacity: storage: 12Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain glusterfs: endpoints: TYPE END POINTS NAME HERE, path: vol_e6b77204ff54c779c042f570a71b1407
- name
- ボリュームの名前。
- storage
- このボリュームに割り当てられるストレージの量。
- glusterfs
- 使用されているボリュームタイプ。この場合は glusterfs プラグインです。
- endpoints
- 作成された信頼済みストレージプールを定義するエンドポイント名
- path
- 信頼済みストレージプールからアクセスされる Red Hat Gluster Storage ボリューム。
- accessModes
- accessModes は、PV と PVC を一致させるためのラベルとして使用されます。現時点で、これらはいずれの形態のアクセス制御も定義しません。
- labels
- ラベルを使用して、ボリューム間で共有している共通の属性や特性を識別します。この例では、gluster ボリュームを定義し、storage-tier という名前のカスタム属性 (キー) を持たせて、gold という値を割り当てています。要求で storage-tier=gold を使用して PV を選択すると、その PV に一致します。
注記-
heketi-cli は、コマンドラインのエンドポイント名 (--persistent-volume-endpoint="TYPE ENDPOINT HERE") も受け入れます。次に、これをパイプで
oc create -f -
に渡して永続ボリュームをすぐに作成できます。 -
環境内に複数の Red Hat Gluster Storage の信頼済みストレージプールがある場合は、
heketi-cli volume list
コマンドを使用して、ボリュームが作成される信頼済みストレージプールを確認できます。このコマンドはクラスター名を一覧表示します。次に、pv001.json ファイルのエンドポイント情報を適宜更新できます。 - レプリカ数がデフォルト値の 3(レプリカ 3) に設定された 2 つのノードのみを持つ Heketi ボリュームを作成する場合、3 つの異なるノードに 3 つのディスクのレプリカセットを作成するスペースがないため、Heketi がエラー"No space"を表示します。
- すべての heketi-cli 書き込み操作 (volume create、cluster create など) が失敗し、読み取り操作 (例:topology info、volume info など) に成功すると、gluster ボリュームが読み取り専用モードで動作している可能性があります。
pv001.json ファイルを編集し、エンドポイントのセクションにエンドポイントの名前を入力します。
cat pv001.json { "kind": "PersistentVolume", "apiVersion": "v1", "metadata": { "name": "glusterfs-f8c612ee", "creationTimestamp": null, "labels": { "storage-tier": "gold" } }, "spec": { "capacity": { "storage": "12Gi" }, "glusterfs": { "endpoints": "glusterfs-cluster", "path": "vol_f8c612eea57556197511f6b8c54b6070" }, "accessModes": [ "ReadWriteMany" ], "persistentVolumeReclaimPolicy": "Retain" }, "status": {} }
以下のコマンドを実行して永続ボリュームを作成します。
# oc create -f pv001.json
以下に例を示します。
# oc create -f pv001.json persistentvolume "glusterfs-4fc22ff9" created
永続ボリュームが作成されたことを確認するには、以下のコマンドを実行します。
# oc get pv
以下に例を示します。
# oc get pv NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE glusterfs-4fc22ff9 100Gi RWX Available 4s
永続ボリューム要求ファイルを作成します。以下に例を示します。
# cat pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: glusterfs-claim spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi selector: matchLabels: storage-tier: gold
以下のコマンドを実行して、永続ボリュームを永続ボリューム要求 (PVC) にバインドします。
# oc create -f pvc.yaml
以下に例を示します。
# oc create -f pvc.yaml persistentvolumeclaim"glusterfs-claim" created
永続ボリュームと永続ボリューム要求がバインドされていることを確認するには、以下のコマンドを実行します。
# oc get pv # oc get pvc
以下に例を示します。
# oc get pv NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE glusterfs-4fc22ff9 100Gi RWX Bound storage-project/glusterfs-claim 1m
# oc get pvc NAME STATUS VOLUME CAPACITY ACCESSMODES AGE glusterfs-claim Bound glusterfs-4fc22ff9 100Gi RWX 11s
この要求はアプリケーションで使用できます。以下に例を示します。
# cat app.yaml apiVersion: v1 kind: Pod metadata: name: busybox spec: containers: - image: busybox command: - sleep - "3600" name: busybox volumeMounts: - mountPath: /usr/share/busybox name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: glusterfs-claim
# oc create -f app.yaml pod "busybox" created
アプリケーションで glusterfs 要求を使用する方法についての詳細は https://access.redhat.com/documentation/ja-jp/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-storage-examples-gluster-example を参照してください。
Pod が作成されたことを確認するには、以下のコマンドを実行します。
# oc get pods -n <storage_project_name>
以下に例を示します。
# oc get pods -n storage-project NAME READY STATUS RESTARTS AGE block-test-router-1-deploy 0/1 Running 0 4h busybox 1/1 Running 0 43s glusterblock-provisioner-1-bjpz4 1/1 Running 0 4h glusterfs-7l5xf 1/1 Running 0 4h glusterfs-hhxtk 1/1 Running 3 4h glusterfs-m4rbc 1/1 Running 0 4h heketi-1-3h9nb 1/1 Running 0 4h
永続ボリュームがコンテナー内でマウントされていることを確認するには、以下のコマンドを実行します。
# oc rsh busybox
/ $ df -h Filesystem Size Used Available Use% Mounted on /dev/mapper/docker-253:0-1310998-81732b5fd87c197f627a24bcd2777f12eec4ee937cc2660656908b2fa6359129 100.0G 34.1M 99.9G 0% / tmpfs 1.5G 0 1.5G 0% /dev tmpfs 1.5G 0 1.5G 0% /sys/fs/cgroup 192.168.121.168:vol_4fc22ff934e531dec3830cfbcad1eeae 99.9G 66.1M 99.9G 0% /usr/share/busybox tmpfs 1.5G 0 1.5G 0% /run/secrets /dev/mapper/vg_vagrant-lv_root 37.7G 3.8G 32.0G 11% /dev/termination-log tmpfs 1.5G 12.0K 1.5G 0% /var/run/secretgit s/kubernetes.io/serviceaccount
マウントポイントでパーミッション拒否エラーが発生した場合は、https://access.redhat.com/documentation/ja-jp/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-storage-examples-gluster-example で Gluster Volume Security の セクションを参照してください。
3.1.2. ボリュームの動的プロビジョニング
動的プロビジョニングにより、ボリュームを事前に作成せずに、Red Hat Gluster Storage ボリュームを実行中のアプリケーションコンテナーにプロビジョニングできます。ボリュームは要求を受け取る際に動的に作成され、まったく同じサイズのボリュームがアプリケーションコンテナーにプロビジョニングされます。
OpenShift Container Storage が (デフォルトの)Ansible インストーラーを使用してデプロイされた場合、以下に概要を示す手順は必要ありません。インストール時に作成されたデフォルトのストレージクラス (glusterfs-storage) が使用されます。
3.1.2.1. ボリュームの動的プロビジョニングの設定
ボリュームの動的プロビジョニングを設定するには、管理者はクラスターで提供されるストレージの指定の"classes"を記述する StorageClass オブジェクトを定義する必要があります。Storage Class の作成後に、heketi 認証のシークレットを作成してから、Persistent Volume Claim(永続ボリューム要求、PVC) の作成を続行する必要があります。
3.1.2.1.1. Heketi 認証のシークレットの作成
Heketi 認証のシークレットを作成するには、以下のコマンドを実行します。
admin-key
の値 (ボリュームの詳細を取得するために heketi にアクセスするためのシークレット) が Red Hat Openshift Container Storage のデプロイメント時に設定されていない場合、以下の手順を実行は省略できます。
以下のコマンドを実行して、パスワードのエンコードされた値を作成します。
# echo -n "<key>" | base64
ここで、"key" は、Red Hat Openshift Container Storage のデプロイ時に作成された 「admin-key」 の値です。
以下に例を示します。
# echo -n "mypassword" | base64 bXlwYXNzd29yZA==
シークレットファイルを作成します。以下はシークレットファイルの例です。
# cat glusterfs-secret.yaml apiVersion: v1 kind: Secret metadata: name: heketi-secret namespace: default data: # base64 encoded password. E.g.: echo -n "mypassword" | base64 key: bXlwYXNzd29yZA== type: kubernetes.io/glusterfs
以下のコマンドを実行して OpenShift にシークレットを登録します。
# oc create -f glusterfs-secret.yaml secret "heketi-secret" created
3.1.2.1.2. ストレージクラスの登録
永続ボリュームのプロビジョニング用に StorageClass オブジェクトを設定する場合、管理者は使用するプロビジョナーのタイプと、クラスに属する PersistentVolume をプロビジョニングする際にプロビジョナーによって使用されるパラメーターを記述する必要があります。
ストレージクラスを作成するには、以下のコマンドを実行します。
# cat > glusterfs-storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: gluster-container provisioner: kubernetes.io/glusterfs reclaimPolicy: Retain parameters: resturl: "http://heketi-storage-project.cloudapps.mystorage.com" restuser: "admin" volumetype: "replicate:3" clusterid: "630372ccdc720a92c681fb928f27b53f,796e6db1981f369ea0340913eeea4c9a" secretNamespace: "default" secretName: "heketi-secret" volumeoptions: "client.ssl on, server.ssl on" volumenameprefix: "test-vol" allowVolumeExpansion: true
ここで、
- resturl
- Gluster REST サービス/Heketi サービスの URL。これは、gluster ボリュームをオンデマンドでプロビジョニングします。一般的な形式は IPaddress:Port でなければならず、GlusterFS 動的プロビジョナーの場合必須のパラメーターです。Heketi サービスが openshift/kubernetes 設定でルーティング可能なサービスとして公開される場合、これには http://heketi-storage-project.cloudapps.mystorage.com と同様の形式を設定できます。ここで、fqdn は解決可能な heketi サービスの URL です。
- restuser
- 信頼済みストレージプールでボリュームを作成できる Gluster REST サービス/Heketi ユーザー
- volumetype
使用されているボリュームタイプを指定します。
注記分散 3 方向レプリケーションが、サポートされている唯一のボリューム種別です。これには、標準の 3 方向のレプリケーションボリュームと arbiter 2+1 の両方が含まれます。
- clusterid
これは、ボリュームのプロビジョニング時に Heketi によって使用されるクラスターの ID です。また、クラスター ID のコンマ区切りリストも指定できます。これはオプションのパラメーターです。
注記クラスター ID を取得するには、以下のコマンドを実行します。
# heketi-cli cluster list
- secretNamespace + secretName
Gluster REST サービスとの通信時に使用されるユーザーパスワードを含む Secret インスタンスの識別。これらのパラメーターはオプションです。空のパスワードは、secretNamespace と secretName の両方を省略する場合に使用されます。
注記永続ボリュームが動的にプロビジョニングされると、GlusterFS プラグインによってエンドポイントと gluster-dynamic-<claimname> という名前のヘッドレスサービスが自動的に作成されます。この動的エンドポイントとサービスは、永続ボリューム要求 (PVC) が削除されると自動的に削除されます。
- volumeoptions
これはオプションのパラメーターです。これにより、パラメーターを"client.ssl on, server.ssl on" に設定して、暗号化を有効にして glusterfs ボリュームを作成できます。暗号化の有効化に関する詳細は、8章暗号化の有効化を参照してください。
注記暗号化が有効でない場合は、このパラメーターを storageclass に追加しないでください。
- volumenameprefix
これはオプションのパラメーターです。これは、heketi で作成されたボリュームの名前を示しています。詳細は、「(オプション) 永続ボリュームのカスタムボリューム名の接頭辞の指定」を参照してください。
注記このパラメーターの値には、storageclass に
_
を含めることができません。- allowVolumeExpansion
-
PV クレームの値を増やすには、storageclass ファイルの allowVolumeExpansion パラメーターを
true
に設定してください。詳細は、「Persistent Volume Claim(永続ボリューム要求、PVC) の拡張」を参照してください。
ストレージクラスを Openshift に登録するには、以下のコマンドを実行します。
# oc create -f glusterfs-storageclass.yaml storageclass "gluster-container" created
ストレージクラスの詳細を取得するには、以下のコマンドを実行します。
# oc describe storageclass gluster-container Name: gluster-container IsDefaultClass: No Annotations: <none> Provisioner: kubernetes.io/glusterfs Parameters: resturl=http://heketi-storage-project.cloudapps.mystorage.com,restuser=admin,secretName=heketi-secret,secretNamespace=default No events.
3.1.2.1.3. Persistent Volume Claim(永続ボリューム要求、PVC) の作成
永続ボリューム要求 (PVC) を作成するには、以下のコマンドを実行します。
Persistent Volume Claim(永続ボリューム要求、PVC) ファイルを作成します。Persistent Volume Claim(永続ボリューム要求、PVC) のサンプルは以下のとおりです。
# cat glusterfs-pvc-claim1.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: claim1 annotations: volume.beta.kubernetes.io/storage-class: gluster-container spec: persistentVolumeReclaimPolicy: Retain accessModes: - ReadWriteOnce resources: requests: storage: 5Gi
- persistentVolumeReclaimPolicy
これはオプションのパラメーターです。このパラメーターを"Retain"に設定すると、対応する永続ボリューム要求 (PVC) が削除されても、基礎となる永続ボリュームが保持されます。
注記PVC の削除時に、"persistentVolumeReclaimPolicy:"が"Retain"に設定されている場合、基礎となる heketi および gluster ボリュームは削除されません。ボリュームを削除するには、heketi cli を使用して PV を削除する必要があります。
以下のコマンドを実行して要求を登録します。
# oc create -f glusterfs-pvc-claim1.yaml persistentvolumeclaim "claim1" created
要求の詳細を取得するには、以下のコマンドを実行します。
# oc describe pvc <_claim_name_>
以下に例を示します。
# oc describe pvc claim1 Name: claim1 Namespace: default StorageClass: gluster-container Status: Bound Volume: pvc-54b88668-9da6-11e6-965e-54ee7551fd0c Labels: <none> Capacity: 4Gi Access Modes: RWO No events.
3.1.2.1.4. 要求作成の確認
要求が作成されているかどうかを確認するには、以下のコマンドを実行します。
永続ボリューム要求 (PVC) および永続ボリュームの詳細を取得するには、以下のコマンドを実行します。
# oc get pv,pvc NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE pv/pvc-962aa6d1-bddb-11e6-be23-5254009fc65b 4Gi RWO Delete Bound storage-project/claim1 3m NAME STATUS VOLUME CAPACITY ACCESSMODES AGE pvc/claim1 Bound pvc-962aa6d1-bddb-11e6-be23-5254009fc65b 4Gi RWO 4m
エンドポイントとサービスが要求の作成時に作成されたかどうかを確認するには、以下のコマンドを実行します。
# oc get endpoints,service NAME ENDPOINTS AGE ep/storage-project-router 192.168.68.3:443,192.168.68.3:1936,192.168.68.3:80 28d ep/gluster-dynamic-claim1 192.168.68.2:1,192.168.68.3:1,192.168.68.4:1 5m ep/heketi 10.130.0.21:8080 21d ep/heketi-storage-endpoints 192.168.68.2:1,192.168.68.3:1,192.168.68.4:1 25d NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/storage-project-router 172.30.166.64 <none> 80/TCP,443/TCP,1936/TCP 28d svc/gluster-dynamic-claim1 172.30.52.17 <none> 1/TCP 5m svc/heketi 172.30.129.113 <none> 8080/TCP 21d svc/heketi-storage-endpoints 172.30.133.212 <none> 1/TCP 25d
3.1.2.1.5. (オプション) 永続ボリュームのカスタムボリューム名の接頭辞の指定
作成する永続ボリュームに、カスタムボリューム名の接頭辞を指定できます。カスタムのボリューム名の接頭辞を指定すると、以下に基づいてボリュームを簡単に検索/フィルターできるようになります。
- storageclass ファイルの"volnameprefix"フィールドの値として提供された文字列。
- Persistent Volume Claim(永続ボリューム要求、PVC) 名。
- プロジェクト/namespace 名。
名前を設定するには、パラメーター volumenameprefix をストレージクラスファイルに追加していることを確認します。詳細は「ストレージクラスの登録」を参照してください。
このパラメーターの値には、storageclass に _
を含めることができません。
カスタムのボリューム名の接頭辞が設定されているかどうかを確認するには、以下のコマンドを実行します。
# oc describe pv <pv_name>
以下に例を示します。
# oc describe pv pvc-f92e3065-25e8-11e8-8f17-005056a55501 Name: pvc-f92e3065-25e8-11e8-8f17-005056a55501 Labels: <none> Annotations: Description=Gluster-Internal: Dynamically provisioned PV gluster.kubernetes.io/heketi-volume-id=027c76b24b1a3ce3f94d162f843529c8 gluster.org/type=file kubernetes.io/createdby=heketi-dynamic-provisioner pv.beta.kubernetes.io/gid=2000 pv.kubernetes.io/bound-by-controller=yes pv.kubernetes.io/provisioned-by=kubernetes.io/glusterfs volume.beta.kubernetes.io/mount-options=auto_unmount StorageClass: gluster-container-prefix Status: Bound Claim: glusterfs/claim1 Reclaim Policy: Delete Access Modes: RWO Capacity: 1Gi Message: Source: Type: Glusterfs (a Glusterfs mount on the host that shares a pod's lifetime) EndpointsName: glusterfs-dynamic-claim1 Path: test-vol_glusterfs_claim1_f9352e4c-25e8-11e8-b460-005056a55501 ReadOnly: false Events: <none>
Path の値には、namespace および要求名に割り当てられたカスタムのボリューム名の接頭辞が付けられます。ここでは"test-vol"です。
3.1.2.1.6. Pod での要求の使用
Pod で要求を使用するには、以下の手順を実行します。
アプリケーションで要求を使用するには、たとえば、以下のようになります。
# cat app.yaml apiVersion: v1 kind: Pod metadata: name: busybox spec: containers: - image: busybox command: - sleep - "3600" name: busybox volumeMounts: - mountPath: /usr/share/busybox name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: claim1
# oc create -f app.yaml pod "busybox" created
アプリケーションで glusterfs 要求を使用する方法についての詳細は https://access.redhat.com/documentation/ja-jp/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-storage-examples-gluster-example を参照してください。
Pod が作成されたことを確認するには、以下のコマンドを実行します。
# oc get pods -n storage-project NAME READY STATUS RESTARTS AGE storage-project-router-1-at7tf 1/1 Running 0 13d busybox 1/1 Running 0 8s glusterfs-dc-192.168.68.2-1-hu28h 1/1 Running 0 7d glusterfs-dc-192.168.68.3-1-ytnlg 1/1 Running 0 7d glusterfs-dc-192.168.68.4-1-juqcq 1/1 Running 0 13d heketi-1-9r47c 1/1 Running 0 13d
永続ボリュームがコンテナー内でマウントされていることを確認するには、以下のコマンドを実行します。
# oc rsh busybox
/ $ df -h Filesystem Size Used Available Use% Mounted on /dev/mapper/docker-253:0-666733-38050a1d2cdb41dc00d60f25a7a295f6e89d4c529302fb2b93d8faa5a3205fb9 10.0G 33.8M 9.9G 0% / tmpfs 23.5G 0 23.5G 0% /dev tmpfs 23.5G 0 23.5G 0% /sys/fs/cgroup /dev/mapper/rhgs-root 17.5G 3.6G 13.8G 21% /run/secrets /dev/mapper/rhgs-root 17.5G 3.6G 13.8G 21% /dev/termination-log /dev/mapper/rhgs-root 17.5G 3.6G 13.8G 21% /etc/resolv.conf /dev/mapper/rhgs-root 17.5G 3.6G 13.8G 21% /etc/hostname /dev/mapper/rhgs-root 17.5G 3.6G 13.8G 21% /etc/hosts shm 64.0M 0 64.0M 0% /dev/shm 192.168.68.2:vol_5b05cf2e5404afe614f8afa698792bae 4.0G 32.6M 4.0G 1% /usr/share/busybox tmpfs 23.5G 16.0K 23.5G 0% /var/run/secrets/kubernetes.io/serviceaccount tmpfs 23.5G 0 23.5G 0% /proc/kcore tmpfs 23.5G 0 23.5G 0% /proc/timer_stats
3.1.2.1.7. Persistent Volume Claim(永続ボリューム要求、PVC) の拡張
PV クレームの値を増やすには、storageclass ファイルの allowVolumeExpansion パラメーターを true
に設定してください。詳細は、「ストレージクラスの登録」を参照してください。
OpenShift Container Platform 3.11 Web コンソールで PV のサイズを変更することもできます。
永続ボリューム要求の値を拡張するには、以下のコマンドを実行します。
既存の永続ボリュームサイズを確認するには、アプリケーション Pod で以下のコマンドを実行します。
# oc rsh busybox
# df -h
以下に例を示します。
# oc rsh busybox / # df -h Filesystem Size Used Available Use% Mounted on /dev/mapper/docker-253:0-100702042-0fa327369e7708b67f0c632d83721cd9a5b39fd3a7b3218f3ff3c83ef4320ce7 10.0G 34.2M 9.9G 0% / tmpfs 15.6G 0 15.6G 0% /dev tmpfs 15.6G 0 15.6G 0% /sys/fs/cgroup /dev/mapper/rhel_dhcp47--150-root 50.0G 7.4G 42.6G 15% /dev/termination-log /dev/mapper/rhel_dhcp47--150-root 50.0G 7.4G 42.6G 15% /run/secrets /dev/mapper/rhel_dhcp47--150-root 50.0G 7.4G 42.6G 15% /etc/resolv.conf /dev/mapper/rhel_dhcp47--150-root 50.0G 7.4G 42.6G 15% /etc/hostname /dev/mapper/rhel_dhcp47--150-root 50.0G 7.4G 42.6G 15% /etc/hosts shm 64.0M 0 64.0M 0% /dev/shm 10.70.46.177:test-vol_glusterfs_claim10_d3e15a8b-26b3-11e8-acdf-005056a55501 2.0G 32.6M 2.0G 2% /usr/share/busybox tmpfs 15.6G 16.0K 15.6G 0% /var/run/secrets/kubernetes.io/serviceaccount tmpfs 15.6G 0 15.6G 0% /proc/kcore tmpfs 15.6G 0 15.6G 0% /proc/timer_list tmpfs 15.6G 0 15.6G 0% /proc/timer_stats tmpfs 15.6G 0 15.6G 0% /proc/sched_debug tmpfs 15.6G 0 15.6G 0% /proc/scsi tmpfs 15.6G 0 15.6G 0% /sys/firmware
この例では、永続ボリュームのサイズは 2 Gi です。
Persistent Volume Claim(永続ボリューム要求、PVC) の値を編集するには、以下のコマンドを実行して以下のストレージパラメーターを編集します。
resources: requests: storage: <storage_value>
# oc edit pvc <claim_name>
たとえば、ストレージの値を 20 Gi に拡張するには、以下を実行します。
# oc edit pvc claim3 apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: pv.kubernetes.io/bind-completed: "yes" pv.kubernetes.io/bound-by-controller: "yes" volume.beta.kubernetes.io/storage-class: gluster-container2 volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/glusterfs creationTimestamp: 2018-02-14T07:42:00Z name: claim3 namespace: storage-project resourceVersion: "283924" selfLink: /api/v1/namespaces/storage-project/persistentvolumeclaims/claim3 uid: 8a9bb0df-115a-11e8-8cb3-005056a5a340 spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi volumeName: pvc-8a9bb0df-115a-11e8-8cb3-005056a5a340 status: accessModes: - ReadWriteOnce capacity: storage: 2Gi phase: Bound
検証するには、アプリケーション Pod で以下のコマンドを実行します。
# oc rsh busybox
/ # df -h
以下に例を示します。
# oc rsh busybox # df -h Filesystem Size Used Available Use% Mounted on /dev/mapper/docker-253:0-100702042-0fa327369e7708b67f0c632d83721cd9a5b39fd3a7b3218f3ff3c83ef4320ce7 10.0G 34.2M 9.9G 0% / tmpfs 15.6G 0 15.6G 0% /dev tmpfs 15.6G 0 15.6G 0% /sys/fs/cgroup /dev/mapper/rhel_dhcp47--150-root 50.0G 7.4G 42.6G 15% /dev/termination-log /dev/mapper/rhel_dhcp47--150-root 50.0G 7.4G 42.6G 15% /run/secrets /dev/mapper/rhel_dhcp47--150-root 50.0G 7.4G 42.6G 15% /etc/resolv.conf /dev/mapper/rhel_dhcp47--150-root 50.0G 7.4G 42.6G 15% /etc/hostname /dev/mapper/rhel_dhcp47--150-root 50.0G 7.4G 42.6G 15% /etc/hosts shm 64.0M 0 64.0M 0% /dev/shm 10.70.46.177:test-vol_glusterfs_claim10_d3e15a8b-26b3-11e8-acdf-005056a55501 20.0G 65.3M 19.9G 1% /usr/share/busybox tmpfs 15.6G 16.0K 15.6G 0% /var/run/secrets/kubernetes.io/serviceaccount tmpfs 15.6G 0 15.6G 0% /proc/kcore tmpfs 15.6G 0 15.6G 0% /proc/timer_list tmpfs 15.6G 0 15.6G 0% /proc/timer_stats tmpfs 15.6G 0 15.6G 0% /proc/sched_debug tmpfs 15.6G 0 15.6G 0% /proc/scsi tmpfs 15.6G 0 15.6G 0% /sys/firmware
サイズが 2 Gi(以前) から 20 Gi に変更されていることが確認できます。
3.1.2.1.8. Persistent Volume Claim(永続ボリューム要求、PVC) の削除
storageclass の登録時に"persistentVolumeReclaimPolicy"パラメーターが "Retain"に設定されている場合、基礎となる PV と対応するボリュームは、PVC が削除されてもそのまま残ります。
要求を削除するには、以下のコマンドを実行します。
# oc delete pvc <claim-name>
以下に例を示します。
# oc delete pvc claim1 persistentvolumeclaim "claim1" deleted
要求が削除されたかどうかを確認するには、以下のコマンドを実行します。
# oc get pvc <claim-name>
以下に例を示します。
# oc get pvc claim1 No resources found.
ユーザーが動的プロビジョニングで作成された永続ボリュームにバインドされている永続ボリューム要求 (PVC) を削除すると、永続ボリューム要求の削除とは別に、Kubernetes は永続ボリューム、エンドポイント、サービス、および実際のボリュームも削除します。これを検証する必要がある場合は、以下のコマンドを実行します。
永続ボリュームが削除されたかどうかを確認するには、以下のコマンドを実行します。
# oc get pv <pv-name>
以下に例を示します。
# oc get pv pvc-962aa6d1-bddb-11e6-be23-5254009fc65b No resources found.
エンドポイントが削除されたかどうかを確認するには、以下のコマンドを実行します。
# oc get endpoints <endpointname>
以下に例を示します。
# oc get endpoints gluster-dynamic-claim1 No resources found.
サービスが削除されたかどうかを確認するには、以下のコマンドを実行します。
# oc get service <servicename>
以下に例を示します。
# oc get service gluster-dynamic-claim1 No resources found.
3.1.3. ボリュームのセキュリティー
ボリュームの UID/GID は 0(root) です。アプリケーション Pod がボリュームに書き込むには、UID/GID が 0(root) でなければなりません。ボリュームのセキュリティー機能により、管理者は一意の GID でボリュームを作成し、アプリケーション Pod がこの一意の GID を使用してボリュームに書き込みできるようになりました。
静的にプロビジョニングされたボリュームのボリュームセキュリティー
GID を指定して静的にプロビジョニングされたボリュームを作成するには、以下のコマンドを実行します。
$ heketi-cli volume create --size=100 --persistent-volume-file=pv001.json --gid=590
上記のコマンドでは、GID が 590 の 100 G 永続ボリュームが作成され、このボリュームを記述する永続ボリューム仕様の出力は pv001.json ファイルに追加されます。
この GID を使用してボリュームにアクセスする方法は、https://access.redhat.com/documentation/ja-jp/openshift_container_platform/3.11/html/configuring_clusters/persistent-storage-examples#install-config-storage-examples-gluster-example を参照してください。
動的にプロビジョニングされたボリュームのボリュームセキュリティー
2 つの新規パラメーター gidMin
および gidMax
が動的プロビジョナーに導入されました。これらの値により、管理者はストレージクラスのボリュームの GID 範囲を設定できます。GID の値を設定し、動的にプロビジョニングされたボリュームのボリュームのセキュリティーを提供するには、以下のコマンドを実行します。
GID の値を指定してストレージクラスファイルを作成します。以下に例を示します。
# cat glusterfs-storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: gluster-container provisioner: kubernetes.io/glusterfs parameters: resturl: "http://heketi-storage-project.cloudapps.mystorage.com" restuser: "admin" secretNamespace: "default" secretName: "heketi-secret" gidMin: "2000" gidMax: "4000"
注記gidMin
値およびgidMax
値が指定されていない場合、動的にプロビジョニングされたボリュームには 2000 から 2147483647 までの GID が設定されます。- 永続ボリューム要求 (PVC) を作成します。詳細は、「Persistent Volume Claim(永続ボリューム要求、PVC) の作成」を参照してください。
- Pod の要求を使用します。この Pod が特権を持たないことを確認します。詳細は、「Pod での要求の使用」を参照してください。
GID が指定の範囲内にあるかどうかを確認するには、以下のコマンドを実行します。
# oc rsh busybox
$ id
以下に例を示します。
$ id uid=1000060000 gid=0(root) groups=0(root),2001
ここで、上記の出力の 2001 は、永続ボリュームに割り当てられた GID で、ストレージクラスで指定された範囲内にあります。割り当てられた GID を使用して、このボリュームに書き込むことができます。
注記永続ボリューム要求 (PVC) が削除されると、永続ボリュームの GID がプールから解放されます。
3.1.4. heketi でのデバイスの階層化
Heketi は、ボリュームを配置する際に特定のデバイスを使用するための単純なタグマッチングアプローチをサポートします。ユーザーは、特定のデバイスセットにキーと値のペアを指定して、ボリュームオプションキー user.heketi.device-tag-match
と単純なマッチングルールで新規ボリュームを作成する必要があります。
手順
必要なタグを heketi デバイスに適用します。
# heketi-cli device settags <device-name> <key>:<value>
例:
# heketi-cli device settags 1fe1b83e5660efb53cc56433cedf7771 disktype:hdd
適用されたタグをデバイスから削除します。
# heketi-cli device rmtags <device-name> <key>
例:
# heketi-cli device rmtags 1fe1b83e5660efb53cc56433cedf7771 disktype
デバイスに追加されたタグを確認します。
# heketi-cli device info <device-name>
例:
# heketi-cli device info 1fe1b83e5660efb53cc56433cedf7771
出力例:
Device Id: 1fe1b83e5660efb53cc56433cedf7771 State: online Size (GiB): 49 Used (GiB): 41 Free (GiB): 8 Create Path: /dev/vdc Physical Volume UUID: GpAnb4-gY8e-p5m9-0UU3-lV3J-zQWY-zFgO92 Known Paths: /dev/disk/by-id/virtio-bf48c436-04a9-48ed-9 /dev/disk/by-path/pci-0000:00:08.0 /dev/disk/by-path/virtio-pci-0000:00:08.0 /dev/vdc Tags: disktype: hdd ---> added tag
タグ付けされたデバイスを使用してボリュームを作成します。
# heketi-cli volume create --size=<size in GiB> --gluster-volume-options'user.heketi.device-tag-match <key>=<value>’
重要-
ボリュームの作成時に、新しいボリュームオプション
user.heketi.device-tag-match
を渡す必要があります。ここで、オプションの値は、タグキーに続いて"=" または "!="のいずれか、これにタグの値が続きます。 - すべての一致は完全一致であり、大文字と小文字が区別され、1 つの device-tag-match のみを指定できます。
例:
# heketi-cli volume create --size=5 --gluster-volume-options 'user.heketi.device-tag-match disktype=hdd’
注記ボリュームが作成されると、ボリュームオプションの一覧が固定されます。tag-match ルールは、ボリューム拡張およびブリックの置き換えの目的で、ボリュームのメタデータと共に永続化されます。
-
ボリュームの作成時に、新しいボリュームオプション
ストレージクラスを作成します。
ハードディスク上にのみボリュームを作成するストレージクラスを作成します。
# cat hdd-storageclass.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: storageclass.kubernetes.io/is-default-class: "false" name: glusterfs-storage-hdd selfLink: /apis/storage.k8s.io/v1/storageclasses/glusterfs-storage parameters: resturl: http://heketi-storage.glusterfs.svc:8080 restuser: admin secretName: heketi-storage-admin-secret secretNamespace: glusterfs volumeoptions: "user.heketi.device-tag-match disktype=hdd" provisioner: kubernetes.io/glusterfs reclaimPolicy: Delete volumeBindingMode: Immediate
より高速なソリッドステートストレージだけを使用してボリュームを作成するストレージクラスを作成します。
重要ハードディスクデバイスを除外する負のタグのマッチングルールを使用する必要があります。
# cat sdd-storageclass.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: storageclass.kubernetes.io/is-default-class: "false" name: glusterfs-storage-dd selfLink: /apis/storage.k8s.io/v1/storageclasses/glusterfs-storage parameters: resturl: http://heketi-storage.glusterfs.svc:8080 restuser: admin secretName: heketi-storage-admin-secret secretNamespace: glusterfs volumeoptions: "user.heketi.device-tag-match disktype!=hdd" provisioner: kubernetes.io/glusterfs reclaimPolicy: Delete volumeBindingMode: Immediate