Kubernetes의 네임스페이스 및 리소스 격리

1. 네임스페이스(Namespace)란?

Kubernetes에서 네임스페이스(Namespace)는 클러스터 내의 리소스를 논리적으로 분리하는 방법입니다. 여러 개의 팀이나 프로젝트가 하나의 클러스터를 공유할 때, 리소스를 효과적으로 관리하고 격리할 수 있도록 도와줍니다.

네임스페이스의 특징

  • 리소스 격리: 동일한 클러스터 내에서 다른 네임스페이스에 속한 리소스는 기본적으로 서로 격리됨
  • 이름 충돌 방지: 동일한 이름의 리소스를 여러 네임스페이스에서 운영 가능
  • 별도의 접근 제어: RBAC(Role-Based Access Control)과 결합하여 특정 네임스페이스에 대한 접근 권한을 설정 가능
  • 리소스 할당: 리소스 쿼터(Resource Quota)를 통해 네임스페이스별로 CPU, 메모리 등의 사용량 제한 가능

기본 네임스페이스

Kubernetes 클러스터에는 기본적으로 아래와 같은 네임스페이스가 존재합니다.

  • default: 네임스페이스를 지정하지 않은 경우 기본적으로 할당되는 네임스페이스
  • kube-system: Kubernetes의 내부 시스템 구성 요소(Pod, Service 등)가 위치하는 네임스페이스
  • kube-public: 클러스터 내에서 공개적으로 접근 가능한 리소스가 저장되는 네임스페이스
  • kube-node-lease: 노드 상태 정보를 저장하는 네임스페이스

2. 네임스페이스 사용법

네임스페이스 생성

kubectl create namespace my-namespace

특정 네임스페이스에서 리소스 배포

kubectl apply -f my-deployment.yaml --namespace=my-namespace

특정 네임스페이스에서 리소스 조회

kubectl get pods --namespace=my-namespace

네임스페이스 삭제

kubectl delete namespace my-namespace

3. 리소스 격리(Resource Isolation)

Kubernetes에서는 네임스페이스를 이용하여 리소스를 격리할 수 있으며, 추가적으로 다양한 기법을 활용하여 격리 수준을 강화할 수 있습니다.

3.1 리소스 할당 제한 (Resource Quotas)

리소스 쿼터(Resource Quotas)를 사용하면 특정 네임스페이스에서 사용할 수 있는 CPU, 메모리, 저장소 등을 제한할 수 있습니다.

예제: 네임스페이스 내 리소스 제한

apiVersion: v1
kind: ResourceQuota
metadata:
  name: my-quota
  namespace: my-namespace
spec:
  hard:
    pods: "10"  # 최대 10개의 Pod 생성 가능
    requests.cpu: "2"
    requests.memory: "4Gi"
    limits.cpu: "4"
    limits.memory: "8Gi"
kubectl apply -f resource-quota.yaml

3.2 네트워크 격리 (Network Policies)

네트워크 정책을 사용하면 특정 네임스페이스 내에서 Pod 간 트래픽을 제한할 수 있습니다.

예제: 특정 네임스페이스 내에서만 통신 가능하도록 설정

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-same-namespace
  namespace: my-namespace
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector: {}
kubectl apply -f network-policy.yaml

3.3 역할 기반 액세스 제어(RBAC)

RBAC를 사용하면 네임스페이스별로 특정 리소스에 대한 접근 권한을 제한할 수 있습니다.

예제: 특정 네임스페이스에 대한 읽기 전용 접근 권한 부여

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: my-namespace
  name: read-only-role
rules:
- apiGroups: [""]
  resources: ["pods", "services", "deployments"]
  verbs: ["get", "list", "watch"]
kubectl apply -f role.yaml

4. 결론

네임스페이스와 리소스 격리는 Kubernetes 클러스터를 다중 테넌트 환경에서 효과적으로 운영하는 데 중요한 역할을 합니다. 네임스페이스를 사용하여 논리적으로 리소스를 분리하고, RBAC, 네트워크 정책, 리소스 쿼터 등을 활용하여 보안과 성능을 보장할 수 있습니다. 이러한 기능을 적절히 조합하여 Kubernetes 환경을 보다 안전하고 효율적으로 관리할 수 있습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다