Docker로 컨테이너를 만드는 것은 어렵지 않습니다. 하지만 그 컨테이너가 100개, 1,000개가 되면 이야기가 달라집니다. 어느 서버에 올릴지, 장애가 나면 자동으로 재시작할지, 트래픽이 몰릴 때 자동으로 늘릴지 — 이런 문제를 다루는 것이 컨테이너 오케스트레이션입니다. Kubernetes(K8s)는 그 표준으로 자리 잡은 오픈소스 플랫폼입니다. 2026년 현재 AWS EKS, Google GKE, Azure AKS 모두 K8s를 기반으로 하고, 사실상 클라우드 네이티브 인프라의 공통 언어가 됐습니다.
# Pod 생성kubectl apply -f pod.yaml
# Pod 목록 확인kubectl get pods
# Pod 상세 정보kubectl describe pod nginx-pod
# Pod 로그 확인kubectl logs nginx-pod
# Pod 내부 접속kubectl exec -it nginx-pod -- /bin/bash
# Pod 삭제kubectl delete pod nginx-pod
실무에서 Pod를 직접 생성하는 경우는 드뭅니다. 대부분 Deployment를 통해 Pod를 관리합니다. Pod를 직접 생성하면 죽었을 때 자동으로 재시작되지 않기 때문입니다.
# deployment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentlabels:app:nginxspec:replicas:3# Pod 개수 선언selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:- name:nginximage:nginx:1.25ports:- containerPort:80readinessProbe:# 준비 완료 확인httpGet:path:/port:80initialDelaySeconds:5periodSeconds:5livenessProbe:# 살아있는지 확인httpGet:path:/port:80initialDelaySeconds:15periodSeconds:20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Deployment 생성kubectl apply -f deployment.yaml
# Deployment 확인kubectl get deployments
kubectl get pods # nginx-deployment-xxxxx 형태로 3개 생성됨# 이미지 업데이트 (롤링 업데이트)kubectl set image deployment/nginx-deployment nginx=nginx:1.26
# 업데이트 진행 상황 확인kubectl rollout status deployment/nginx-deployment
# 이전 버전으로 롤백kubectl rollout undo deployment/nginx-deployment
# Pod 개수 조정 (스케일링)kubectl scale deployment nginx-deployment --replicas=5
readinessProbe와 livenessProbe는 실무에서 반드시 설정해야 합니다. readinessProbe가 있어야 새 Pod가 실제로 요청을 받을 준비가 됐을 때만 트래픽을 받습니다. livenessProbe는 Pod가 정상 동작 중인지 주기적으로 확인해서, 응답하지 않으면 자동으로 재시작합니다.
Pod는 생성될 때마다 IP가 바뀝니다. Service는 Pod들 앞에 고정된 엔드포인트를 제공하고, 요청을 분산합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
# service.yamlapiVersion:v1kind:Servicemetadata:name:nginx-servicespec:selector:app:nginx # 이 레이블을 가진 Pod들로 트래픽 분산ports:- protocol:TCPport:80# Service가 노출하는 포트targetPort:80# Pod의 포트type:ClusterIP # 클러스터 내부에서만 접근 가능
Service type에 따라 접근 방식이 달라집니다.
타입
설명
사용 사례
ClusterIP
클러스터 내부에서만 접근 가능
마이크로서비스 간 통신
NodePort
각 노드의 특정 포트로 외부 접근
개발/테스트 환경
LoadBalancer
클라우드 로드밸런서 자동 생성
프로덕션 외부 노출
ExternalName
외부 DNS 이름으로 매핑
외부 서비스 연결
1
2
3
4
5
6
7
8
9
10
11
12
# Service 생성kubectl apply -f service.yaml
# Service 목록 확인kubectl get services
# minikube에서 NodePort 서비스 접근 URL 확인minikube service nginx-service --url
# 포트 포워딩으로 로컬에서 접근kubectl port-forward service/nginx-service 8080:80
# http://localhost:8080 으로 접근 가능
# 리소스 조회kubectl get pods -n namespace-name # 특정 네임스페이스의 Podkubectl get all # 모든 리소스 한 번에kubectl get pods -o wide # 노드 정보 포함kubectl get pods --watch # 실시간 상태 변화 모니터링# 상세 정보와 이벤트 확인kubectl describe pod pod-name
kubectl describe deployment deployment-name
# 로그 확인kubectl logs pod-name -f # 실시간 로그kubectl logs pod-name --previous # 이전 컨테이너 로그 (재시작 후)kubectl logs deployment/nginx-deployment # Deployment 전체 로그# 디버깅kubectl exec -it pod-name -- /bin/sh # 컨테이너 접속kubectl top pods # CPU/메모리 사용량 (metrics-server 필요)kubectl events --sort-by=.lastTimestamp # 최근 이벤트 확인# 네임스페이스kubectl create namespace myapp
kubectl get pods -n kube-system # 시스템 Pod 확인kubectl config set-context --current --namespace=myapp # 기본 네임스페이스 변경
K8s는 처음에 개념이 많아서 복잡해 보입니다. 하지만 핵심은 단순합니다. “원하는 상태를 선언하면 K8s가 그 상태를 유지한다.” 이 철학을 기억하면서 Pod → Deployment → Service 순서로 익혀나가면 됩니다. minikube로 실제로 명령을 치고, kubectl describe로 무슨 일이 일어나는지 확인하는 것이 가장 빠른 학습 방법입니다.