kubernetes障害記録:podにはできるだけrequestsに使用するメモリ量を書いた方が良い

tl;dr;

  • pod に requests を書いた方がいい。特にメモリ量。
  • さもないと、Out Of Memory(OOM)が発生してエライことになる可能性がある。

事故事例

requests が書かれていない状態で起きた。

  • requests がないのでメモリが逼迫したノードに新しいコンテナが配置された
  • OOM が発生してワーカーノードがマスターノードと疎通できなくなった
  • OOM でプロセスがkillされたが回復出来ずワーカーノードが応答不能状態に
  • ワーカーノードがダウンしたと判断され、他のノードに pod が移動を始めた
  • 他のノードもメモリ量がそれほどあるわけではないので OOM 発生
  • ギリギリだったノードにさらに割り振られて OOM 発生
  • ワーカーノード全滅

requests に書くメモリ量が分からない

とりあえず稼働させてみて、その pod が動作している pod に SSH でログインし、
docker stats [containerID] を実行することで使用中のメモリ量がわかる。

記述例

Deployments、ReplicaSet、DaemonSet、StatefulSet 等の conteiners の定義に書くことができる。
requests はスケジューリングに使用されるが、制限はされない参考情報なので多すぎる分には問題だが
少なくても問題は起きない(OOM が起きる可能性はあるが)のでちょっと多いくらいの数値が良いと思われる。

※ 未確認ですが、リソースがどのノードでも不足する場合は、pod が作成されずに Pending されるそうです。

1
2
3
4
5
6
7
8
9
10
containers:
- name: db
image: postgres:11
resources:
requests:
cpu: 1000m # CPU使用量の見込み
memory: "500M" # メモリ使用量の見込み
limits:
cpu: 2000m # CPU使用量の上限
memory: "700M" # メモリ使用量の上限