この記事はMicrosoft Azure Tech Advent Calendar 2023  の 17 日目の記事になります。
こんにちは、 Azure テクニカル サポート チームの高田です。
この記事では、OOMKillが発生したときにせめて速やかに対処できるよう、
扱うトピック、扱わないトピック 本記事では、AKSノード上に配置されたPodのメモリ利用に起因してOOMKillが発生した場合の
そもそもノードのリソース不足でPodがスケジューリングされない(Pendingのままとなる)場合につきましては
2種類のメモリ利用制限 AKSノード上でPodがメモリを確保・利用する際、Pod・コンテナーレベル、
Pod・コンテナーレベルでの制限・OOMKill Pod内のコンテナーが確保・利用可能なメモリの上限は、Podのmanifest(YAML)中のspec.containers[].resources.limits.memoryにて指定できます。
(設定方法や考え方については下記のドキュメント等をご参照下さい)
Azure Kubernetes Service (AKS) でリソースを管理するアプリケーション開発者のベスト プラクティス 
コンテナおよびPodへのメモリーリソースの割り当て 
コンテナのリソース管理 
ノードレベルでの制限・OOMKill Podがノードにスケジュールされる際、ノードが提供可能なメモリがspec.containers[].resources.limits.memoryspec.containers[].resources.requests.memory(要求)に基づいて
この場合、まず、 Pod・コンテナーによるメモリ使用量の合計が割り当て可能(Allocatable)な
割り当て可能なメモリ量は、ノードに搭載されている(=VMサイズにて提供される)
Reserve Compute Resources for System Daemons: Node Allocatable 
AKS(Kubernetes バージョン1.28以下)の場合、eviction-thresholdは750MiB、kube-reservedは
Azure Kubernetes Services (AKS) における Kubernetes の中心概念: 
ノードに搭載されているメモリ量、割り当て可能な量は各々、kubectl describe nodeコマンドの出力中の
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $ kubectl describe node <ノード名> (略) Capacity:   cpu:                2   ephemeral-storage:  129886128Ki   hugepages-1Gi:      0   hugepages-2Mi:      0   memory:             4007948Ki   pods:               110 Allocatable:   cpu:                1900m   ephemeral-storage:  119703055367   hugepages-1Gi:      0   hugepages-2Mi:      0   memory:             2191372Ki   pods:               110 (略) 
Pod・コンテナーの情報でわかること、わからないこと あるコンテナーに関してOOMKillによるコンテナーの再起動が発生した場合、
1 2 3 4 5 6 7 8 $ kubectl describe pod <Pod名> (略)   <コンテナー名>:     Last State:     Terminated       Reason:       OOMKilled       Exit Code:    0       Started:      Wed, 13 Dec 2023 06:23:20 +0000       Finished:     Wed, 13 Dec 2023 06:23:21 +0000 
ただ、これのみでは、OOMKillが発生した原因kubectl describe podコマンドなどでは
ノードの情報にてわかること、わからないこと ノードレベルでメモリの逼迫が発生していた場合、kubectl describe node)やイベントとして、NodeHasInsufficientMemory を確認できます。
1 2 3 4 5 $ kubectl describe node <ノード名> Events:   Type     Reason                     Age                   From            Message   ----     ------                     ----                  ----            -------   Normal   NodeHasInsufficientMemory  9m33s (x2 over 18m)   kubelet         Node <ノード名> status is now: NodeHasInsufficientMemory 
1 2 3 4 5 $ kubectl get events LAST SEEN   TYPE      REASON                      OBJECT               MESSAGE (略) 8m21s       Warning   EvictionThresholdMet        node/<ノード名>       Attempting to reclaim memory 10m         Normal    NodeHasInsufficientMemory   node/<ノード名>       Node <ノード名> status is now: NodeHasInsufficientMemory 
これらの情報は、あくまでもこのタイミングでメモリの逼迫が発生していた、ということを示すものであり、
ノードのログからわかること とはいえ、関係者への説明のためなど、確実に原因を特定したい場合もあるかと思います。
OOMKillはLinuxカーネルの機能により実行されるため、OOMKillが発生した際には<プロセス名> invoked oom-killer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036951] stress-ng-vm invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=0, oom_score_adj=1000 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036958] CPU: 1 PID: 716580 Comm: stress-ng-vm Not tainted 5.15.0-1051-azure #59-Ubuntu Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036961] Hardware name: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS 090008  12/07/2018 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036962] Call Trace: Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036964]  <TASK> Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036967]  show_stack+0x52/0x5c Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036973]  dump_stack_lvl+0x38/0x4d Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036978]  dump_stack+0x10/0x16 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036980]  dump_header+0x53/0x228 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036984]  oom_kill_process.cold+0xb/0x10 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036986]  out_of_memory+0x106/0x2e0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036989]  mem_cgroup_out_of_memory+0x13f/0x160 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036992]  try_charge_memcg+0x6cd/0x790 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036995]  charge_memcg+0x45/0xa0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.036997]  __mem_cgroup_charge+0x2d/0x90 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037000]  do_anonymous_page+0x104/0x4c0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037003]  handle_pte_fault+0x21b/0x260 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037006]  __handle_mm_fault+0x409/0x760 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037009]  ? sched_clock+0x9/0x10 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037014]  handle_mm_fault+0xc8/0x2a0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037017]  do_user_addr_fault+0x1bc/0x660 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037020]  exc_page_fault+0x71/0x160 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037024]  asm_exc_page_fault+0x27/0x30 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037027] RIP: 0033:0x55fbbb223b65 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037031] Code: 98 00 41 54 49 89 fa 55 48 89 cd 48 01 fa 53 4c 8b 59 10 4c 39 ca 0f 83 01 01 00 00 31 c9 0f 1f 80 00 00 00 00 89 cf 83 c1 01 <40> 88 3a 48 8b 3d 99 f7 98 00 48 01 fa 4c 39 ca 72 e9 48 89 f0 31 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037033] RSP: 002b:00007ffd1b287520 EFLAGS: 00010206 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037035] RAX: 0000000000000010 RBX: 00007f1d90825000 RCX: 0000000000734f41 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037036] RDX: 00007f1dad562000 RSI: 0000000040000000 RDI: 0000000000734f40 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037038] RBP: 00007f1dd2c1e398 R08: 0000000000000000 R09: 00007f1dd0825000 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037039] R10: 00007f1d90825000 R11: 0000000000000000 R12: 0000000040000000 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037040] R13: 0000000000000000 R14: 00007ffd1b287670 R15: 000055fbbb2224b0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037044]  </TASK> Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037045] memory: usage 512000kB, limit 512000kB, failcnt 37 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037046] swap: usage 0kB, limit 9007199254740988kB, failcnt 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037047] Memory cgroup stats for /kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod479f327f_a27b_4eda_8523_90bdabcf0a27.slice: Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] anon 484630528 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] file 37752832 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] kernel_stack 65536 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] pagetables 1212416 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] percpu 11752 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] sock 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] shmem 37720064 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] file_mapped 37720064 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] file_dirty 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] file_writeback 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] swapcached 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] anon_thp 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] file_thp 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] shmem_thp 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] inactive_anon 522346496 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] active_anon 4096 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] inactive_file 16384 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] active_file 16384 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] unevictable 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] slab_reclaimable 303008 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] slab_unreclaimable 210008 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] slab 513016 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] workingset_refault_anon 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] workingset_refault_file 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] workingset_activate_anon 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] workingset_activate_file 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] workingset_restore_anon 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037069] workingset_restore_file 0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037071] Tasks state (memory values in pages): Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037072] [  pid  ]   uid  tgid total_vm      rss pgtables_bytes swapents oom_score_adj name Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037073] [ 716518] 65535 716518      243        1    28672        0          -998 pause Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037077] [ 716566]     0 716566    13966    10178   139264        0           975 stress-ng Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037079] [ 716579]     0 716579    13967      424    73728        0          1000 stress-ng-vm Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037082] [ 716580]     0 716580   276111   118439  1015808        0          1000 stress-ng-vm Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037084] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=cri-containerd-679f9845995b4ae4812789eb3c3d1df88040a1bc3f0c046a05c9aa9b5b5f93be.scope,mems_allowed=0,oom_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod479f327f_a27b_4eda_8523_90bdabcf0a27.slice,task_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod479f327f_a27b_4eda_8523_90bdabcf0a27.slice/cri-containerd-679f9845995b4ae4812789eb3c3d1df88040a1bc3f0c046a05c9aa9b5b5f93be.scope,task=stress-ng-vm,pid=716580,uid=0 Dec 13 07:23:21 aks-ubuntu-26835060-vmss000000 kernel: [36370.037095] Memory cgroup out of memory: Killed process 716580 (stress-ng-vm) total-vm:1104444kB, anon-rss:473048kB, file-rss:644kB, shmem-rss:64kB, UID:0 pgtables:992kB oom_score_adj:1000 
このメッセージから、いくつかのことがわかります。
コンテナーレベル/ノードレベルの判断 spec.containers[].resources.limits.memoryにて指定した制限は、
cgroupsはLinux上でコンテナーを実現するための主要な機能の一つであり、
Control Group v2: Memory 
メモリ制限(limits)は、Pod・コンテナーに対応するcgroupに関して
下記の行からは、oom_memcgとして、OOMの発生要因となったcgroupが/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod479f327f_a27b_4eda_8523_90bdabcf0a27.slice
1 oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=cri-containerd-679f9845995b4ae4812789eb3c3d1df88040a1bc3f0c046a05c9aa9b5b5f93be.scope,mems_allowed=0,oom_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod479f327f_a27b_4eda_8523_90bdabcf0a27.slice,task_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod479f327f_a27b_4eda_8523_90bdabcf0a27.slice/cri-containerd-679f9845995b4ae4812789eb3c3d1df88040a1bc3f0c046a05c9aa9b5b5f93be.scope,task=stress-ng-vm,pid=716580,uid=0 
一方、ノードレベルの場合は、例えば下記のように、 oom_memcgが/kubepods.sliceとなっている(個々のPod等に対応する
1 oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=cri-containerd-4d2af8acef61505159dd1fb6e232eacd1b724e1d629f043fcaa47809544f6d92.scope,mems_allowed=0,oom_memcg=/kubepods.slice,task_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-poda9d4b3f1_0189_4f5e_a8ee_94f0a3f53ab0.slice/cri-containerd-4d2af8acef61505159dd1fb6e232eacd1b724e1d629f043fcaa47809544f6d92.scope,task=stress-ng-vm,pid=728241,uid=0 
他にわかること この他、OOMKillメッセージには発生時のcgroup内のメモリ使用量の内訳、プロセス毎のメモリ使用状況などの情報が含まれます。
子プロセスがOOMKillされたときの挙動 Kubernetes 1.27 まで 既に解説した通り、Pod・コンテナーレベルのOOMKillは、Pod・コンテナーに対応するcgroupに関して
このとき、コンテナーとしての再起動は発生しないため、kubectl describe podコマンドの結果などからは、そもそもOOMKillが発生したことすらわかりません。
このような場合にOOMKillの発生を検知するには、ノードのログ等から
Kubernetes 1.28 以降 Kubernetes バージョン1.28以降では、cgroups v2のmemcgで採用されたmemory.oom.groupという機能を、Pod・コンテナーのcgroupに関してrestartPolicyがNeverでなければ)
[SIG-Node] Cgroups v2 memory.oom.group support (kill all pids in a pod on oom) 
use the cgroup aware OOM killer if available 
AKS では、Kubernetes バージョン1.25以降のAKSクラスターの
AKS Release 2023-11-28 
まとめると、Ubuntuノードの場合は Kuberenetes バージョン1.28以降、memory.oom.groupが有効化され、
なお、memory.oom.groupが有効化されているコンテナーに関してOOMKillが発生した場合、
1 Dec 13 07:54:24 aks-ubuntu-26253795-vmss000000 kernel: [41725.949137] Tasks in /kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podc9658b52_5194_4250_87f2_ec380cce2915.slice/cri-containerd-6793e00dcd36f430871d321242bbd79c1c186a3fad6615a98a1cc0b24c3e7f8f.scope are going to be killed due to memory.oom.group set 
まとめ この記事では、AKSノードにおけるOOOMKillの際の挙動や、これに基づく原因調査方法について紹介しました。memory.oom.group未対応の構成では、Kubernetes リソースの情報としては
      
      
        
        
          ※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。