2.12. ローカルボリュームを使用した永続ストレージ

OpenShift Container Platform は、ローカルボリュームを使用する永続ストレージでプロビジョニングすることが可能です。ローカルの永続ボリュームを使用すると、標準の PVC インターフェースを使用して、ディスクやパーティションなどのローカルのストレージデバイスにアクセスできます。

ローカルボリュームは、Pod をノードに手動でスケジュールせずに使用できます。ボリュームのノード制約がシステムによって認識されるためです。ただし、ローカルボリュームは、依然として基礎となるノードの可用性に依存しており、すべてのアプリケーションに適している訳ではありません。

注記

ローカルボリュームは、静的に作成された永続ボリュームとしてのみ使用できます。

2.12.1. ローカルストレージ Operator のインストール

ローカルストレージ Operator はデフォルトで OpenShift Container Platform にインストールされません。以下の手順を使用してこの Operator をインストールし、クラスター内でローカルボリュームを有効にできるように設定します。

前提条件

  • OpenShift Container Platform Web コンソールまたはコマンドラインインターフェース (CLI) へのアクセス。

手順

  1. local-storage プロジェクトを作成します。

    $ oc new-project local-storage
  2. オプション: マスターおよびインフラストラクチャーノードでのローカルストレージの作成を許可します。

    ロギングやモニタリングなどのコンポーネントに対応するために、ワーカーノードだけではなく、ローカルストレージ Operator を使用してマスターおよびインフラストラクチャーノードでボリュームを作成する必要のある場合があります。

    マスターおよびインフラストラクチャーノードでローカルストレージを作成できるようにするには、以下のコマンドを入力して容認を DaemonSet に追加します。

    $ oc patch ds local-storage-local-diskmaker -n local-storage -p '{"spec": {"template": {"spec": {"tolerations":[{"operator": "Exists"}]}}}}'
    $ oc patch ds local-storage-local-provisioner -n local-storage -p '{"spec": {"template": {"spec": {"tolerations":[{"operator": "Exists"}]}}}}'

UI での操作

  1. Web コンソールからローカルストレージ Operator をインストールします。

    1. OpenShift Container Platform Web コンソールにログインします。
    2. OperatorsOperatorHub に移動します。
    3. Local Storage をフィルターボックスに入力して、ローカルストレージ Operator を見つけます。
    4. Install をクリックします。
    5. Create Operator Subscription ページで、A specific namespace on the cluster を選択します。ドロップメニューから local-storage を選択します。
    6. Update Channel および Approval Strategy の値を必要な値に調整します。
    7. Subscribe をクリックします。
  2. これが完了すると、ローカルストレージ Operator は Web コンソールの Installed Operators セクションに一覧表示されます。

    1. OperatorsOperatorHub に移動します。
    2. Local Storage をフィルターボックスに入力して、ローカルストレージ Operator を見つけます。
    3. Install をクリックします。
    4. Create Operator Subscription ページで、A specific namespace on the cluster を選択します。ドロップメニューから local-storage を選択します。
    5. Update Channel および Approval Strategy の値を必要な値に調整します。
    6. Subscribe をクリックします。
  3. これが完了すると、ローカルストレージ Operator は Web コンソールの Installed Operators セクションに一覧表示されます。

