이 글은 <Certificated Kubernetes Administrator (CKA) with Practice Test, Mumshad Mannambeth, Kode Kloud Training> 섹션 2. Core concepts를 참고하여 작성하였습니다.
[CKA with Practice Tests] Section 2. Core concepts - (11) Namespace
이번 블로그 포스트에서는 Kubernetes 네임스페이스에 대해 알아보겠습니다.
What is Namespace
Kubernetes에서 네임스페이스는 리소스를 그룹화하고 관리하기 위한 논리적 구획입니다. 예를 들어, 동일한 이름을 가진 세 개의 리소스, ‘파란 동그라미’가 있다고 가정해봅시다. 하나의 클러스터에 덩그러니 파란 동그라미들만 있다면 각각을 구분하기 힘들겠죠. 각 동그라미를 구분하기 위해 각 동그라미가 있을 구역을 정해주는 것이 네임스페이스의 역할입니다.
Kubernetes의 기본 네임스페이스
쿠버네티스 클러스터가 처음 설정되면, Kubernetes는 몇 가지 기본 네임스페이스를 자동으로 생성합니다:
- default: 사용자가 특별히 네임스페이스를 지정하지 않는 한, 모든 리소스는 기본적으로 이 네임스페이스에 생성됩니다.
- kube-system: 쿠버네티스 시스템 관련 리소스가 위치하는 네임스페이스입니다. 주로 네트워킹 솔루션이나 DNS 서비스 같은 내부 리소스가 여기에 포함됩니다.
- kube-public: 공개적으로 접근 가능한 리소스가 위치합니다. 이 네임스페이스는 모든 사용자가 접근할 수 있도록 설계되었습니다.
작은 규모의 개발 환경에서는 기본 네임스페이스만으로 충분할 수 있지만, 대규모 프로덕션 환경에서는, "서비스의 연관성, 의존성, 관리 요구 사항"에 따라 네임스페이스를 적절히 분리하고 관리하는 것이 매우 중요합니다.
네임스페이스 장점
- 리소스 격리 및 분리: 각 팀에게 별도의 네임스페이스를 할당함으로써 리소스를 분리하고 작업을 독립적으로 진행할 수 있습니다.
- 자원 할당 관리: 네임스페이스별로 리소스 할당량(Resource Quota)과 사용 제한(LimitRange)을 설정하여, 각 네임스페이스가 사용할 수 있는 CPU, 메모리, 포드 수 등을 제어할 수 있습니다. 이를 통해 클러스터 자원을 효율적으로 관리하고, 특정 네임스페이스가 과도한 자원을 사용하지 않도록 할 수 있습니다.
DNS
Kubernetes는 각 네임스페이스 내에서 생성된 서비스에 대해 고유한 DNS 레코드를 자동으로 생성합니다. 이를 통해
- 같은 네임스페이스 내에서 리소스들은 간단한 서비스 이름만으로 서로 통신할 수 있습니다. 예를 들어, default 네임스페이스에 web-service라는 이름의 서비스가 있다면, 같은 네임스페이스 내의 다른 포드는 단순히 web-service라는 이름만으로 이 서비스에 접근할 수 있습니다.
- 다른 네임스페이스에 있는 서비스에 접근하려면, DNS 이름에 네임스페이스 이름을 포함해야 합니다. 예를 들어, development 네임스페이스에 있는 db-service에 접근하려면 db-service.development.svc.cluster.local이라는 DNS 이름을 사용해야 합니다.
DNS 서브도메인 구조
<service-name>.<namespace>.svc.cluster.local
Useful Commands
# 특정 namespace에서 pod 조회하고 생성하기
kubectl get pods --namespace=dev
kubectl create -f pod-definition.yml --namespace=dev
# 네임스페이스 생성하기
kubectl create namespace dev
# Default 네임스페이스 바꾸기
# dev 네임스페이스를 디폴트 네임스페이스로 바꾸고 싶다
kubectl config set-config $(kubectl config current-context) --namespace=dev
# 네임스페이스 자원 제한하기
kubectl create -f compute-quota.yaml
# compute-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: dev
spec:
hard:
pods: "10"
requests.cpu: "4"
requests.memory: 5Gi
limits.cpu: "10"
limits.memory: 10Gi