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 のメモリ制限に対応する。
さらに掘り下げるなら関連書籍が参考になる。