네임스페이스 관리

Kubernetes 리소스 격리와 멀티테넌시를 위한 네임스페이스 완벽 가이드


Kubernetes 리소스 격리와 멀티테넌시를 위한 네임스페이스 완벽 가이드

목표: 팀/환경별 격리와 리소스 제한을 구현할 수 있는 수준


🏗️ 네임스페이스 개념

graph TB
    subgraph "Cluster"
        subgraph "production"
            P1[Pod]
            P2[Service]
            P3[Deployment]
        end
        
        subgraph "development"
            D1[Pod]
            D2[Service]
            D3[Deployment]
        end
        
        subgraph "kube-system"
            K1[CoreDNS]
            K2[kube-proxy]
            K3[metrics-server]
        end
    end
    
    P1 -.->|"격리"| D1

네임스페이스는 가상 클러스터입니다.

  • 같은 네임스페이스 내: Service 이름으로 통신
  • 다른 네임스페이스: service-name.namespace.svc.cluster.local

📋 기본 명령어

# 네임스페이스 목록
kubectl get namespaces
kubectl get ns

# 네임스페이스 생성
kubectl create namespace development
kubectl create ns dev

# 네임스페이스 삭제 (내부 리소스 포함)
kubectl delete namespace development

# 현재 컨텍스트의 네임스페이스 확인
kubectl config get-contexts

# 기본 네임스페이스 변경
kubectl config set-context --current --namespace=development

# 모든 네임스페이스의 리소스 보기
kubectl get pods --all-namespaces
kubectl get pods -A

🎯 주요 네임스페이스

네임스페이스용도설명
default기본리소스 지정 없을 때 사용
kube-system시스템Kubernetes 시스템 컴포넌트
kube-public공개모든 사용자가 읽을 수 있는 리소스
kube-node-lease노드노드 하트비트 (Lease)

🛡️ 리소스 쿼터 (ResourceQuota)

네임스페이스 전체 리소스 제한

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: development
spec:
  hard:
    # CPU/메모리
    requests.cpu: "10"
    requests.memory: 20Gi
    limits.cpu: "20"
    limits.memory: 40Gi
    
    # 스토리지
    requests.storage: 100Gi
    persistentvolumeclaims: "10"
    
    # 오브젝트 수
    pods: "20"
    services: "10"
    secrets: "10"
    configmaps: "10"
    deployments.apps: "10"
# 적용
kubectl apply -f resourcequota.yaml

# 사용량 확인
kubectl get resourcequota -n development
kubectl describe resourcequota compute-quota -n development

⚖️ LimitRange

Pod/컨테이너 기본값 및 제한

apiVersion: v1
kind: LimitRange
metadata:
  name: default-limits
  namespace: development
spec:
  limits:
  - default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "100m"
      memory: "128Mi"
    max:
      cpu: "2"
      memory: "2Gi"
    min:
      cpu: "50m"
      memory: "64Mi"
    type: Container

동작:

  • default: limits 미지정 시 적용
  • defaultRequest: requests 미지정 시 적용
  • max/min: 상한/하한 강제

🔐 네트워크 격리 (NetworkPolicy)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: development
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
# development → production 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-dev
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: api
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          env: development

📋 체크리스트

  • 네임스페이스 생성/삭제
  • ResourceQuota 설정
  • LimitRange 설정
  • 네트워크 격리 (NetworkPolicy)
  • 리소스 사용량 모니터링
  • 멀티테넌시 설계

🔗 관련 노트

  • 01-06-Service-타입 — 서비스 노출
  • 02-04-NetworkPolicy — 네트워크 보안
  • 02-09-RBAC-설정 — 권한 관리

마지막 업데이트: 2026-06-01