📈

kubernetesのiSCSI PV (static) を拡張する

2022/01/14に公開

環境

  • k8s 1.22.1
  • iSCSI TargetはTrueNAS Core
  • k8sにstaticなPVとしてiSCSIをマウントしている

statefulsetとして定義しているPodが使用するiSCSI PV を拡張するというのを前提に記述する。

大まかな手順

  1. PV削除 & 再生成
  2. PVC 削除 & 再生成
  3. ファイルシステム拡張

1. PV削除

kubectl delete -f pv.yaml
kubectl apply -f pv.yaml

PVには容量が定義されているので、そこを変更するために削除して再生成する。
patch等で変更できればいいのだが、容量は変更不可なので削除→再生成が必要。
なお、PVを削除してもiSCSIのディスク上のデータが削除されたりすることはないので安心してほしい。

2. PVC削除 & 再生成

1と同じ手順なので省略。理由も一緒。
statefulsetの場合は一度statefulsetを削除->PVCを削除→再度作成するのが早い
statefulsetの場合、再度作成した時点でPodが走ってしまうがそのままで問題ない。

3. ファイルシステム拡張

実行ノードの特定

ファイルシステムを拡張する。この手順は拡張したいPVをマウントしているPodが動いている状態で行う。 kubectl get pod -o wide を実行して、PVをマウントしているPodがどのノードで動いているかを確認する。

Pod内でデバイスを特定する

kubectl exec podname-0 -- df

Filesystem     1K-blocks     Used Available Use% Mounted on
overlay         38572396 29764404   6972620  82% /
tmpfs              65536        0     65536   0% /dev
tmpfs            4326452        0   4326452   0% /sys/fs/cgroup
shm                65536       40     65496   1% /dev/shm
/dev/sda2       38572396 29764404   6972620  82% /etc/hosts
/dev/sde        33542144 25336792   8205352  76% /var/lib/postgresql/data  <- これ!
tmpfs            3145728       12   3145716   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs            4326452        0   4326452   0% /proc/acpi
tmpfs            4326452        0   4326452   0% /sys/firmware

/dev/sde をマウントしていることがわかる。

ファイルシステム拡張を実行

この手順はpodを実行しているノードで行う。

user@kubeworker2:~$ df -a | grep /dev/sde
/dev/sde                                  -        -         -    - /var/lib/kubelet/plugins/kubernetes.io/iscsi/iface-default/192.168.10.220:3260-iqn.2005-10.org.freenas.ctl:k8s-tgt-lun-3
/dev/sde                                  -        -         -    - /var/lib/kubelet/pods/26d4ed85-a26e-447f-8dc0-7a1468d940b0/volumes/kubernetes.io~iscsi/iscsi-db

上記で2行表示されるが、/var/lib/kubelet/〜 のどちらかを次のコマンドに指定する(どちらでもOK)

root@kubeworker2:~# xfs_growfs /var/lib/kubelet/plugins/kubernetes.io/iscsi/iface-default/192.168.10.220:3260-iqn.2005-10.org.freenas.ctl:k8s-tgt-lun-3
meta-data=/dev/sde               isize=512    agcount=4, agsize=1572865 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=0
data     =                       bsize=4096   blocks=6291460, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=3072, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 6291460 to 8388608

ちなみに、iSCSI PVのyamlでext4を指定しているのであれば、xfs_growfs の変わりに resize2fs を使用する。ファイルシステム拡張なので稼働中に行っても安全。

失敗例

Pod上や、ノード上で /dev/sdX にiSCSI LUNがマウントされているように表示されるが、これを拡張しようとするとエラーになる。xfs_growfsは、マウントポイントを指定しなければいけないのにデバイスを指定しているのが原因

root@kubeworker2:~# xfs_growfs /dev/sde
xfs_growfs: /dev/sde is not a mounted XFS filesystem

蛇足

静的iSCSI PV 定義

以下のような定義をしている。なお、ノードにiscsi関連のツールをインストールする必要があるので注意。(それすらPodにする方法もあるようだが、うまく動かなかった)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: iscsi-pv-db
spec:
  capacity:
    storage: 5Gi
  #volumeMode: Block
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: iscsi-static
  iscsi:
    targetPortal: 192.168.0.1:3260
    portals: ['0.0.0.0:3260']
    iqn: iqn.2005-10.org.freenas.ctl:k8s-tgt
    lun: 0
    fsType: xfs
    readOnly: false

Discussion