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 환경을 보다 안전하고 효율적으로 관리할 수 있습니다.