OCP 4.11でRHCOSの/sysrootのサイズを拡張する


# 概要

色々検索をしていたら、OCPのRHCOSの`/sysroot`をインストール後に拡張している記事がいくつかあったので試しにやってみました。
(あくまでもちょっとした検証環境で、ノードの内蔵ディスクのサイズが足りなくなったけどOCPクラスタを再作成までしたくない時などには今回の対応は使えるかもしれません。)

# 環境

OCPのバージョンは4.11.16です。
```bash
[root@bastion-01 ~]# oc version
Client Version: 4.11.16
Kustomize Version: v4.5.4
Server Version: 4.11.16
Kubernetes Version: v1.24.6+5157800
[root@bastion-01 ~]#
```

ベアメタルのUPIの方法でOCPクラスタを導入しています。
(ベアメタルのUPIですが、ノード自身はVMwareの仮想マシンで作成しています。)


元々、コントロールプレーンやワーカーノードのディスクの最小要件は100GBですが、今回は検証環境が潤沢にあるわけではなかったので、40GBぐらいにしていました。
(参考) [OCP 4.11 Docs / インストール / 11.3.3.2. クラスターインストールの最小リソース要件](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.11/html-single/installing/index#installation-minimum-resource-requirements_installing-bare-metal-network-customizations)

一応最小要件に近づけるために、例として以下のnodeの内蔵ディスクのサイズを40GBから100GBに増やし`/sysroot`を拡張してみました。

| Server     | vCPU | Memory | Disk          | notes                |
|:-----------|:-----|:-------|:--------------|:---------------------|
| infra #1   | 24   | 48GB   | 40GB -> 100GB | infra node           |
| infra #2   | 24   | 48GB   | 40GB -> 100GB | infra node           |
| infra #3   | 24   | 48GB   | 40GB -> 100GB | infra node           |



# 参考リンク

以下のリンクなどを参考にしました。

[Red Hat Customer Portal / Community / Discussion / Unable to extend disk size of /sysroot](https://access.redhat.com/discussions/6230831)
[Red Hat Customer Portal / Community / Discussion / Extend Disk on Red Hat CoreOS](https://access.redhat.com/discussions/4592521)

# 手順

## 現在の状況の確認

対象のノードのRHCOSの `/sysroot` のサイズは40GBとなっています。
```bash
[root@bastion-01 ~]# ssh core@infra-01 -- lsblk /dev/sda
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   40G  0 disk
|-sda1   8:1    0    1M  0 part
|-sda2   8:2    0  127M  0 part
|-sda3   8:3    0  384M  0 part /boot
`-sda4   8:4    0 39.5G  0 part /sysroot
[root@bastion-01 ~]#
[root@bastion-01 ~]# ssh core@infra-01 -- df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs   24G     0   24G   0% /dev
tmpfs          tmpfs      24G  168K   24G   1% /dev/shm
tmpfs          tmpfs      24G   48M   24G   1% /run
tmpfs          tmpfs      24G     0   24G   0% /sys/fs/cgroup
/dev/sda4      xfs        40G   11G   30G  26% /sysroot
tmpfs          tmpfs      24G  4.0K   24G   1% /tmp
/dev/sda3      ext4      364M  106M  236M  31% /boot
tmpfs          tmpfs     4.8G  4.0K  4.8G   1% /run/user/1000
[root@bastion-01 ~]#
```

## ノードの仮想ディスクの拡張

OCPクラスタをシャットダウンします。
[OCP 4.11 Docs / バックアップおよび復元 / 2. クラスターの正常なシャットダウン / 2.2. クラスターのシャットダウン](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.11/html/backup_and_restore/graceful-shutdown_graceful-shutdown-cluster#doc-wrapper)

(Infra nodeなどTaintを付与しているノードがある際などにoc debug nodeができなかったりすることがあるので、以下ではRHCOSにsshで接続してshutdownコマンドを発行しました。)
```bash
[root@bastion-01 ~]# for node in $(oc get nodes -o jsonpath='{.items[*].metadata.name}'); do ssh core@${node} sudo shutdown -h 1; done
```

vCenterにログインし、仮想ディスクのサイズを増やしたい仮想マシンの設定から、仮想ディスクの容量を増やします。
今回は対象のノードの仮想ディスク1を40GBから100GBに変更しました。

**変更前**
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/f7ae90f0-c303-b390-cf33-7cf6c6df04bd.png width="500">

**変更後**
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/3f39a5e4-92f8-4b09-738d-ab11b7edf4ca.png width="500">


対象ノードの仮想マシンの設定の変更が完了したら、仮想マシンの電源をオンにします。

![2022-12-13-23-41-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332622/6e857000-b993-502c-b555-adf5bad7ad76.png)



OCPクラスターが正常に稼働したことを確認します。
```bash
[root@bastion-01 ~]# oc get node
NAME         STATUS   ROLES    AGE    VERSION
infra-01     Ready    infra    154d   v1.24.6+5157800
infra-02     Ready    infra    154d   v1.24.6+5157800
infra-03     Ready    infra    154d   v1.24.6+5157800
master-01    Ready    master   154d   v1.24.6+5157800
master-02    Ready    master   154d   v1.24.6+5157800
master-03    Ready    master   154d   v1.24.6+5157800
storage-01   Ready    infra    8d     v1.24.6+5157800
storage-02   Ready    infra    8d     v1.24.6+5157800
storage-03   Ready    infra    8d     v1.24.6+5157800
worker-01    Ready    worker   154d   v1.24.6+5157800
worker-02    Ready    worker   154d   v1.24.6+5157800
[root@bastion-01 ~]#
```

`/dev/sda`は100Gになりましたが、`/sysroot`の`/dev/sda4`はまだ40GBのままです。
```bash
[root@bastion-01 ~]# ssh core@infra-01 -- lsblk /dev/sda
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk
|-sda1   8:1    0    1M  0 part
|-sda2   8:2    0  127M  0 part
|-sda3   8:3    0  384M  0 part /boot
`-sda4   8:4    0 39.5G  0 part /sysroot
[root@bastion-01 ~]#
```


## RHCOSの/sysrootの拡張

`/sysroot`の拡張手順は [Red Hat Customer Portal / Community / Discussion / Unable to extend disk size of /sysroot](https://access.redhat.com/discussions/6230831) のリンクを参照すると、OCP 4.11でも以下のコマンドで成功したようです。
ですので今回もこのコマンドを実際にやってみました。

(実行コマンド)
```bash
sudo su
growpart /dev/sda 4
sudo su -
unshare --mount
mount -o remount,rw /sysroot
xfs_growfs /sysroot
```


Infra node #1にSSHでログインして、上述のコマンドを実行してみました。
(通常は`oc debug node <node>`の方が良いと思います。)

(出力例)
```bash
[root@bastion-01 ~]# ssh core@infra-01
Red Hat Enterprise Linux CoreOS 411.86.202211072153-0
  Part of OpenShift 4.11, RHCOS is a Kubernetes native operating system
  managed by the Machine Config Operator (`clusteroperator/machine-config`).

WARNING: Direct SSH access to machines is not recommended; instead,
make configuration changes via `machineconfig` objects:
  https://docs.openshift.com/container-platform/4.11/architecture/architecture-rhcos.html

---
Last login: Tue Jul 12 14:40:46 2022 from 172.16.100.11
[core@infra-01 ~]$
[core@infra-01 ~]$ sudo su
[root@infra-01 core]#
[root@infra-01 core]# growpart /dev/sda 4
CHANGED: partition=4 start=1050624 old: size=82835423 end=83886047 new: size=208664543 end=209715167
[root@infra-01 core]#
[root@infra-01 core]# sudo su -
Last login: Tue Dec 13 14:54:19 UTC 2022 on pts/0
[root@infra-01 ~]#
[root@infra-01 ~]# unshare --mount
[root@infra-01 ~]#
[root@infra-01 ~]# mount -o remount,rw /sysroot
[root@infra-01 ~]#
[root@infra-01 ~]# xfs_growfs /sysroot
meta-data=/dev/sda4              isize=512    agcount=50, agsize=208895 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=10354427, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 10354427 to 26083067
[root@infra-01 ~]#
[root@infra-01 ~]# exit
logout
[root@infra-01 ~]# exit
logout
[root@infra-01 core]# exit
exit
[core@infra-01 ~]$
[core@infra-01 ~]$ exit
logout
Connection to infra-01 closed.
[root@bastion-01 ~]#
```


## RHCOSの/sysrootの拡張の確認

`/sysroot`が拡張されたか確認します。
`/dev/sda`が、100GBで、`/dev/sda4`の`/sysroot`も100Gになったことが確認できました。

```bash
[root@bastion-01 ~]# ssh core@infra-01 -- lsblk /dev/sda
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk
|-sda1   8:1    0    1M  0 part
|-sda2   8:2    0  127M  0 part
|-sda3   8:3    0  384M  0 part /boot
`-sda4   8:4    0 99.5G  0 part /sysroot
[root@bastion-01 ~]#
[root@bastion-01 ~]# ssh core@infra-01 -- df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs   24G     0   24G   0% /dev
tmpfs          tmpfs      24G  168K   24G   1% /dev/shm
tmpfs          tmpfs      24G   48M   24G   1% /run
tmpfs          tmpfs      24G     0   24G   0% /sys/fs/cgroup
/dev/sda4      xfs       100G   19G   82G  19% /sysroot
tmpfs          tmpfs      24G  4.0K   24G   1% /tmp
/dev/sda3      ext4      364M  106M  236M  31% /boot
tmpfs          tmpfs     4.8G  4.0K  4.8G   1% /run/user/1000
[root@bastion-01 ~]#
```


# 所感

(サポートされるかはわかりませんが)、検証環境でちょっとノードの`/sysroot`を拡張するのは、意外と簡単にできました。
わざわざOCPのクラスタの再作成までしなくて済んだので良かったです。