事の始まり
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
手順
- node から pod を退避させる
- バックアップの準備やバックアップ先のマウント
- glusterfs の停止
- home 領域の backup 取得
- home 領域の unmount
- home 領域の削除
- 新しい home 領域の作成
- バックアップした home のデータをリストア
- / 領域の拡張
- glusterfs の再開
- 作業後の確認
詳細手順
node から pod を退避させる
# kubectl drain --ignore-daemonsets --force --delete-local-data k8s-master2
必要なツールを準備します。
# yum install xfsdump
バックアップ先を用意します。このケースでは NFS。
# mount -t nfs 192.168.1.50:nfs_backup /mnt
glusterfs のステータス確認
# 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 で自動化したものが次の記事。