Namespace と cgroup

Linux コンテナの基盤技術で、プロセスの隔離とリソース制限を実現するカーネル機能

OSコンテナ

Namespace と cgroup とは

Namespace と cgroup は、Linux カーネルの機能で、Docker や Kubernetes のコンテナ技術の基盤である。Namespace がプロセスの隔離 (何が見えるか) を、cgroup がリソースの制限 (どれだけ使えるか) を担当する。

Namespace (隔離)

Namespace 隔離対象 効果
PID プロセス ID コンテナ内のプロセスが PID 1 から始まる
Network ネットワーク コンテナごとに独立した IP アドレス
Mount ファイルシステム コンテナごとに独立したファイルシステム
UTS ホスト名 コンテナごとに独立したホスト名
IPC プロセス間通信 コンテナ間の IPC を隔離
User ユーザー ID コンテナ内の root がホストの非 root
ホスト OS:
  PID 1 (systemd)
  PID 100 (dockerd)
  PID 200 (コンテナ A のプロセス)  コンテナ内では PID 1 に見える
  PID 300 (コンテナ B のプロセス)  コンテナ内では PID 1 に見える

cgroup (リソース制限)

リソース 制限内容 Kubernetes での設定
CPU CPU 使用率の上限 resources.limits.cpu
メモリ メモリ使用量の上限 resources.limits.memory
I/O ディスク I/O の帯域 -
PID プロセス数の上限 -
# Kubernetes での設定
containers:
  - name: app
    resources:
      requests:
        cpu: 100m      # 最低保証: 0.1 CPU
        memory: 128Mi  # 最低保証: 128 MB
      limits:
        cpu: 500m      # 上限: 0.5 CPU
        memory: 512Mi  # 上限: 512 MB (超過で OOMKill)

VM との比較

観点 コンテナ (Namespace + cgroup) VM (ハイパーバイザー)
隔離レベル プロセスレベル (カーネル共有) ハードウェアレベル (カーネル独立)
起動時間 ミリ秒 秒〜分
オーバーヘッド 小さい 大きい (ゲスト OS)
セキュリティ 中程度 (カーネル共有) 高い (完全隔離)

OOMKill

コンテナがメモリ上限を超えると、Linux カーネルが OOM Killer でプロセスを強制終了する。

kubectl describe pod myapp
# ...
# Last State: Terminated
#   Reason: OOMKilled
#   Exit Code: 137

Lambda との関係

Lambda も内部的に Firecracker (軽量 VM) + cgroup でリソースを隔離している。Lambda の MemorySize 設定は cgroup のメモリ制限に対応する。

さらに掘り下げるなら関連書籍が参考になる。

関連用語