第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
  1. 作成するエンドポイントを指定するには、コピーした 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 アドレス。
  2. 以下のコマンドを実行してエンドポイントを作成します。

    # oc create -f <name_of_endpoint_file>

    以下に例を示します。

    # oc create -f sample-gluster-endpoints.yaml
    endpoints "glusterfs-cluster" created
  3. エンドポイントが作成されたことを確認するには、以下のコマンドを実行します。

    # 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
  4. 以下のコマンドを実行して 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
  5. サービスが作成されたことを確認するには、以下のコマンドを実行します。

    # 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
    注記

    エンドポイントとサービスは、永続ストレージを必要とする各プロジェクトに対して作成する必要があります。

  6. 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 ボリュームが読み取り専用モードで動作している可能性があります。
  7. 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": {}
    }
  8. 以下のコマンドを実行して永続ボリュームを作成します。

    # oc create -f pv001.json

    以下に例を示します。

    # oc create -f pv001.json
    persistentvolume "glusterfs-4fc22ff9" created
  9. 永続ボリュームが作成されたことを確認するには、以下のコマンドを実行します。

    # oc get pv

    以下に例を示します。

    # oc get pv
    
    NAME                 CAPACITY   ACCESSMODES   STATUS      CLAIM     REASON    AGE
    glusterfs-4fc22ff9   100Gi      RWX           Available                       4s
  10. 永続ボリューム要求ファイルを作成します。以下に例を示します。

    # cat pvc.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: glusterfs-claim
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 100Gi
        selector:
          matchLabels:
    storage-tier: gold
  11. 以下のコマンドを実行して、永続ボリュームを永続ボリューム要求 (PVC) にバインドします。

    # oc create -f pvc.yaml

    以下に例を示します。

    # oc create -f pvc.yaml
    persistentvolumeclaim"glusterfs-claim" created
  12. 永続ボリュームと永続ボリューム要求がバインドされていることを確認するには、以下のコマンドを実行します。

    # 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
  13. この要求はアプリケーションで使用できます。以下に例を示します。

    # 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 を参照してください。

  14. 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
  15. 永続ボリュームがコンテナー内でマウントされていることを確認するには、以下のコマンドを実行します。

    # 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 のデプロイメント時に設定されていない場合、以下の手順を実行は省略できます。

  1. 以下のコマンドを実行して、パスワードのエンコードされた値を作成します。

    # echo -n "<key>" | base64

    ここで、"key" は、Red Hat Openshift Container Storage のデプロイ時に作成された admin-key の値です。

    以下に例を示します。

    # echo -n "mypassword" | base64
    bXlwYXNzd29yZA==
  2. シークレットファイルを作成します。以下はシークレットファイルの例です。

    # 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
  3. 以下のコマンドを実行して OpenShift にシークレットを登録します。

    # oc create -f glusterfs-secret.yaml
    secret "heketi-secret" created
3.1.2.1.2. ストレージクラスの登録

永続ボリュームのプロビジョニング用に StorageClass オブジェクトを設定する場合、管理者は使用するプロビジョナーのタイプと、クラスに属する PersistentVolume をプロビジョニングする際にプロビジョナーによって使用されるパラメーターを記述する必要があります。

  1. ストレージクラスを作成するには、以下のコマンドを実行します。

    # 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) の拡張」を参照してください。
  2. ストレージクラスを Openshift に登録するには、以下のコマンドを実行します。

    # oc create -f glusterfs-storageclass.yaml
    storageclass "gluster-container" created
  3. ストレージクラスの詳細を取得するには、以下のコマンドを実行します。

    # 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) を作成するには、以下のコマンドを実行します。

  1. 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 を削除する必要があります。

  2. 以下のコマンドを実行して要求を登録します。

    # oc create -f glusterfs-pvc-claim1.yaml
    persistentvolumeclaim "claim1" created
  3. 要求の詳細を取得するには、以下のコマンドを実行します。

    # 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. 要求作成の確認

要求が作成されているかどうかを確認するには、以下のコマンドを実行します。

  1. 永続ボリューム要求 (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
  2. エンドポイントとサービスが要求の作成時に作成されたかどうかを確認するには、以下のコマンドを実行します。

    # 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 で要求を使用するには、以下の手順を実行します。

  1. アプリケーションで要求を使用するには、たとえば、以下のようになります。

    # 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 を参照してください。

  2. 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
  3. 永続ボリュームがコンテナー内でマウントされていることを確認するには、以下のコマンドを実行します。

    # 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 のサイズを変更することもできます。

永続ボリューム要求の値を拡張するには、以下のコマンドを実行します。

  1. 既存の永続ボリュームサイズを確認するには、アプリケーション 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 です。

  2. 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
  3. 検証するには、アプリケーション 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 が削除されてもそのまま残ります。

  1. 要求を削除するには、以下のコマンドを実行します。

    # oc delete pvc <claim-name>

    以下に例を示します。

    # oc delete pvc claim1
    persistentvolumeclaim "claim1" deleted
  2. 要求が削除されたかどうかを確認するには、以下のコマンドを実行します。

    # 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 の値を設定し、動的にプロビジョニングされたボリュームのボリュームのセキュリティーを提供するには、以下のコマンドを実行します。

  1. 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 が設定されます。

  2. 永続ボリューム要求 (PVC) を作成します。詳細は、「Persistent Volume Claim(永続ボリューム要求、PVC) の作成」を参照してください。
  3. Pod の要求を使用します。この Pod が特権を持たないことを確認します。詳細は、「Pod での要求の使用」を参照してください。
  4. 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 と単純なマッチングルールで新規ボリュームを作成する必要があります。

手順

  1. 必要なタグを heketi デバイスに適用します。

    # heketi-cli device settags <device-name> <key>:<value>

    例:

    # heketi-cli device settags 1fe1b83e5660efb53cc56433cedf7771 disktype:hdd
  2. 適用されたタグをデバイスから削除します。

    # heketi-cli device rmtags <device-name> <key>

    例:

    # heketi-cli device rmtags 1fe1b83e5660efb53cc56433cedf7771 disktype
  3. デバイスに追加されたタグを確認します。

    # 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
  4. タグ付けされたデバイスを使用してボリュームを作成します。

     # 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 ルールは、ボリューム拡張およびブリックの置き換えの目的で、ボリュームのメタデータと共に永続化されます。

  5. ストレージクラスを作成します。

    • ハードディスク上にのみボリュームを作成するストレージクラスを作成します。

      # 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