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 のリソースにアクセスする可能性がある。強い分離が必要な場合は、クラスターを分ける。

現場での応用を知るには関連書籍も役立つ。

関連用語