시작하며

쿠버네티스 클러스터를 운영하다 보면 여러 팀이나 환경(개발/스테이징/운영)을 하나의 클러스터에서 관리해야 하는 경우가 생긴다. 이를 위해 쿠버네티스는 Namespace라는 논리적 격리 단위를 제공한다. 또한 애플리케이션 설정값을 YAML 파일과 분리하기 위한 ConfigMap과 Secret 오브젝트도 제공한다.
Namespace와 설정 오브젝트
Namespace — 리소스를 구분하는 장벽
Namespace는 리소스들을 논리적으로 구분하기 위해 사용한다. Pod, ReplicaSet, Deployment, Service와 같은 쿠버네티스 리소스들이 묶여 있는 가상의 공간이라고 이해하면 된다.
기본 Namespace
default: 별도 지정이 없을 때 사용되는 기본 네임스페이스kube-system: 쿠버네티스 클러스터 구성에 필수적인 컴포넌트들과 설정값kube-public등
단, 각 네임스페이스의 리소스들은 논리적으로만 구분된 것이며 물리적으로 격리된 것은 아니다.
Info
리눅스 네임스페이스와는 완전히 다른 개념이다. 리눅스 네임스페이스는 컨테이너의 격리된 공간을 생성하기 위해 리눅스 커널의 자체 기능을 활용하는 것이며, 네트워크·마운트·프로세스 네임스페이스를 의미한다.
Namespace 사용하기
# yaml 파일에 namespace 항목을 명시하거나
kubectl create namespace production다른 Namespace의 Service에 접근하기
다른 네임스페이스에 존재하는 서비스는 서비스 이름만으로 접근할 수 없다. 서비스 이름 뒤에 네임스페이스 이름을 붙이면 접근이 가능하다.
<서비스명>.<네임스페이스명>.svc.cluster.local
네임스페이스 종속 여부
모든 오브젝트가 네임스페이스에 종속되는 것은 아니다. 노드와 같은 오브젝트들은 네임스페이스에 의해 구분되지 않는다.
ConfigMap — 일반 설정값을 포드로
쿠버네티스에서는 YAML 파일과 설정값을 분리할 수 있는 ConfigMap과 Secret 오브젝트를 제공한다.
ConfigMap은 일반적인 설정값을 담아 저장할 수 있는 쿠버네티스 오브젝트다. 사용 방식은 다음과 같다.
- 컨피그맵의 값을 컨테이너의 환경변수로 사용
- 컨피그맵의 값을 포드 내부의 파일로 마운트해 사용
- 컨피그맵의 데이터를 컨테이너의 환경변수로 가져옴
- 컨피그맵의 내용을 파일로 포드 내부에 마운트해서 사용
Secret — 민감한 정보를 위한 오브젝트
SSH 키, 비밀번호와 같이 민감한 정보를 저장하기 위한 용도로 사용된다. 네임스페이스에 종속되는 쿠버네티스 오브젝트이며, 저장 시 base64로 인코딩된다.
정리하며
Namespace는 하나의 클러스터에서 여러 팀이나 환경을 논리적으로 격리하는 핵심 수단이다. ConfigMap과 Secret을 활용하면 애플리케이션 설정값을 YAML 파일과 분리하여 관리할 수 있고, 이를 통해 동일한 컨테이너 이미지를 환경에 따라 다르게 동작시킬 수 있다. 특히 Secret은 민감한 정보를 코드나 YAML 파일에 직접 노출하지 않기 위한 필수 오브젝트이다.