2.12. ローカルボリュームを使用した永続ストレージ
OpenShift Container Platform は、ローカルボリュームを使用する永続ストレージでプロビジョニングすることが可能です。ローカルの永続ボリュームを使用すると、標準の PVC インターフェースを使用して、ディスクやパーティションなどのローカルのストレージデバイスにアクセスできます。
ローカルボリュームは、Pod をノードに手動でスケジュールせずに使用できます。ボリュームのノード制約がシステムによって認識されるためです。ただし、ローカルボリュームは、依然として基礎となるノードの可用性に依存しており、すべてのアプリケーションに適している訳ではありません。
ローカルボリュームは、静的に作成された永続ボリュームとしてのみ使用できます。
2.12.1. ローカルストレージ Operator のインストール
ローカルストレージ Operator はデフォルトで OpenShift Container Platform にインストールされません。以下の手順を使用してこの Operator をインストールし、クラスター内でローカルボリュームを有効にできるように設定します。
前提条件
- OpenShift Container Platform Web コンソールまたはコマンドラインインターフェース (CLI) へのアクセス。
手順
local-storage
プロジェクトを作成します。$ oc new-project local-storage
オプション: マスターおよびインフラストラクチャーノードでのローカルストレージの作成を許可します。
ロギングやモニタリングなどのコンポーネントに対応するために、ワーカーノードだけではなく、ローカルストレージ 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 での操作
Web コンソールからローカルストレージ Operator をインストールします。
- OpenShift Container Platform Web コンソールにログインします。
-
Operators
OperatorHub に移動します。 - Local Storage をフィルターボックスに入力して、ローカルストレージ Operator を見つけます。
- Install をクリックします。
- Create Operator Subscription ページで、A specific namespace on the cluster を選択します。ドロップメニューから local-storage を選択します。
- Update Channel および Approval Strategy の値を必要な値に調整します。
- Subscribe をクリックします。
これが完了すると、ローカルストレージ Operator は Web コンソールの Installed Operators セクションに一覧表示されます。
-
Operators
OperatorHub に移動します。 - Local Storage をフィルターボックスに入力して、ローカルストレージ Operator を見つけます。
- Install をクリックします。
- Create Operator Subscription ページで、A specific namespace on the cluster を選択します。ドロップメニューから local-storage を選択します。
- Update Channel および Approval Strategy の値を必要な値に調整します。
- Subscribe をクリックします。
-
Operators
- これが完了すると、ローカルストレージ Operator は Web コンソールの Installed Operators セクションに一覧表示されます。
CLI からの操作
CLI からローカルストレージ Operator をインストールします。
ローカルストレージ 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 のリリースの選択に一致するように編集できます。
以下のコマンドを実行して、ローカルストレージ Operator オブジェクトを作成します。
$ oc apply -f local-storage.yaml
この時点で、Operator Lifecycle Manager (OLM) はローカルストレージ Operator を認識できるようになります。Operator の ClusterServiceVersion (CSV) はターゲット namespace に表示され、Operator で指定される API は作成用に利用可能になります。
すべての Pod およびローカルストレージ Operator が作成されていることを確認して、ローカルストレージのインストールを検証します。
必要な Pod すべてが作成されていることを確認します。
$ oc -n local-storage get pods NAME READY STATUS RESTARTS AGE local-storage-operator-746bf599c9-vlt5t 1/1 Running 0 19m
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 ノードに割り当てられていること。
手順
ローカルボリュームリソースを作成します。これは、ノードおよびローカルボリュームへのパスを定義する必要があります。
注記同じデバイスに別の 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 が作成されます。
先に作成したファイルを指定して、OpenShift Container Platform クラスターにローカルボリュームリソースを作成します。
$ oc create -f <local-volume>.yaml
プロビジョナーが作成され、対応する 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
の場合、これはラベルセレクターが無効であることを示します。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 がローカルボリュームプロビジョナーを使用して作成されていること。
手順
対応する 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
作成したファイルを指定して、PVC を OpenShift Container Platform クラスターに作成します。
$ oc create -f <local-pvc>.yaml
2.12.4. ローカル要求を割り当てます。
ローカルボリュームが PersistentVolumeClaim (PVC) にマップされた後に、これをリソース内に指定できます。
前提条件
- PVC が同じ namespace に存在する。
手順
定義された要求をリソースの仕様に追加します。以下の例では、Pod 内で PVC を宣言します。
apiVersion: v1 kind: Pod spec: ... containers: volumeMounts: - name: localpvc 1 mountPath: "/data" 2 volumes: - name: localpvc persistentVolumeClaim: claimName: localpvc 3
作成したファイルを指定して、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 を削除すると、データの損失や破損につながる可能性があります。
手順
以前に作成した LocalVolume を編集して、不要なディスクを削除します。
クラスターリソースを編集します。
$ oc edit localvolume <name> -n local-storage
-
devicePaths
の下の行に移動し、不要なディスクを表すものを削除します。
作成した PersistentVolume を削除します。
$ oc delete pv <pv-name>
ノードのシンボリックリンクを削除します。
ノードにデバッグ Pod を作成します。
$ oc debug node/<node-name>
ルートディレクトリーをホストに切り替えます。
$ chroot /host
ローカルボリュームのシンボリックリンクを含むディレクトリーに移動します。
$ cd /mnt/local-storage/<sc-name> 1
- 1
- ローカルボリュームの作成に使用される StorageClass の名前。
削除したデバイスに属するシンボリックリンクを削除します。
$ rm <symlink>
2.12.5.2. ローカルストレージ Operator のアンインストール
ローカルストレージ Operator をアンインストールするには、Operator および local-storage
プロジェクトの作成されたすべてのリソースを削除する必要があります。
ローカルストレージ PV がまだ使用中の状態でローカルストレージ Operator をアンインストールすることは推奨されません。PV は Operator の削除後も残りますが、PV およびローカルストレージリソースを削除せずに Operator がアンインストールされ、再インストールされる場合に予測できない動作が生じる可能性があります。
前提条件
- OpenShift Container Platform Web コンソールへのアクセス。
手順
プロジェクトのローカルボリュームリソースを削除します。
$ oc delete localvolume --all --all-namespaces
Web コンソールからローカルストレージ Operator をアンインストールします。
- OpenShift Container Platform Web コンソールにログインします。
-
Operators
Installed Operators に移動します。 - Local Storage をフィルターボックスに入力して、ローカルストレージ Operator を見つけます。
- Options メニュー ローカルストレージ Operator の末尾でクリックします。
- Uninstall Operator をクリックします。
- 表示されるウィンドウで Remove をクリックします。
ローカルストレージ Operator で作成された PV は削除されるまでクラスターに残ります。これらのボリュームが使用されなくなったら、以下のコマンドを実行してこれらのボリュームを削除します。
$ oc delete pv <pv-name>
local-storage
プロジェクトを削除します。$ oc delete project local-storage