Namespace 分離
Kubernetes の Namespace を使ってリソース、ネットワーク、権限を論理的に分離するマルチテナント戦略
Namespace 分離とは
Namespace は Kubernetes クラスター内の論理的な分離単位である。チーム、環境 (dev/stg/prod)、アプリケーションごとに Namespace を分け、リソース、ネットワーク、権限を分離する。
1 つのクラスターを複数のチームで共有するマルチテナント環境では、Namespace 分離がコスト効率とセキュリティのバランスを取る基本戦略になる。
分離の 3 層
Namespace 分離は、以下の 3 層を組み合わせて初めて有効に機能する。1 層だけでは不十分だ。
1. リソース分離 (Resource Quota + LimitRange)
Namespace ごとに CPU、メモリ、Pod 数の上限を設定し、1 つのチームがクラスター全体のリソースを占有するのを防ぐ。
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-a-quota
namespace: team-a
spec:
hard:
requests.cpu: "10"
requests.memory: 20Gi
pods: "50"
Quota を置くと副作用が付いてくる。cpu / memory の Quota がある Namespace では、新しく作る Pod は該当リソースの requests か limits を必ず指定しなければならず、指定の無い Pod は admission で拒否され得る。「昨日まで通っていたマニフェストが急に弾かれる」という混乱はここから起きる。だから Quota は LimitRange と対で入れる。LimitRange が既定の requests / limits を自動で埋めるので、各チームが毎回書き忘れる前提で運用できる。なお上の例は requests.* しか縛っていないため、上限側も抑えたいなら limits.cpu / limits.memory を別に指定する。
2. ネットワーク分離 (Network Policy)
デフォルトでは、Kubernetes の全 Pod は Namespace を越えて自由に通信できる。Pod は自分を選ぶ Network Policy が 1 つ現れた時点で初めて隔離側に回り、それまでは受信も送信も素通しだ。
ここで前提を 1 つ押さえておく。Network Policy を実際に施行するのはネットワークプラグインであり、対応していないプラグインのクラスターではマニフェストを投入しても何も起きない。オブジェクトは正常に作成され、エラーも出ないまま無防備が続くので、最初に 1 度は遮断が効くことを通信して確かめる。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
namespace: team-a
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: team-a # 同じ Namespace からのみ許可
namespaceSelector で Namespace を名前で指すときは、コントロールプレーンが全 Namespace へ自動で付ける不変ラベル kubernetes.io/metadata.name を使う (Kubernetes 1.22 で stable)。name: team-a のような独自ラベルを書いた例が広く流布しているが、このラベルは自動では付かない。Namespace 側に手で付けていなければ from 条件が何にも一致せず、同一 Namespace からの通信まで落ちて全遮断になる。同じ Namespace 内だけを許す意図なら - podSelector: {} と書く方が取り違えが起きにくい。
3. 権限分離 (RBAC)
Role と RoleBinding で、各チームの操作権限を自分の Namespace に限定する。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: team-a-developer
namespace: team-a
rules:
- apiGroups: ["", "apps"]
resources: ["pods", "deployments", "services"]
verbs: ["get", "list", "create", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: team-a-developer-binding
namespace: team-a
subjects:
- kind: Group
name: team-a-developers
roleRef:
kind: Role
name: team-a-developer
apiGroup: rbac.authorization.k8s.io
Namespace 設計パターン
パターン 1: チーム別
cluster/
├── team-frontend/
├── team-backend/
├── team-data/
└── shared-infra/ (監視、ログ収集など共通基盤)
チームの自律性が高く、各チームが独立してデプロイできる。チーム間の依存が少ない組織に適する。
パターン 2: 環境別
cluster/
├── development/
├── staging/
└── production/
小規模チームで、環境ごとの分離が主目的の場合に適する。ただし、本番と開発が同じクラスターにあるリスクを許容する必要がある。
パターン 3: チーム × 環境
cluster/
├── team-a-dev/
├── team-a-prod/
├── team-b-dev/
└── team-b-prod/
最も細かい分離だが、Namespace 数が多くなり管理コストが増加する。
Namespace 分離の限界
Namespace は論理的な分離であり、物理的な分離ではない。以下の限界を理解しておく必要がある。
- ノードリソースの共有: 同じノード上の Pod は CPU やメモリを物理的に共有する。Resource Quota は Namespace 全体の上限を制御するが、ノードレベルの noisy neighbor 問題は防げない
- カーネルの共有: コンテナは Linux カーネルを共有する。カーネルの脆弱性を突かれると、Namespace の境界を越えてアクセスされる可能性がある
- クラスタースコープのリソース: Node、PersistentVolume、ClusterRole などはクラスター全体で共有され、Namespace で分離できない
強い分離が必要な場合
| 分離レベル | 手段 | コスト | セキュリティ |
|---|---|---|---|
| 論理分離 | Namespace + Network Policy | 低 | 中 |
| ノード分離 | Node Affinity + Taints | 中 | 高 |
| クラスター分離 | 専用クラスター | 高 | 最高 |
規制要件 (PCI DSS、HIPAA) がある場合や、信頼できないワークロードを実行する場合は、Namespace 分離だけでは不十分で、ノード分離やクラスター分離を検討する。
ただしノード分離は効き方を誤解されやすい。Taint はノードが Pod を弾く側の設定で、それを乗り越える Toleration は Pod 側に書く。つまりテナントが自分のマニフェストに Toleration を書ける限り、そのノードへ乗ってくるのを止められない。専有を本当に成立させるには、Pod が指定できるフィールドを admission 側で縛るところまで設計に含める。
よくある落とし穴
- Network Policy を設定し忘れる: Namespace を分けただけでは、ネットワークは分離されない。Network Policy を明示的に設定しないと、全 Pod が自由に通信できる状態のままだ
- default Namespace の使用:
defaultNamespace にワークロードを配置すると、分離の恩恵を受けられない。defaultは使わず、必ず専用の Namespace を作成する - RBAC の設定漏れ: Namespace を分けても、ClusterRole で全 Namespace への権限を付与していると意味がない。Role (Namespace スコープ) と ClusterRole (クラスタースコープ) の違いを理解する
Kubernetes 公式ドキュメントの「Namespaces」セクションが一次情報源であり、「Kubernetes Security and Observability」(Brendan Creane, Amit Gupta 著・オライリー・2021 年) でマルチテナントの分離戦略が詳しく解説されている。
理論と実装の両面から学ぶなら関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
Kubernetes
コンテナのデプロイ、スケーリング、管理を自動化するオープンソースのオーケストレーションプラットフォーム
マルチテナンシー
1 つのシステムで複数のテナント (顧客) のデータを安全に分離して提供するアーキテクチャ
Resource Quota
Kubernetes の Namespace ごとに CPU / メモリ / オブジェクト数の上限を定め、1 つのチームがクラスターを占有するのを防ぐ仕組み
Network Policy
Kubernetes で Pod 間のネットワーク通信を制御し、不要な通信を遮断するセキュリティ機能
RBAC
ロール (役割) に基づいてアクセス権限を管理する認可モデル
Kubernetes Namespace
Kubernetes クラスター内の API リソースを論理的に分離し、権限とリソース枠の適用単位を切る仕組み。ノードとカーネルは共有されるためセキュリティ境界にはならない
関連する記事
技術書の読む順番戦略 - 複数冊を組み合わせて理解を加速させる
技術書を 1 冊ずつ読むのではなく、複数冊を戦略的に組み合わせることで、1 冊では届かない理解の深さと広さに達する方法を解説します。
インフラ / クラウド本ガイド - AWS や Docker を本で学ぶ
クラウドインフラ、コンテナ、IaC を学べる技術書の選び方と学習順序を紹介。インフラ本の賞味期限問題と公式ドキュメントとの使い分けも解説します。
AWS 本の選び方 - 全体像 / 構築 / 設計 / 運用 / セキュリティの 5 視点
AWS を学ぶ技術書の選び方を「全体像 / 構築 / 設計 / 運用 / セキュリティ」の 5 視点で整理。公式ドキュメントと本の役割分担、資格対策書の位置づけまで、2026 年 8 月時点の定番書で AWS 独学のルートを解説します。