Kubernetes v1.37でMemory QoSがBetaに—デフォルト有効化の背景
Kubernetes v1.37のリリースにより、Memory QoS機能がBeta版へと昇格し、大きな注目を集めています。これは、Linux上でcgroup v2を利用しているノードにおいて、コンテナのメモリ管理を最適化するための重要な一歩です。(出典)
この機能はv1.22でAlphaとして初登場し、v1.36で階層型メモリ予約が追加されるなど、着実に進化してきました。そして今回のv1.37でBetaとなり、Kubeletの MemoryQoS フィーチャーゲートがデフォルトで有効化されました。この変更は、Kubernetesクラスターの安定性向上に寄与するものです。
Memory QoS機能がBetaに昇格し、cgroup v2環境でのメモリ管理がより細かく制御可能になりました。
v1.37における変更点とクラスター運用への影響
v1.37での主な変更点は、MemoryQoS フィーチャーゲートがBetaになり、デフォルトで有効化されたことです。これにより、Kubeletの特別な設定なしにこの機能が利用可能になります。
しかし、デフォルト設定ではメモリのスロットリングや予約は行われず、memory.high、memory.min、memory.low の値はcgroupに書き込まれません。これは、既存のクラスターをv1.37にアップグレードした際に、ランタイムの動作に予期せぬ変更が生じるのを防ぐための配慮だと感じます。
Memory QoSの具体的な挙動は、Kubeletの設定フィールドを通じて明示的に有効化する必要があります。例えば、memoryThrottlingFactor を設定することでBurstableおよびBestEffortコンテナの memory.high スロットリングを有効にしたり、memoryReservationPolicy を TieredReservation に設定することで階層型メモリ保護を有効にできます。
Memory QoS設定オプション
| 設定項目 | デフォルト値 | 目的 |
|---|---|---|
memoryThrottlingFactor |
null (v1.37以降) |
Burstable/BestEffortコンテナのメモリ高使用時スロットリング |
memoryReservationPolicy |
None |
階層型メモリ保護 (memory.min/low) |
memoryThrottlingFactor のデフォルト変更とその理由
以前のAlphaリリースでは、memoryThrottlingFactor はデフォルトで 0.9 でしたが、v1.37では null に変更されました。(出典)この変更は、MemoryQoS フィーチャーゲートがデフォルトで有効になったことに伴い、既存のワークロードが予期せずスロットリングされるのを避けるためです。デフォルトを null にすることで、v1.37へのアップグレードが既存のランタイム動作に影響を与えないようにしています。
もしKubeletの設定ファイルに memoryThrottlingFactor が既に明示的に設定されている場合、その値はアップグレード後も維持され、スロットリングは継続されます。しかし、設定ファイルに含まれていない場合は、新しい null デフォルトが適用され、memory.high の設定は行われなくなります。
これまで通りスロットリングを維持したい場合は、KubeletConfigurationに明示的に memoryThrottlingFactor: 0.9 を追加する必要があります。PythonやTypeScriptで書かれたサービスをKubernetesで運用している身としては、メモリ効率の向上は常に課題なので、こうしたきめ細かい設定が可能になるのは非常にありがたいですね。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
memoryThrottlingFactor: 0.9
これは Pod-Level Resource Managers のBeta昇格(出典)とも関連が深く、よりPodレベルでのリソース管理が強化される流れと見ています。特にレイテンシに敏感なアプリケーションでは、CPUやメモリのNUMAアライメントが重要になるため、この連携は非常に重要だと感じます。