서론
쿠버네티스에는 pod, namespace, service, deployment, configMap, secret, ingress 등 엄청나게 많은 Object들이 존재합니다. Kubernetes를 사용하려면 꼭 알아야 할 Object들에 대해서 상세히 알아볼 겸 본 포스팅을 작성합니다.
본론
1. Pod
Pod란?
- 쿠버네티스에서 가장 작은 배포 단위(Unit)입니다.
- 하나 이상의 컨테이너가 모여서 동작하는 논리적인 집합체입니다.
- 일반적으로 하나의 Pod에는 하나의 주 컨테이너가 들어가지만, 사이드카 컨테이너(예: 로그 수집, 프록시 등)를 함께 두는 경우도 많습니다.
언제/어떻게 사용하나?
- 실제 애플리케이션을 컨테이너 단위로 배포하고 실행할 때 사용합니다.
- 로그 수집 에이전트나 모니터링 에이전트를 같이 배포해야 하는 경우, 사이드카 컨테이너를 추가해 하나의 Pod로 묶어 관리합니다.
- Pod 자체로는 잘 사용하지 않고, 보통은 Deployment나 ReplicaSet 등의 상위 오브젝트로 관리합니다.
예시
- nginx 웹 서버를 실행하는 컨테이너 1개와 로그 수집 에이전트(Fluentd 등)를 넣은 사이드카 컨테이너를 하나의 Pod로 구성하여 배포.
- DB 마이그레이션 작업이 필요한 컨테이너를 임시로 Pod로 띄워 사용하는 경우.
2. Namespace
Namespace란?
- 하나의 쿠버네티스 클러스터에서 리소스(오브젝트)들을 논리적으로 구분해주는 가상 공간입니다.
- 팀 간, 개발·테스트·프로덕션 환경 간 자원을 분리하여 관리하기 위해 사용합니다.
언제/어떻게 사용하나?
- 여러 환경을 한 클러스터에서 분리해 운용할 때, 예: dev, test, stage, prod 네임스페이스를 분리하여 관리.
- 서로 다른 프로젝트 팀이 하나의 쿠버네티스 클러스터를 공유할 때, 각 팀의 자원을 안전하게 분리하여 충돌을 방지하고 리소스 제한을 적용할 때.
예시
- 개발용 Namespace에서 자유롭게 테스트를 진행하고, 프로덕션용 Namespace에서만 실제 서비스를 운영.
- 다수의 프로젝트가 동시에 진행되는 대규모 조직에서, 프로젝트별 네임스페이스를 만들어 접근 권한과 리소스 쿼터를 설정함.
3. Service
Service란?
- 쿠버네티스 클러스터 내부 또는 외부에서 Pod(들)에 접근하기 위한 네트워킹 오브젝트입니다.
- Pod가 동적으로 생성·종료되어도 변하지 않는 고정된 엔드포인트(IP, DNS 등)를 제공합니다.
- 대표적으로 ClusterIP, NodePort, LoadBalancer 타입을 많이 사용합니다.
언제/어떻게 사용하나?
- 서비스 내부 컴포넌트들 간 통신 시, Pod의 IP가 바뀌어도 접근 경로가 유지되어야 할 때.
- 외부에서 HTTP/HTTPS 요청을 받아 특정 Pod로 분산시키고 싶을 때(주로 LoadBalancer 타입 사용).
- NodePort로 각 노드의 특정 포트를 열어 간단히 외부와 통신할 때.
예시
- ClusterIP 타입을 이용해 내부에서만 접근 가능한 DB 서비스나 내부 API 서비스 구성.
- ALB, NLB와 같은 클라우드 로드밸런서와 연동을 위해 LoadBalancer 타입의 서비스를 생성해 웹 트래픽 처리를 담당.
- 사설 환경에서 외부 로드밸런서 없이 NodePort를 활용해 임시 서비스 오픈.
4. Deployment
Deployment란?
- Pod와 ReplicaSet을 더욱 편리하게 관리하기 위한 쿠버네티스 오브젝트입니다.
- 선언형(Declarative)으로 원하는 스펙(컨테이너 이미지, Pod 개수 등)을 정의하고, Deployment가 ReplicaSet을 통해 Pod를 일관성 있게 유지합니다.
- 롤링 업데이트와 롤백 등, 애플리케이션 배포/업데이트 과정 전반을 책임집니다.
언제/어떻게 사용하나?
- 스케일링(확장/축소)을 간편하게 하고 싶을 때.
- 애플리케이션을 새 버전으로 무중단 업데이트(롤링 업데이트)하거나, 문제 발생 시 이전 버전으로 쉽게 되돌릴(롤백) 때.
- 지속적으로 업데이트가 필요한 웹/백엔드 애플리케이션을 구성할 때 일반적으로 사용합니다.
예시
- Java Spring Boot 웹 애플리케이션의 Pod 3개를 운영하려고 할 때, replicas: 3으로 설정하여 Deployment 생성.
- 최신 버전이 잘못 올라갔다면, 배포 이력을 이용해 간단히 이전 버전으로 롤백.
- 트래픽 증가로 인한 확장 시, replicas 수를 늘려 빠르게 스케일 아웃.
5. ConfigMap
ConfigMap이란?
- 애플리케이션에 필요한 환경 설정값(환경 변수, 설정 파일 등)을 분리하여 관리하는 오브젝트입니다.
- Pod 스펙과 분리해서 환경 설정을 관리함으로써, 이미지 재빌드 없이 설정만 교체할 수 있도록 해줍니다.
언제/어떻게 사용하나?
- 개발·테스트·프로덕션 환경별로 다른 설정을 사용해야 할 때, 이미지는 동일하게 두고 ConfigMap만 교체.
- 애플리케이션 설정 파일(예: application.properties)을 쿠버네티스 설정으로 관리하면서, 지속적인 설정 변경이 필요한 경우.
- 외부 서비스 Endpoint, 포트 번호, 기타 플래그 등 자주 바뀌는 설정 요소를 코드에서 분리하고 싶을 때.
예시
- Spring Boot 앱에서 DB 연결 정보를 application.properties 파일 대신 ConfigMap으로 관리.
- Nginx의 설정 파일(nginx.conf)을 ConfigMap에 저장 후, 여러 Pod에서 공통 설정을 공유.
- 다양한 API 엔드포인트 주소를 환경별로 분리하여 ConfigMap에 담고, Deployment에서는 해당 값을 참조.
6. Secret
Secret이란?
- ConfigMap과 유사한 형태지만, 민감한 정보를 안전하게 보관하기 위한 오브젝트입니다.
- 쿠버네티스 내부적으로 Base64 인코딩을 통해 저장되며, RBAC 설정 등을 통해 접근 제어가 이뤄집니다.
언제/어떻게 사용하나?
- 데이터베이스 비밀번호, API 키, 인증서, TLS 키 등 노출되면 안 되는 민감 정보를 관리할 때 사용합니다.
- Pod가 실행되면서 해당 Secret을 참조해 환경 변수나 볼륨 등으로 마운트해 사용.
- ConfigMap을 사용하기에는 민감도가 높은 경우 반드시 Secret 사용을 권장합니다.
예시
- 외부 서비스 연동을 위한 API 토큰을 Secret으로 관리하고, 필요한 Pod에서 환경 변수로 주입.
- TLS 인증서와 키를 Secret으로 관리하여 Ingress Controller 등에서 HTTPS 설정에 사용.
- DB 접속 정보를 Secret에 담아 Pod 실행 시 참조해 보안성을 강화.
7. Ingress
Ingress란?
- 쿠버네티스 클러스터 외부의 HTTP/HTTPS 트래픽을 내부 서비스(Pod)로 라우팅하기 위한 오브젝트입니다.
- L7(애플리케이션 레벨)에서 트래픽을 분산하고, 도메인 기반 라우팅, SSL/TLS 종료 등의 기능을 제공합니다.
- Ingress Controller(Nginx, HAProxy, Istio Gateway 등)가 실제 트래픽 처리를 맡으며, Ingress는 그 라우팅 규칙을 정의합니다.
언제/어떻게 사용하나?
- 여러 서비스가 각각 다른 경로나 서브도메인을 통해서 하나의 로드밸런서 IP/도메인을 공유하여 외부에 노출될 때.
- HTTPS 종단(TLS Termination)을 수행하고, 내부 트래픽은 HTTP로 라우팅하고 싶을 때.
- 경로(/api, /images 등)에 따라 서로 다른 서비스로 트래픽을 분산하여 API Gateways 역할을 간단히 대체할 때.
예시
- example.com 도메인을 통해 여러 백엔드 서비스를 연결: /api -> API 서비스, /auth -> 인증 서비스, /static -> 정적 파일 서비스 등.
- 클라우드 환경에서 Nginx Ingress Controller 설치 후, SSL 인증서를 Secret으로 관리하여 HTTPS(443) 트래픽 처리.
- Istio, Linkerd 등 Service Mesh 환경에서 Gateway(혹은 Ingress Controller)와 함께 내부 마이크로서비스로 트래픽 라우팅.
결론
쿠버네티스에는 정말 다양한 오브젝트들이 있고, 이 포스팅에서 다룬 Pod, Namespace, Service, Deployment, ConfigMap, Secret, Ingress는 가장 기초적이면서도 중요하게 다뤄지는 오브젝트들입니다.
- Pod: 하나 이상의 컨테이너가 동작하는 가장 작은 배포 단위로, 실제 실행 환경을 구성하는 기본 요소입니다.
- Namespace: 프로젝트나 환경을 논리적으로 구분할 수 있게 해주어 대규모 클러스터 운영 시 유용합니다.
- Service: 동적으로 생성·제거되는 Pod를 안정적으로 접근할 수 있는 네트워크 엔드포인트를 제공해 줍니다.
- Deployment: Pod와 ReplicaSet을 선언형으로 관리하여 롤링 업데이트, 롤백, 스케일링 등 중요한 배포 관련 기능을 간편하게 제공합니다.
- ConfigMap: 환경 설정 파일과 같은 비민감한 정보를 이미지와 분리하여 관리할 수 있습니다.
- Secret: 암호나 토큰, 인증서처럼 민감한 정보를 안전하게 관리하여 보안성을 높입니다.
- Ingress: 외부 트래픽을 내부 서비스로 라우팅하기 위한 L7 레벨의 설정을 정의합니다.
이상으로 쿠버네티스의 주요 오브젝트에 대해 알아보았습니다. 각 오브젝트가 어떤 역할을 맡고, 언제 어떻게 사용하는지 이해하면, 더욱 체계적이고 유연한 클라우드 네이티브 인프라 운영이 가능해집니다. 향후에는 여기서 소개한 기본 오브젝트들을 기반으로 StatefulSet, DaemonSet, Job, CronJob 등 더 다양한 리소스도 살펴보고, Helm, ArgoCD 등의 배포 자동화 툴과 연계해 확장하는 포스팅도 진행해보도록 하겠습니다.