10X SREの栗原です。
弊社ではGKEを利用しています。
GKEでは1.33からcontainerdが1.xから2.xにバージョンアップします。
Migrate nodes to containerd 2 | Google Kubernetes Engine (GKE) | Google Cloud
それによる影響の調査をしていたとき面白い発見があったので皆様に共有します。
containerdでは2.0のアプデ内容にFile Descriptor(以下、FDと略します)に
関する変更がありました。
github.com
この変更は containerd.service の LimitNOFILE=infinity を削除するものでした。
このPRのきっかけはmoby(docker)の次によるものでした。
github.com
sysytemdではLimitNOFILEはDo not useであること systemd.exec
これらの定義によって調査を困難にしているから修正が行われました。
PRにも取り上げられているように、メモリ枯渇や動作の重さといったissueが発生し、その原因はFDであると判明しました。
Fedora Docker-CE-Engine 20.10.13 consumes all available system memory (kernel 5.16.13) · Issue #43361 · moby/moby · GitHub
fakeroot has become extremely slow inside docker · Issue #45436 · moby/moby · GitHub
gnu screen run extremely slow when using 'root' user in container since docker 23.0.1 · Issue #45380 · moby/moby · GitHub
そして、mobyで修正した後にcontainerdも修正していました。
containerdはもともとdocker engineのコアコンポーネントなので同様な箇所をついでに修正したと思われます。
containerdのPRに戻ります。
1024 soft limit is an implicit default, avoiding unexpected breakage. Software that needs a higher limit should request to raise the soft limit for its process.
524288 hard limit is an implicit default since systemd v240 and is adequate for most processes (half of the historical limit from fs.nr_open of 1048576), while 4096 is the implicit default from the kernel (often too low).
PRの記載によれば、この変更により containerd の soft limit は 1024、hard limit は 524288 に設定される予定です。
LimitNOFILE=infinityのときのsoft limitが気になったので確認すると 1048576 でした。
この変更内容を見た瞬間、背筋が凍りました。というのも、弊社ではsquidをプロキシとして利用しており、これは決済関連の事業を支える重要なインフラの一部だからです。
squidの仕様として、FDに関する明示的な設定がない場合、soft limitの値がそのまま使用されるという特徴があります。
https://www.squid-cache.org/Doc/config/max_filedescriptors/
もしこの仕様を把握していなかったら、本番環境でsquidに障害が発生していた可能性が高く、冷や汗ものでした。
幸い、GKE 1.33ではこの問題が認識されており、最新バージョンではこの影響を回避できるようになっているとのことです。
GKE known issues | Google Kubernetes Engine (GKE) | Google Cloud
GKEではどのようにして今回の問題を回避したのか確認しました。
GKE 1.33でContainer-Optimized OSのnodeにsshした結果が次になります。
naohiro_kurihara@gke-naohiro-blog-test-default-pool-78d12243-qpfk ~ $ systemctl cat containerd # /usr/lib/systemd/system/containerd.service # Copyright The containerd Authors. (長いので割愛) # /etc/systemd/system/containerd.service.d/50-LimitNOFILE-infinity.conf [Service] LimitNOFILE=infinity naohiro_kurihara@gke-naohiro-blog-test-default-pool-78d12243-qpfk ~ $ systemctl show -p DropInPaths containerd DropInPaths=/etc/systemd/system/containerd.service.d/50-LimitNOFILE-infinity.con
drop-inを利用しLimitNOFILE=infinityを追加していることが分かりました。
以上のことから、FDのsoft・hard limitは変更されうる可能性が大いにあるので設定する場合は明示的に(今回の場合だと実数で)定義すべきだと考えさせられました。
株式会社10XではSREを募集しています。
カジュアル面談もwelcomeです。 ご応募お待ちしております。
SRE / 株式会社10X