서론
쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 강력한 플랫폼입니다. 대규모 클러스터를 운영할 때, 네임스페이스(Namespace)를 사용하여 리소스를 논리적으로 분리하고 관리할 수 있습니다. 네임스페이스는 여러 팀이나 프로젝트가 동일한 쿠버네티스 클러스터를 공유할 때 특히 유용합니다. 이번 포스팅에서는 네임스페이스의 개념과 활용 방법을 초보자도 이해할 수 있도록 자세히 설명합니다.
본론
네임스페이스 개념
네임스페이스란 무엇인가?
네임스페이스는 쿠버네티스 클러스터 내에서 리소스를 논리적으로 분리하는 방법입니다. 각 네임스페이스는 독립된 환경을 제공하여, 리소스 간의 충돌을 방지하고 관리의 편의성을 높입니다. 네임스페이스를 사용하면 다음과 같은 이점이 있습니다.
- 리소스 격리: 서로 다른 프로젝트나 팀의 리소스를 분리하여 관리할 수 있습니다.
- 이름 충돌 방지: 동일한 이름을 가진 리소스가 서로 다른 네임스페이스에 존재할 수 있습니다.
- 정책 적용: 네임스페이스 단위로 리소스 제한, 접근 제어 등의 정책을 적용할 수 있습니다.
네임스페이스 기본 사용법
네임스페이스 생성
네임스페이스를 생성하려면 YAML 파일을 사용하거나 kubectl
명령어를 사용할 수 있습니다.
YAML 파일을 사용하여 네임스페이스 생성
다음은 네임스페이스를 생성하는 YAML 파일 예시입니다.
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
이 파일을 사용하여 네임스페이스를 생성하려면 다음 명령어를 실행합니다.
kubectl apply -f my-namespace.yaml
kubectl 명령어를 사용하여 네임스페이스 생성
명령어를 사용하여 네임스페이스를 생성할 수도 있습니다.
kubectl create namespace my-namespace
네임스페이스 조회
현재 클러스터 내의 모든 네임스페이스를 조회하려면 다음 명령어를 사용합니다.
kubectl get namespaces
네임스페이스 삭제
특정 네임스페이스를 삭제하려면 다음 명령어를 사용합니다.
kubectl delete namespace my-namespace
네임스페이스 내 리소스 관리
네임스페이스 내 파드 생성
네임스페이스 내에서 리소스를 생성하려면 YAML 파일에 네임스페이스를 명시하거나 kubectl
명령어를 사용할 때 -n
플래그를 사용합니다.
YAML 파일에 네임스페이스 명시
다음은 네임스페이스 내에서 파드를 생성하는 YAML 파일 예시입니다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: my-namespace
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 80
이 파일을 사용하여 파드를 생성하려면 다음 명령어를 실행합니다.
kubectl apply -f my-pod.yaml
kubectl 명령어에 -n 플래그 사용
명령어를 사용하여 네임스페이스 내에서 파드를 생성할 수도 있습니다.
kubectl run my-pod --image=nginx --port=80 -n my-namespace
네임스페이스 내 리소스 조회
특정 네임스페이스 내의 리소스를 조회하려면 -n
플래그를 사용합니다.
kubectl get pods -n my-namespace
네임스페이스 내 리소스 삭제
특정 네임스페이스 내의 리소스를 삭제하려면 -n
플래그를 사용합니다.
kubectl delete pod my-pod -n my-namespace
네임스페이스 활용 방법
프로젝트별 네임스페이스 관리
대규모 클러스터에서 여러 프로젝트를 관리할 때 각 프로젝트별로 네임스페이스를 생성하여 리소스를 분리할 수 있습니다. 예를 들어, project-a
와 project-b
라는 두 개의 프로젝트가 있다면 다음과 같이 네임스페이스를 생성할 수 있습니다.
kubectl create namespace project-a
kubectl create namespace project-b
각 프로젝트의 리소스는 해당 네임스페이스 내에서 관리됩니다. 이렇게 하면 리소스 간의 충돌을 방지하고, 각 프로젝트에 대한 접근 제어를 쉽게 설정할 수 있습니다.
팀별 네임스페이스 관리
여러 팀이 하나의 클러스터를 공유할 때 각 팀별로 네임스페이스를 생성하여 리소스를 관리할 수 있습니다. 예를 들어, team-dev
와 team-qa
라는 두 개의 팀이 있다면 다음과 같이 네임스페이스를 생성할 수 있습니다.
kubectl create namespace team-dev
kubectl create namespace team-qa
각 팀의 리소스는 해당 네임스페이스 내에서 관리되며, 팀별로 독립적인 개발 및 테스트 환경을 제공할 수 있습니다.
리소스 제한 및 할당
네임스페이스를 사용하여 리소스 제한 및 할당을 설정할 수 있습니다. 예를 들어, 네임스페이스별로 CPU와 메모리 사용량을 제한할 수 있습니다.
다음은 리소스 제한을 설정하는 YAML 파일 예시입니다.
apiVersion: v1
kind: ResourceQuota
metadata:
name: cpu-mem-limits
namespace: my-namespace
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
이 파일을 사용하여 리소스 제한을 설정하려면 다음 명령어를 실행합니다.
kubectl apply -f resource-quota.yaml
네임스페이스 간 통신
기본적으로 네임스페이스 간의 네트워크 통신은 허용됩니다. 그러나 네트워크 정책(Network Policy)을 사용하여 네임스페이스 간의 통신을 제한할 수 있습니다. 네트워크 정책은 특정 네임스페이스 내의 파드가 다른 네임스페이스의 파드와 통신할 수 있는지 여부를 정의합니다.
다음은 네트워크 정책을 설정하는 YAML 파일 예시입니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-other-namespaces
namespace: my-namespace
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: my-namespace
egress:
- to:
- namespaceSelector:
matchLabels:
name: my-namespace
이 파일을 사용하여 네트워크 정책을 설정하려면 다음 명령어를 실행합니다.
kubectl apply -f network-policy.yaml
네임스페이스 모니터링 및 로깅
네임스페이스를 모니터링하고 로깅하는 것은 클러스터 관리의 중요한 부분입니다. 네임스페이스별로 리소스 사용량을 모니터링하고, 로그를 수집하여 분석할 수 있습니다.
모니터링 도구
Prometheus와 Grafana는 쿠버네티스 클러스터의 모니터링을 위해 널리 사용되는 도구입니다. Prometheus는 클러스터의 메트릭을 수집하고, Grafana는 이를 시각화하여 제공합니다. 네임스페이스별로 리소스 사용량을 모니터링할 수 있습니다.
로깅 도구
EFK 스택(Elasticsearch, Fluentd, Kibana)은 쿠버네티스 클러스터의 로그 수집 및 분석을 위한 도구입니다. Fluentd는 로그를 수집하여 Elasticsearch에 저장하고, Kibana는 이를 시각화하여 제공합니다. 네임스페이스별로 로그를 분석할 수 있습니다.
결론
쿠버네티스 네임스페이스는 대규모 클러스터를 관리할 때 매우 유용한 기능입니다. 네임스페이스를 사용하면 리소스를 논리적으로 분리하고, 프로젝트나 팀별로 독립적인 환경을 제공할 수 있습니다. 또한, 리소스 제한, 접근 제어, 네트워크 정책 등을 네임스페이스 단위로 설정할 수 있어 관리의 편의성을 높일 수 있습니다. 이번 포스팅에서는 네임스페이스의 개념과 기본 사용법, 활용 방법을 자세히 설명했습니다. 이를 통해 네임스페이스를 효과적으로 활용하여 쿠버네티스 클러스터를 관리할 수 있기를 바랍니다.