(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】Podがファイルシステムを逼迫させた際におきた事象

スポンサーリンク

はじめに

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はすぐには再起動されないようです。

以上、同様の事象に興味がある方の参考になれば幸いです。