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 の使用はリスクを理解した上で使用しましょう.

 

以上です.