CentOS7 で /(root) 領域を拡張する

事の始まり
---
kubernetes を構成している機器の一台で、POD が起動できない現象が発生しました。
どうやら Kubernetes 利用環境だと、docker image が保存されている領域が 85% 以上になると問題が起きる模様。
[参考]
https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/#eviction-policy

/home 領域が余っていたので、 / 領域に追加しました。


以下の手順で / の拡張を行っていきます。

構成
-
・/home 領域で glusterfs を利用（/home/glusterfs）
・node 3台構成
・今回の対象は k8s-master2

[Before]
 /home : 180GB
 /     : 50GB

[After]
 /home : 80GB
 /     :150GB



手順
-
 0. node から pod を退避させる
 1. バックアップの準備やバックアップ先のマウント
 2. glusterfs の停止
 3. home 領域の backup 取得
 4. home 領域の unmount
 5. home 領域の削除
 6. 新しい home 領域の作成
 7. バックアップした home のデータをリストア
 8. / 領域の拡張
 9. glusterfs の再開
 10. 作業後の確認

詳細手順
-

node から pod を退避させる

```shell
# kubectl drain --ignore-daemonsets --force --delete-local-data k8s-master2
```


必要なツールを準備します。

```shell
# yum install xfsdump
```

バックアップ先を用意します。このケースでは NFS。

```shell
# mount -t nfs 192.168.1.50:nfs_backup /mnt
```

glusterfs のステータス確認

```shell
# systemctl status glusterd
⇒ プロセスが起動していることを確認します。

# gluster peer status
⇒ peer が表示されていることを確認します。
　 State: Peer in Cluster (Connected)

# gluster vol status
⇒ Brick の Online が Y になっていることを確認します。
````


glusterfs を停止します。
停止しても勝手に上がってくるので、mask で無理やり止めてます。
これでいいのか・・・？

````
# systemctl mask glusterd
# systemctl stop glusterd
````

※ これ以降、gluster 系のコマンドは使えなくなるので、
　 ステータスを確認したい時は他の peer で確認しましょう。

````
表示例
[root@k8s-master1 ~]# gluster peer status
Number of Peers: 2

Hostname: etcd-master3
Uuid: 36d78117-e3ba-4bcc-b8bd-aa53109b7de7
State: Peer in Cluster (Connected)

Hostname: etcd-master2
Uuid: 03b802d9-dc51-4105-91b6-8720baabe80e
State: Peer in Cluster (Disconnected) ★停止中
[root@k8s-master1 ~]#
````

volume status 確認

````

# gluster vol status
volume 情報抜粋

Status of volume: mstdn
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick etcd-master1:/home/glusterfs/mstdn    49162     0          Y       5676
Brick etcd-master3:/home/glusterfs/mstdn    49162     0          Y       5477
Self-heal Daemon on localhost               N/A       N/A        Y       20508
Self-heal Daemon on etcd-master3            N/A       N/A        Y       28199

Task Status of Volume mstdn
------------------------------------------------------------------------------
There are no active volume tasks
```

バックアップを取得します。

```
# xfsdump -J -L home -M drive -f /mnt/`uname -n`/home.dump /home

xfsdump: dump complete: 118 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /mnt/k8s-master2/home.dump OK (success)
xfsdump: Dump Status: SUCCESS
```

home を unmount します。

```
# umount /dev/mapper/centos-home
```

LVM 情報を確認。

````
# lvscan
````

既存のhomeを利用停止

```
# lvchange -an /dev/centos/home

結果確認
[root@k8s-master2 ~]# lvscan
  ACTIVE            '/dev/centos/swap' [7.81 GiB] inherit
  inactive          '/dev/centos/home' [179.46 GiB] inherit
  ACTIVE            '/dev/centos/root' [50.00 GiB] inherit
[root@k8s-master2 ~]#
```

既存のhomeを削除

