Kubernetes Namespace
Kubernetes クラスター内のリソースを論理的に分離し、マルチテナントやチーム間の境界を設ける仕組み
Kubernetesコンテナ
Kubernetes Namespace とは
Namespace は、Kubernetes クラスター内のリソースを論理的に分離する仕組みである。1 つのクラスターを複数の仮想クラスターのように使い分けられる。環境 (dev/stg/prod)、チーム、アプリケーションごとに Namespace を分けるのが一般的だ。
基本的な使い方
# Namespace の作成
kubectl create namespace production
kubectl create namespace staging
# Namespace を指定してリソースを操作
kubectl get pods -n production
kubectl apply -f deployment.yaml -n production
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
env: production
team: backend
デフォルトの Namespace
| Namespace | 用途 |
|---|---|
default |
Namespace を指定しない場合のデフォルト |
kube-system |
Kubernetes システムコンポーネント (CoreDNS, kube-proxy) |
kube-public |
全ユーザーが読み取り可能な公開リソース |
kube-node-lease |
ノードのハートビート |
default Namespace にアプリケーションを配置するのは避ける。明示的に Namespace を作成し、リソースを整理する。
Namespace の分割パターン
環境ごと (小規模チーム)
namespace: development
namespace: staging
namespace: production
チームごと (中〜大規模)
namespace: team-backend
namespace: team-frontend
namespace: team-data
アプリケーションごと
namespace: order-service
namespace: payment-service
namespace: notification-service
RBAC による Namespace レベルのアクセス制御
# backend チームに production Namespace の読み取り権限を付与
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: backend-readonly
namespace: production
subjects:
- kind: Group
name: backend-team
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
ResourceQuota でリソース制限
Namespace ごとに CPU、メモリ、Pod 数の上限を設定し、1 つの Namespace がクラスター全体のリソースを占有するのを防ぐ。
apiVersion: v1
kind: ResourceQuota
metadata:
name: production-quota
namespace: production
spec:
hard:
requests.cpu: "10"
requests.memory: 20Gi
limits.cpu: "20"
limits.memory: 40Gi
pods: "50"
NetworkPolicy による通信制御
デフォルトでは全 Namespace 間の通信が許可されている。NetworkPolicy で Namespace 間の通信を制限する。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-from-other-namespaces
namespace: production
spec:
podSelector: {}
ingress:
- from:
- podSelector: {} # 同じ Namespace 内からのみ許可
Namespace はセキュリティ境界ではない
Namespace は論理的な分離であり、セキュリティ境界ではない。悪意のある Pod が他の Namespace のリソースにアクセスする可能性がある。強い分離が必要な場合は、クラスターを分ける。
現場での応用を知るには関連書籍も役立つ。