はじめに
Podにログインしてdfコマンドを打つと以下のようなファイルシステムが確認できますが
/ # df Filesystem 1K-blocks Used Available Use% Mounted on overlay 101330012 53038048 48275580 52% / tmpfs 65536 0 65536 0% /dev tmpfs 2022504 0 2022504 0% /sys/fs/cgroup /dev/xvda2 101330012 53038048 48275580 52% /etc/hosts /dev/xvda2 101330012 53038048 48275580 52% /dev/termination-log /dev/xvda2 101330012 53038048 48275580 52% /etc/hostname /dev/xvda2 101330012 53038212 48275416 52% /etc/resolv.conf shm 65536 0 65536 0% /dev/shm tmpfs 2022504 16 2022488 0% /var/run/secrets/kubernetes.io/serviceaccount ...
ルートディレクトリに割り当てらているファイルシステムこそNodeの領域となります。
今回は同領域に巨大なファイルを置くことでコンテナ群がどのようになるのか実際に確認しました。
環境情報
- kubernetes v1.19
想定環境
1Node構成のクラスターにて別々のDeployment(1Pod)を3つ用意し、1つのPod内で以下のように巨大ファイルを作成するコマンドを打ちました。
# dd if=/dev/zero of=hoge bs=1M count=1000000
以下のように3つのDeploymentを用意しています。
$ kubectl get pod NAME READY STATUS RESTARTS AGE busybox-dep-67c8ccd97c-27tr2 1/1 Running 0 72m busybox-dep2-7fcfc7584f-78hr8 1/1 Running 0 72m busybox-dep3-67c67b859c-rqf42 1/1 Running 0 25m
発生する事象
ファイルシステムの使用量が90%を超えた時、WorkerNodeのEventに以下メッセージが出現。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- ... Normal NodeHasDiskPressure 11s (x7 over 10h) kubelet Node xx status is now: NodeHasDiskPressure
つづいて容量を超過したPodが以下メッセージを出力しながら停止。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning Evicted 2m19s kubelet The node was low on resource: ephemeral-storage. Container busybox was using 47229341828, which exceeds its request of 0. Normal Killing 2m19s kubelet Stopping container busybox
興味深いのは以下のようにPodのステータスはEvictedとして容量を解放していますが、新たに起動しようとするPodはPendingのままです。
$ kubectl get pod NAME READY STATUS RESTARTS AGE busybox-dep-67c8ccd97c-27tr2 0/1 Evicted 0 79m busybox-dep-67c8ccd97c-jccbb 0/1 Pending 0 4m50s busybox-dep2-7fcfc7584f-78hr8 1/1 Running 0 79m busybox-dep3-67c67b859c-rqf42 1/1 Running 0 32m
Pending状態のPodのメッセージは以下。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 15s (x6 over 5m19s) default-scheduler 0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/disk-pressure: }, that the pod didn't tolerate.
この状態で膠着するのでEvictedのPodを明示的にDeleteすると、Pendingが解消されてPodが起動しました。
終わりに
一連の作業をした際のNodeのEventsは以下。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- ... Normal NodeHasDiskPressure 19m (x7 over 10h) kubelet Node xx status is now: NodeHasDiskPressure Warning EvictionThresholdMet 18m (x7 over 10h) kubelet Attempting to reclaim ephemeral-storage Normal NodeHasNoDiskPressure 13m (x16 over 11h) kubelet Node xx status is now: NodeHasNoDiskPressure
ポイントとしてEvictedで容量は解放しつつも明示的にDeleteをかけないとPodはすぐには再起動されないようです。
以上、同様の事象に興味がある方の参考になれば幸いです。