jongkwan.dev
개발 · Essay №021

Kubernetes 핵심 개념 정리

Pod, Deployment, 네임스페이스 등 Kubernetes 핵심 개념과 컨테이너 오케스트레이션 기초

이종관2025년 10월 25일7 min read
Contents

쿠버네티스는 여러 컨테이너를 자동으로 배포·확장·복구하는 컨테이너 오케스트레이션 플랫폼이다.

컨테이너 하나를 띄우는 일과 수백 개를 운영하는 일은 다른 문제다. 이 글은 Pod, Service, Deployment 같은 핵심 오브젝트와 클러스터 아키텍처를 정리한다.

컨테이너화 vs 컨테이너 오케스트레이션

컨테이너화 (Containerization)

애플리케이션과 의존성을 하나의 이미지로 패키징하여 어떤 환경에서도 일관되게 동작하도록 하는 기술이다.

특성설명
이식성개발/테스트/프로덕션 환경 차이 최소화
격리성독립적 실행 환경, 다른 서비스와 간섭 없음
경량성VM 대비 자원 소모 적고, 빠른 시작/종료

컨테이너 오케스트레이션

여러 컨테이너를 자동으로 배포, 관리, 확장, 업데이트 및 모니터링하는 기술이다.

  • 자동화: 수백 개의 컨테이너 반복 작업 자동화
  • 자동 스케일링: 트래픽 변화에 따라 컨테이너 수 자동 조절
  • 롤링 업데이트: 단계별 업데이트 후 문제 시 롤백
  • 셀프-힐링: 비정상 컨테이너 자동 재시작

오케스트레이션의 필요성

수동 관리의 문제점:

  • 수십~수백 개 컨테이너 모니터링 불가능
  • 트래픽 변화에 실시간 대응 어려움
  • 장애 복구 시간 증가
  • 운영 비용 및 오류 가능성 증가

쿠버네티스의 역할

원하는 상태를 YAML로 선언하면, 쿠버네티스가 현재 상태를 그 선언과 맞추도록 자동으로 조정한다. 운영자가 개별 컨테이너를 직접 다루는 대신 목표 상태만 기술하는 방식이다.

기능설명
자동 배포/확장YAML로 정의한 상태 자동 유지
서비스 디스커버리동적 IP에도 고정 엔드포인트 제공
로드 밸런싱트래픽 균등 분산
자원 관리CPU/메모리 효율적 분배
이식성온프레미스/클라우드 동일 운영

쿠버네티스 아키텍처

제어 플레인 (Master)

컴포넌트역할
API Server클러스터의 유일한 API 접점
Controller현재 상태와 원하는 상태를 동기화
Scheduler새 Pod를 배치할 노드를 선택
etcd클러스터 상태를 저장하는 분산 Key-Value 저장소

워커 노드

컴포넌트역할
kubelet제어 플레인과 통신하며 Pod 상태 유지
kube-proxyService 네트워크 프록시 및 로드밸런싱 처리
Container Runtime실제 컨테이너 실행 (containerd, CRI-O 등)

핵심 오브젝트

Pod

쿠버네티스의 최소 배포 단위이다.

  • 하나 이상의 컨테이너 포함
  • 동일 네트워크 네임스페이스 공유
  • 같은 스토리지 볼륨 공유 가능
  • 일시적(Ephemeral) 특성
yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: app
    image: nginx:latest
    ports:
    - containerPort: 80

apiVersionkind는 오브젝트의 종류와 스키마 버전을 지정한다. spec.containers에는 Pod가 실행할 컨테이너 목록을, containerPort에는 컨테이너가 노출하는 포트를 적는다.

Service

Pod 집합에 대한 고정된 네트워크 엔드포인트를 제공한다.

타입설명
ClusterIP클러스터 내부 전용 (기본값)
NodePort노드 포트로 외부 접근
LoadBalancer클라우드 LB 연동
yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
  type: ClusterIP

selectorapp: my-app 라벨이 붙은 Pod를 묶어 트래픽 대상으로 삼는다. port는 Service가 받는 포트, targetPort는 그 트래픽을 전달할 Pod 쪽 포트다. 둘이 달라도 되며, Service가 포트를 변환해 준다.

Deployment

Pod의 선언적 업데이트를 관리한다.

  • 롤링 업데이트 지원
  • 롤백 기능
  • 스케일링
yaml
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:v1

replicas는 유지할 Pod 개수다. selector.matchLabels는 Deployment가 관리할 Pod를 식별하고, template은 그 Pod를 어떤 모양으로 생성할지 정의한다. template의 라벨과 matchLabels가 일치해야 Deployment가 Pod를 자기 것으로 인식한다.

kubectl 기본 명령어

bash
# 클러스터 정보
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) 보안 설정은 프로덕션 클러스터 운영의 다음 단계에 해당한다.