Namespace と cgroup

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

OSコンテナ

Namespace と cgroup とは

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

Namespace (隔離)

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 (リソース制限)

cgroup (リソース制限) を以下にまとめる。

リソース制限内容Kubernetes での設定
CPUCPU 使用率の上限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 との比較

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 のメモリ制限に対応する。

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

この記事は役に立ちましたか?

関連用語

関連する記事