CLI からの操作

  1. CLI からローカルストレージ Operator をインストールします。

    1. ローカルストレージ Operator の namespace、OperatorGroup、およびサブスクリプションを定義するために、オブジェクト YAML ファイルを作成します (例: local-storage.yaml)。

      Local-storage の例

        apiVersion: v1
        kind: Namespace
        metadata:
          name: local-storage
        ---
        apiVersion: operators.coreos.com/v1alpha2
        kind: OperatorGroup
        metadata:
          name: local-operator-group
          namespace: local-storage
        spec:
          targetNamespaces:
            - local-storage
        ---
        apiVersion: operators.coreos.com/v1alpha1
        kind: Subscription
        metadata:
          name: local-storage-operator
          namespace: local-storage
        spec:
          channel: "{product-version}" 1
          installPlanApproval: Automatic
          name: local-storage-operator
          source: redhat-operators
          sourceNamespace: openshift-marketplace

      1
      このフィールドは、OpenShift Container Platform のリリースの選択に一致するように編集できます。
  2. 以下のコマンドを実行して、ローカルストレージ Operator オブジェクトを作成します。

    $ oc apply -f local-storage.yaml

    この時点で、Operator Lifecycle Manager (OLM) はローカルストレージ Operator を認識できるようになります。Operator の ClusterServiceVersion (CSV) はターゲット namespace に表示され、Operator で指定される API は作成用に利用可能になります。

  3. すべての Pod およびローカルストレージ Operator が作成されていることを確認して、ローカルストレージのインストールを検証します。

    1. 必要な Pod すべてが作成されていることを確認します。

      $ oc -n local-storage get pods
      NAME                                      READY   STATUS    RESTARTS   AGE
      local-storage-operator-746bf599c9-vlt5t   1/1     Running   0          19m
    2. ClusterServiceVersion (CSV) YAML マニフェストをチェックして、ローカルストレージ Operator が local-storage プロジェクトで利用できることを確認します。

      $ oc get csvs -n local-storage
      NAME                                         DISPLAY         VERSION               REPLACES   PHASE
      local-storage-operator.4.2.26-202003230335   Local Storage   4.2.26-202003230335              Succeeded

すべてのチェックが渡されると、ローカルストレージ Operator が正常にインストールされます。

2.12.2. ローカルボリュームのプロビジョニング

ローカルボリュームは動的プロビジョニングで作成できません。代わりに、PersistentVolume がローカルストレージ Operator によって作成される必要があります。このプロビジョナーは、定義されたリソースで指定されているパスでデバイス (ファイルシステムおよびブロックボリュームの両方) を検索します。

前提条件

  • ローカルストレージ Operator がインストールされていること。
  • ローカルディスクが OpenShift Container Platform ノードに割り当てられていること。

