Kubernetes 핵심 개념 정리
Pod, Deployment, 네임스페이스 등 Kubernetes 핵심 개념과 컨테이너 오케스트레이션 기초
Contents
쿠버네티스는 여러 컨테이너를 자동으로 배포·확장·복구하는 컨테이너 오케스트레이션 플랫폼이다.
컨테이너 하나를 띄우는 일과 수백 개를 운영하는 일은 다른 문제다. 이 글은 Pod, Service, Deployment 같은 핵심 오브젝트와 클러스터 아키텍처를 정리한다.
컨테이너화 vs 컨테이너 오케스트레이션
컨테이너화 (Containerization)
애플리케이션과 의존성을 하나의 이미지로 패키징하여 어떤 환경에서도 일관되게 동작하도록 하는 기술이다.
| 특성 | 설명 |
|---|---|
| 이식성 | 개발/테스트/프로덕션 환경 차이 최소화 |
| 격리성 | 독립적 실행 환경, 다른 서비스와 간섭 없음 |
| 경량성 | VM 대비 자원 소모 적고, 빠른 시작/종료 |
컨테이너 오케스트레이션
여러 컨테이너를 자동으로 배포, 관리, 확장, 업데이트 및 모니터링하는 기술이다.
- 자동화: 수백 개의 컨테이너 반복 작업 자동화
- 자동 스케일링: 트래픽 변화에 따라 컨테이너 수 자동 조절
- 롤링 업데이트: 단계별 업데이트 후 문제 시 롤백
- 셀프-힐링: 비정상 컨테이너 자동 재시작
오케스트레이션의 필요성
수동 관리의 문제점:
- 수십~수백 개 컨테이너 모니터링 불가능
- 트래픽 변화에 실시간 대응 어려움
- 장애 복구 시간 증가
- 운영 비용 및 오류 가능성 증가
쿠버네티스의 역할
원하는 상태를 YAML로 선언하면, 쿠버네티스가 현재 상태를 그 선언과 맞추도록 자동으로 조정한다. 운영자가 개별 컨테이너를 직접 다루는 대신 목표 상태만 기술하는 방식이다.
| 기능 | 설명 |
|---|---|
| 자동 배포/확장 | YAML로 정의한 상태 자동 유지 |
| 서비스 디스커버리 | 동적 IP에도 고정 엔드포인트 제공 |
| 로드 밸런싱 | 트래픽 균등 분산 |
| 자원 관리 | CPU/메모리 효율적 분배 |
| 이식성 | 온프레미스/클라우드 동일 운영 |
쿠버네티스 아키텍처
제어 플레인 (Master)
| 컴포넌트 | 역할 |
|---|---|
| API Server | 클러스터의 유일한 API 접점 |
| Controller | 현재 상태와 원하는 상태를 동기화 |
| Scheduler | 새 Pod를 배치할 노드를 선택 |
| etcd | 클러스터 상태를 저장하는 분산 Key-Value 저장소 |
워커 노드
| 컴포넌트 | 역할 |
|---|---|
| kubelet | 제어 플레인과 통신하며 Pod 상태 유지 |
| kube-proxy | Service 네트워크 프록시 및 로드밸런싱 처리 |
| Container Runtime | 실제 컨테이너 실행 (containerd, CRI-O 등) |
핵심 오브젝트
Pod
쿠버네티스의 최소 배포 단위이다.
- 하나 이상의 컨테이너 포함
- 동일 네트워크 네임스페이스 공유
- 같은 스토리지 볼륨 공유 가능
- 일시적(Ephemeral) 특성
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: nginx:latest
ports:
- containerPort: 80apiVersion과 kind는 오브젝트의 종류와 스키마 버전을 지정한다. spec.containers에는 Pod가 실행할 컨테이너 목록을, containerPort에는 컨테이너가 노출하는 포트를 적는다.
Service
Pod 집합에 대한 고정된 네트워크 엔드포인트를 제공한다.
| 타입 | 설명 |
|---|---|
| ClusterIP | 클러스터 내부 전용 (기본값) |
| NodePort | 노드 포트로 외부 접근 |
| LoadBalancer | 클라우드 LB 연동 |
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
type: ClusterIPselector는 app: my-app 라벨이 붙은 Pod를 묶어 트래픽 대상으로 삼는다. port는 Service가 받는 포트, targetPort는 그 트래픽을 전달할 Pod 쪽 포트다. 둘이 달라도 되며, Service가 포트를 변환해 준다.
Deployment
Pod의 선언적 업데이트를 관리한다.
- 롤링 업데이트 지원
- 롤백 기능
- 스케일링
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: my-app:v1replicas는 유지할 Pod 개수다. selector.matchLabels는 Deployment가 관리할 Pod를 식별하고, template은 그 Pod를 어떤 모양으로 생성할지 정의한다. template의 라벨과 matchLabels가 일치해야 Deployment가 Pod를 자기 것으로 인식한다.
kubectl 기본 명령어
# 클러스터 정보
kubectl cluster-info
# 리소스 조회
kubectl get pods
kubectl get services
kubectl get deployments
# 리소스 상세 정보
kubectl describe pod <pod-name>
# 로그 확인
kubectl logs <pod-name>
# 배포
kubectl apply -f deployment.yaml
# 스케일링
kubectl scale deployment my-deployment --replicas=5
# 롤백
kubectl rollout undo deployment my-deployment정리
쿠버네티스는 컨테이너 오케스트레이션의 사실상 표준(de facto standard)이다. Pod는 최소 배포 단위이고, Service는 동적으로 바뀌는 Pod 앞에 고정된 네트워크 엔드포인트를 제공한다. Deployment는 원하는 Pod 상태를 선언적으로 관리하며 롤링 업데이트와 롤백을 담당한다. 클러스터는 상태를 결정하는 제어 플레인과 실제 컨테이너를 실행하는 워커 노드로 나뉜다. 네트워킹 정책, 스토리지 프로비저닝, RBAC(Role-Based Access Control) 보안 설정은 프로덕션 클러스터 운영의 다음 단계에 해당한다.