```
# lvremove /dev/centos/home

結果確認
[root@k8s-master2 ~]# lvscan
  ACTIVE            '/dev/centos/swap' [7.81 GiB] inherit
  ACTIVE            '/dev/centos/root' [50.00 GiB] inherit
[root@k8s-master2 ~]#
```

新home作成

```
# lvcreate -L 80G -n home centos
# mkfs.xfs /dev/centos/home
# mount /home
```

確認

```
# lvscan
# df -h

[root@k8s-master2 ~]# lvscan
  ACTIVE            '/dev/centos/swap' [7.81 GiB] inherit
  ACTIVE            '/dev/centos/root' [50.00 GiB] inherit
  ACTIVE            '/dev/centos/home' [80.00 GiB] inherit
[root@k8s-master2 ~]#

df -h 抜粋
/dev/mapper/centos-home    80G   33M   80G    1% /home
```


homeダンプをリストア

```
# xfsrestore -J -L home -f /mnt/`uname -n`/home.dump /home

xfsrestore: restore complete: 168 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /mnt/k8s-master2/home.dump OK (success)
xfsrestore: Restore Status: SUCCESS
```

空いたサイズをrootに割当

```
# lvextend -l +100%FREE /dev/centos/root
```

rootを拡張

```
# xfs_growfs /dev/mapper/centos-root
```

確認

```
# df -h
# lvscan

[root@k8s-master2 ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root   150G   43G  108G   29% /

[root@k8s-master2 ~]# lvscan
  ACTIVE            '/dev/centos/swap' [7.81 GiB] inherit
  ACTIVE            '/dev/centos/root' [149.46 GiB] inherit
  ACTIVE            '/dev/centos/home' [80.00 GiB] inherit
[root@k8s-master2 ~]#

```


glusterfs 再開

```
# systemctl unmask glusterd
# systemctl restart glusterd
# systemctl status glusterd
```

確認

```
[root@k8s-master2 ~]# gluster peer status
Number of Peers: 2

Hostname: etcd-master1
Uuid: 3b88e96b-af5b-4971-9af9-b03f06a03749
State: Peer in Cluster (Connected)

Hostname: etcd-master3
Uuid: 36d78117-e3ba-4bcc-b8bd-aa53109b7de7
State: Peer in Cluster (Connected)
[root@k8s-master2 ~]#

# gluster vol status

[表示例]
Status of volume: mstdn
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick etcd-master1:/home/glusterfs/mstdn    49162     0          Y       5676
Brick etcd-master2:/home/glusterfs/mstdn    49162     0          Y       2106
Brick etcd-master3:/home/glusterfs/mstdn    49162     0          Y       5477
Self-heal Daemon on localhost               N/A       N/A        Y       1998
Self-heal Daemon on etcd-master1            N/A       N/A        Y       20508
Self-heal Daemon on etcd-master3            N/A       N/A        Y       28199

Task Status of Volume mstdn
------------------------------------------------------------------------------
There are no active volume tasks

```

# 後処理

glusterfs の volume の正常性は以下で確認します。

```shell
gluster volume 一覧を環境変数にセットする
# VOL_LIST=`gluster vol list`

確認
# echo $VOL_LIST

gluster volume の正常性確認

# for vol in ${VOL_LIST}; 
  do echo $vol;
  gluster vol heal $vol info
  done

⇒ Number of entries: 0
　 と表示されていることを確認します。


[表示例]
Brick etcd-master1:/home/glusterfs/mstdn
Status: Connected
Number of entries: 0

Brick etcd-master2:/home/glusterfs/mstdn
Status: Connected
Number of entries: 0

Brick etcd-master3:/home/glusterfs/mstdn
Status: Connected
Number of entries: 0

```


pod が起動しない設定を解除する

```shell
kubectl uncordon k8s-master2
```

うちは 3台構成なので、この作業を後2台に繰り返します。
面倒くさいので ansible で自動化したものが次の記事。