手順

  1. ローカルボリュームリソースを作成します。これは、ノードおよびローカルボリュームへのパスを定義する必要があります。

    注記

    同じデバイスに別の StorageClass 名を使用しないでください。これを行うと、複数の永続ボリューム(PV)が作成されます。

    例: ファイルシステム

    apiVersion: "local.storage.openshift.io/v1"
    kind: "LocalVolume"
    metadata:
      name: "local-disks"
      namespace: "local-storage" 1
    spec:
      nodeSelector: 2
        nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - ip-10-0-140-183
              - ip-10-0-158-139
              - ip-10-0-164-33
      storageClassDevices:
        - storageClassName: "local-sc"
          volumeMode: Filesystem 3
          fsType: xfs 4
          devicePaths: 5
            - /path/to/device 6

    1
    ローカルストレージ Operator がインストールされている namespace。
    2
    オプション: ローカルストレージボリュームが割り当てられているノードの一覧が含まれるノードセレクター。以下の例では、oc get node から取得したノードホスト名を使用します。値が定義されない場合、ローカルストレージ Operator は利用可能なすべてのノードで一致するディスクの検索を試行します。
    3
    ボリュームモード (Filesystem または Block)で、ローカルボリュームのタイプを定義します。
    4
    ローカルボリュームの初回マウント時に作成されるファイルシステム。
    5
    選択するローカルストレージデバイスの一覧を含むパスです。
    6
    この値を、/dev/xvdg などの LocalVolume リソースへの実際のローカルディスクのファイルパスに置き換えます。プロビジョナーが正常にデプロイされると、これらのローカルディスク用に PV が作成されます。

    例: ブロック

    apiVersion: "local.storage.openshift.io/v1"
    kind: "LocalVolume"
    metadata:
      name: "local-disks"
      namespace: "local-storage" 1
    spec:
      nodeSelector: 2
        nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - ip-10-0-136-143
              - ip-10-0-140-255
              - ip-10-0-144-180
      storageClassDevices:
        - storageClassName: "localblock-sc"
          volumeMode: Block  3
          devicePaths: 4
            - /path/to/device 5

    1
    ローカルストレージ Operator がインストールされている namespace。
    2
    オプション: ローカルストレージボリュームが割り当てられているノードの一覧が含まれるノードセレクター。以下の例では、oc get node から取得したノードホスト名を使用します。値が定義されない場合、ローカルストレージ Operator は利用可能なすべてのノードで一致するディスクの検索を試行します。
    3
    ボリュームモード (Filesystem または Block)で、ローカルボリュームのタイプを定義します。
    4
    選択するローカルストレージデバイスの一覧を含むパスです。
    5
    この値を、/dev/xvdg などの LocalVolume リソースへの実際のローカルディスクのファイルパスに置き換えます。プロビジョナーが正常にデプロイされると、これらのローカルディスク用に PV が作成されます。
  2. 先に作成したファイルを指定して、OpenShift Container Platform クラスターにローカルボリュームリソースを作成します。

    $ oc create -f <local-volume>.yaml
  3. プロビジョナーが作成され、対応する DaemonSet が作成されていることを確認します。

    $ oc get all -n local-storage
    
    NAME                                          READY   STATUS    RESTARTS   AGE
    pod/local-disks-local-provisioner-h97hj       1/1     Running   0          46m
    pod/local-disks-local-provisioner-j4mnn       1/1     Running   0          46m
    pod/local-disks-local-provisioner-kbdnx       1/1     Running   0          46m
    pod/local-disks-local-diskmaker-ldldw         1/1     Running   0          46m
    pod/local-disks-local-diskmaker-lvrv4         1/1     Running   0          46m
    pod/local-disks-local-diskmaker-phxdq         1/1     Running   0          46m
    pod/local-storage-operator-54564d9988-vxvhx   1/1     Running   0          47m
    
    NAME                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE
    service/local-storage-operator    ClusterIP   172.30.49.90     <none>        60000/TCP   47m
    
    NAME                                           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    daemonset.apps/local-disks-local-provisioner   3         3         3       3            3           <none>          46m
    daemonset.apps/local-disks-local-diskmaker     3         3         3       3            3           <none>          46m
    
    NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/local-storage-operator   1/1     1            1           47m
    
    NAME                                                DESIRED   CURRENT   READY   AGE
    replicaset.apps/local-storage-operator-54564d9988   1         1         1       47m

    DaemonSet プロセスの必要な数と現在の数に注意してください。必要な数が 0 の場合、これはラベルセレクターが無効であることを示します。

  4. PersistentVolume が作成されていることを確認します。

    $ oc get pv
    
    NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    local-pv-1cec77cf   100Gi      RWO            Delete           Available           local-sc                88m
    local-pv-2ef7cd2a   100Gi      RWO            Delete           Available           local-sc                82m
    local-pv-3fa1c73    100Gi      RWO            Delete           Available           local-sc                48m

2.12.3. ローカルボリューム PersistentVolumeClaim の作成

ローカルボリュームは、Pod でアクセスされる PersistentVolumeClaim (PVC) として静的に作成される必要があります。

前提条件

  • Persistentvolume がローカルボリュームプロビジョナーを使用して作成されていること。

手順

  1. 対応する StorageClass を使用して PVC を作成します。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: local-pvc-name 1
    spec:
      accessModes:
      - ReadWriteOnce
      volumeMode: Filesystem 2
      resources:
        requests:
          storage: 100Gi 3
      storageClassName: local-sc 4
    1
    PVC の名前。
    2
    PVC のタイプ。デフォルトは Filesystemです。
    3
    PVC に利用できるストレージの量。
    4
    要求で必要になる StorageClass の名前。
  2. 作成したファイルを指定して、PVC を OpenShift Container Platform クラスターに作成します。

    $ oc create -f <local-pvc>.yaml

2.12.4. ローカル要求を割り当てます。

