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

環境

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

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

大まかな手順

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

1. PV削除

1
2
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内でデバイスを特定する

1
2
3
4
5
6
7
8
9
10
11
12
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を実行しているノードで行う。

1
2
3
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)

1
2
3
4
5
6
7
8
9
10
11
12
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は、マウントポイントを指定しなければいけないのにデバイスを指定しているのが原因

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

蛇足

静的iSCSI PV 定義

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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