OpenShift の Local Storage Operator について
今回、OpenShift 4.x 系の Local Storage Operator 周りで少々苦しみましたので、得た知見を整理してみようと思います.
Local Persistent Volume
今回対象とするのは Local Persistent Volume です. Kubernetes 1.10 で Beta として登場し、Kubernetes 1.14 で GA された機能になります. Local Persistent Volume はノードのホストOS上のファイル領域を Pod から利用できるものになります.
Local Persistent Volume の説明はこちらが詳しいです.
通常、Kubernetes では以下のような YAML を適用して利用します.
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-volume
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
local:
path: /tmp/subdir/
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- "worker1.example.com"
storageClassName: "local"
Local Storage Operator
OpenShift 4.x 系では Local Persistent Volume を利用するための Operator が用意されています. その名も Local Storage Operator です.
Local Storage Operator は以下のような Custom Resource を適用することで、PersistentVolume リソースを自動的に作成します.
apiVersion: "local.storage.openshift.io/v1"
kind: "LocalVolume"
metadata:
name: "local-disks"
namespace: "local-storage"
spec:
nodeSelector:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker1.example.com
- worker2.example.com
- worker3.example.com
storageClassDevices:
- storageClassName: "local-sc"
volumeMode: Filesystem
fsType: xfs
devicePaths:
- /path/to/device
このとき作成される PV の容量はホストOS上のファイルシステム容量になります. 下記の例の場合、3つのノード(worker1〜3)の /path/to/device の容量がそれぞれ20GBである想定です.
$ oc get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
local-pv-1cec77cf 19Gi RWO Delete Available local-sc 88m
local-pv-2c90774a 19Gi RWO Delete Available local-sc 82m
local-pv-3fa1c73 19Gi RWO Delete Available local-sc 48m
作成された PersistentVolume リソースは以下のようになっています. 基本的にはマニュアル作成の PersistentVolume と変わりありません.
$ oc get pv/local-pv-2c90774a -o yaml
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
pv.kubernetes.io/provisioned-by: local-volume-provisioner-worker1.example.com-0659cf52-df4e-4403-97ff-85133a4c168f
creationTimestamp: "2020-07-29T13:50:49Z"
finalizers:
- kubernetes.io/pv-protection
labels:
storage.openshift.com/local-volume-owner-name: local-disks
storage.openshift.com/local-volume-owner-namespace: local-storage
name: local-pv-2c90774a
resourceVersion: "87875246"
selfLink: /api/v1/persistentvolumes/local-pv-2c90774a
uid: cd0c16ad-233b-409c-a97d-a5a51146070c
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 19Gi
local:
fsType: xfs
path: /mnt/local-storage/local-sc/dm-5
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker1.example.com
persistentVolumeReclaimPolicy: Delete
storageClassName: local-sc
volumeMode: Filesystem
status:
phase: Available
ちなみにこのとき各ノードのホストOS上には /mnt/local-storage/local-sc/ にシンボリックリンクが作成されています. この例の dm-5 はおそらく lsblk コマンドで表示されるものとイコールと思われます(要検証).
$ df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
/path/to/device xfs 20960256 179312 20780944 1% /var/mnt/data
$ ls -l /mnt/local-storage/local-sc/
total 0
lrwxrwxrwx. 1 root root 46 Jul 29 13:50 dm-5 -> /path/to/device
Local Persistent Volume のサポート範囲
公式ドキュメントには少し気になる表現がされています.
Local volumes cannot be created by dynamic provisioning. Instead, PersistentVolumes must be created by the Local Storage Operator. This provisioner will look for any devices, both file system and block volumes, at the paths specified in defined resource.
Persistent storage using local volumes
これをどう解釈するかが問題ですが、マニュアルによる Local Persistent Volume もサポート対象のようでした. ただし、Local Persistent Volume をマニュアルで定義すると以下の点でリスクがあるという指摘がされています.
- マニュアルでディスクをセットアップする必要があり、RHCOSホスト上での直接作業が必要となる。RHCOSではホストにログインを伴う直接作業を行うことは非推奨である。
- マニュアルで利用後のディスクやデータを消去する必要がある。間違って他Local PVなどで同一パスを指定してしまい他利用者にデータが見えてしまう、といった情報漏洩リスクが発生する。
OpenShiftとしては前述したリスクのあるオペレーションを避ける設計思想から Local Storage Operator の利用が強く推奨されます.
マニュアルによる Local Persistent Volume の使用はリスクを理解した上で使用しましょう.
以上です.