ローカルボリュームが PersistentVolumeClaim (PVC) にマップされた後に、これをリソース内に指定できます。

前提条件

  • PVC が同じ namespace に存在する。

手順

  1. 定義された要求をリソースの仕様に追加します。以下の例では、Pod 内で PVC を宣言します。

    apiVersion: v1
    kind: Pod
    spec:
      ...
      containers:
        volumeMounts:
        - name: localpvc 1
          mountPath: "/data" 2
      volumes:
      - name: localpvc
        persistentVolumeClaim:
          claimName: localpvc 3
    1
    マウントするボリュームの名前。
    2
    ボリュームがマウントされる Pod 内のパス。
    3
    使用する既存 PVC の名前。
  2. 作成したファイルを指定して、OpenShift Container Platform クラスターにリソースを作成します。

    $ oc create -f <local-pod>.yaml

2.12.5. ローカルストレージ Operator のリソースの削除

2.12.5.1. ローカルボリュームの削除

ローカルボリュームを削除する必要がある場合があります。LocalVolume リソースのエントリーを削除し、PersistentVolume を削除することで通常は十分ですが、同じデバイスパスを再使用する場合や別の StorageClass でこれを管理する必要がある場合には、追加の手順が必要になります。

警告

以下の手順では、root ユーザーとしてノードにアクセスします。この手順のステップ以外にノードの状態を変更すると、クラスターが不安定になる可能性があります。

前提条件

  • PersistentVolume の状態は Released または Available である必要があります。

    警告

    使用中の PersistentVolume を削除すると、データの損失や破損につながる可能性があります。

手順

  1. 以前に作成した LocalVolume を編集して、不要なディスクを削除します。

    1. クラスターリソースを編集します。

      $ oc edit localvolume <name> -n local-storage
    2. devicePaths の下の行に移動し、不要なディスクを表すものを削除します。
  2. 作成した PersistentVolume を削除します。

    $ oc delete pv <pv-name>
  3. ノードのシンボリックリンクを削除します。

    1. ノードにデバッグ Pod を作成します。

      $ oc debug node/<node-name>
    2. ルートディレクトリーをホストに切り替えます。

      $ chroot /host
    3. ローカルボリュームのシンボリックリンクを含むディレクトリーに移動します。

      $ cd /mnt/local-storage/<sc-name> 1
      1
      ローカルボリュームの作成に使用される StorageClass の名前。
    4. 削除したデバイスに属するシンボリックリンクを削除します。

      $ rm <symlink>

2.12.5.2. ローカルストレージ Operator のアンインストール

ローカルストレージ Operator をアンインストールするには、Operator および local-storage プロジェクトの作成されたすべてのリソースを削除する必要があります。

警告

ローカルストレージ PV がまだ使用中の状態でローカルストレージ Operator をアンインストールすることは推奨されません。PV は Operator の削除後も残りますが、PV およびローカルストレージリソースを削除せずに Operator がアンインストールされ、再インストールされる場合に予測できない動作が生じる可能性があります。

前提条件

  • OpenShift Container Platform Web コンソールへのアクセス。

手順

  1. プロジェクトのローカルボリュームリソースを削除します。

    $ oc delete localvolume --all --all-namespaces
  2. Web コンソールからローカルストレージ Operator をアンインストールします。

    1. OpenShift Container Platform Web コンソールにログインします。
    2. OperatorsInstalled Operators に移動します。
    3. Local Storage をフィルターボックスに入力して、ローカルストレージ Operator を見つけます。
    4. Options メニュー kebab を ローカルストレージ Operator の末尾でクリックします。
    5. Uninstall Operator をクリックします。
    6. 表示されるウィンドウで Remove をクリックします。
  3. ローカルストレージ Operator で作成された PV は削除されるまでクラスターに残ります。これらのボリュームが使用されなくなったら、以下のコマンドを実行してこれらのボリュームを削除します。

    $ oc delete pv <pv-name>
  4. local-storage プロジェクトを削除します。

    $ oc delete project local-storage