Open2

Pause Containerについてのメモ

shunshun

KubernetesでPodを起動したときに、一緒に動き出すPauseコンテナ。これが何なのかをメモ

  • PauseコンテナはPodで稼働しているコンテナのそばで常に稼働しているコンテナ
  • PauseコンテナはPod内の全てのコンテナの親として機能している
  • 2つの役割を持っている
    • ネットワーク名前空間を保持する
    • Pod内のPID名前空間のPID1として稼働する(Pod内の親プロセスとして稼働する)
shunshun
  • そもそもコンテナはホストマシン上で稼働する「プロセス」
    • namespaceとcgroupで様々なリソースを隔離して与えられたプロセス
  • このプロセス、親や子の関係がある
    • 子プロセスが死ぬと親プロセスがwaitするまではカーネルのプロセステーブルに残り続ける、いわゆるゾンビプロセスになる
    • 先に親プロセスが死んだ場合は、子プロセスの親はプロセスID 1、つまりinitプロセスになる
  • この関係を覚えたままPID名前空間のことを考える
    • プロセスID 1 には子プロセスを看取る役割がある
    • ということはコンテナとして起動されたプロセスにもその役割が期待される
    • それを担当するのがPauseコンテナ
    • つまりはPodにゾンビプロセスを溜めないための仕組み
  • network namespaceを保持し続けるためにも役立つ
    • PauseコンテナなしでPod内の全てのコンテナが停止してしまうと、Podに設定されていたnamespaceなどの設定は全て破棄されてしまう
    • 同じPodに再度コンテナを起動させようとしても新たなネットワーク設定を作成する必要となってしまう
    • この挙動を避けるためにPauseコンテナが常にPod内で稼働し続けている
  • Podを生成した後、その中でコンテナが稼働する前にpauseコンテナは稼働し、namespaceやcgoupsなどのリソースを確保する