Kubernetes 1.25 で GA した cgroup v2 に移行すると、containerd を使用している場合にエラーが発生するようになる可能性があります。この LT ではその原因と対策について紹介します。
イベントサイト: https://k8sjp.connpass.com/event/275280/
Kubernetes Meetup Tokyo #56 (2023/03/16)SUDA Kazuki, Preferred Networks, Inc. (@superbrothers)Kubernetes + containerd で cgroup v2 に移⾏したら“failed to create fsnotify watcher” エラーが 発⽣する原因と対策
View Slide
@superbrothersSUDA Kazuki / @superbrothers▶ Preferred Networks, Inc. / エンジニア▶ Scalar, Inc., Datachain, Inc. / 技術アドバイザ▶ Kubernetes Meetup Tokyo, K8s@home 共同主催者▶ 技術評論社「Kubernetes実践⼊⾨」、「みんなのDocker/Kubernetes」共著書▶ オライリー「⼊⾨ Prometheus」、「Kubernetes で実践するクラウドネイティブ DevOps」監訳書▶ stern ツールメンテナ(https://github.com/stern/stern)2
@superbrotherscgroup v2 に移⾏したらエラーが発⽣した3$ journalctl -u kubelet -fInsufficient watch descriptors available. Reverting to -n.$ kubectl logs -f deploy/nginxfailed to create fsnotify watcher: too many open files
@superbrothersそもそも cgroup v2 に移⾏すると何がうれしいの(利⽤者視点)Pod のメモリ要求が保証され、メモリ使⽤量が増加した際の Pod の安定性が向上する。▶ requests.memory を下回ってシステムにメモリを回収されることがなくなる▶ limits.memory の80%を超えて使⽤するとシステムがメモリを回収してできる限り OOM Kill を発⽣しにくくする4* Quality-of-Service for Memory Resources | Kubernetesこれまでは PodスケジューリングとNode MemoryPressure時にどの Pod をevict するかの判断に使われていましたV1.27 から 90% に変わるみたい (K/k#115371)
@superbrothers原因調査 (1/3)containerd-shim processes are leaking inotify instances with cgroups v2 · issue #5670 · containerd/containerd▶ cgroup v2 使⽤時にメモリイベント監視⽤の inotify instances がリークしているという報告+ 調査時点ですでに上記が修正済みの containerd バージョンを使⽤していた▶ しかし、ここで containerd は cgroup v2 使⽤時に inotify instances を使うようになったことを知る▶ Ubuntu 20.04/22.04 はデフォルトの上限が 128 なので、上限に達している😅5$ sudo find /proc/*/fd -lname anon_inode:inotify | wc -l128
@superbrothers原因調査 (2/3)▶ containerd-shim プロセスあたり2つ以上の inotify instances を使⽤していることが分かる6$ sudo find /proc/*/fd -lname anon_inode:inotify | cut -d/ -f3 | xargs -I '{}' -- ps --no-headers -o '%p %U %c %a %P' -p '{}' | uniq -c | sort -nr | grep containerd-shim7 2855 root containerd-shim /usr/local/bin/containerd-s 15 2737 root containerd-shim /usr/local/bin/containerd-s 14 2694 root containerd-shim /usr/local/bin/containerd-s 13 8229 root containerd-shim /usr/local/bin/containerd-s 13 7982 root containerd-shim /usr/local/bin/containerd-s 13 7859 root containerd-shim /usr/local/bin/containerd-s 13 7117 root containerd-shim /usr/local/bin/containerd-s 12 7720 root containerd-shim /usr/local/bin/containerd-s 12 7660 root containerd-shim /usr/local/bin/containerd-s 12 7569 root containerd-shim /usr/local/bin/containerd-s 12 7494 root containerd-shim /usr/local/bin/containerd-s 12 7433 root containerd-shim /usr/local/bin/containerd-s 12 4260 root containerd-shim /usr/local/bin/containerd-s 11つの Pod に相当
@superbrothers原因調査 (3/3)▶ Ubuntu 20.04/22.04 ではデフォルトで inotify instances の上限が 128▶ containerd は cgroup v2 使⽤時に Pod あたり2つの inotify instances を使⽤する▶ 1ノード上に作成できる Pods 数は 110 (デフォルト)なので、64の Pod が作成されると それだけで inotify instances の上限に達してしまいエラーが発⽣する7
@superbrothers対策inotify instances の上限を上げる▶ 値は⼗分に⼤きければよい+ inotify instances は実際に作成されなければリソースを消費しない8# /etc/sysctl.conffs.inotify.max_user_instances=8192fs.inotify.max_user_watches=524288
@superbrothersで、containerd は何のために inotify を使ってるのコンテナの OOM イベントを知るため▶ Inotify は Linux カーネルでサポートされているファイルシステムイベント通知システムで、 ファイルシステム上のファイルやディレクトリに対するさまざまなアクション(作成、変更、 削除、移動など)に対して、カーネルがユーザースペースに通知できる▶ OOM を含むメモリイベントを知るのに cgroup v2 の memory サブシステムで使⽤される ”memory.events” ファイルを監視するのに inotify を使⽤している▶ Pod あたり2つの inotify instances を使⽤するのは、 Pod が少なくともアプリケーションコンテナと pause コンテナの2つから構成されるため9内部的にすべての Pod に必ず存在する特殊なコンテナで、 Pod のコンテナ間で名前空間を共有するためなどに使われる
@superbrothersより詳しくは▶ Kubernetes: cgroup v2 使⽤時に "failed to create fsnotify watcher: too many openfiles" エラーが発⽣する問題の対策 - Qiita10環境情報▶ OS: Ubuntu 22.04.1 LTS▶ Kubernetes: v1.25.5▶ containerd: v1.6.12
機械学習プラットフォームエンジニアWe're hiring! https://www.preferred.jp/ja/careers/▶ ⾃由度・拡張性・使いやすさのトレードオフが取れた⼤規模機械学習プラットフォームの機能設計と開発+ 例: 機械学習ワークフローツール、実験管理ツール、GPUやMN-Core向け統合開発環境の構築▶ ⼤規模機械学習プラットフォームの運⽤と運⽤改善(⾃動化等)+ 例: ⾃動サーバプロビジョニング、パブリッククラウド連携による運⽤効率化、 インフラ健全性の⾃動診断と保守省⼒化▶ ⼤規模機械学習プラットフォーム上での計算資源(GPU, MN-Coreを含む)配分の最適化+ 例: Kubernetes Schedulerの機能拡張、リソース利⽤量制限拡張の開発▶ 最先端の分散計算基盤技術の Proof of Concept 構築及びプラットフォームでの実⽤化+ 例: Kubernetes上での分散強化学習実⾏ツール