Kubernetes의 Pod, Deployment, Service의 역할을 설명해주세요.
답변 포인트
컨테이너 실행 단위, 원하는 상태 유지, 안정적인 네트워크 엔드포인트로 나누어 설명해보세요.
정답 및 해설
빠른 요약
Pod는 Kubernetes에서 배포 가능한 가장 작은 단위로 하나 이상의 컨테이너를 포함합니다. Deployment는 원하는 개수의 Pod가 항상 실행되도록 관리하고, 롤링 업데이트와 롤백을 제공합니다.
Kubernetes는 컨테이너를 여러 서버에 배포하고 운영하기 위한 오케스트레이션 플랫폼입니다. 그중 Pod, Deployment, Service는 가장 기본적인 리소스입니다.
Pod
Pod는 Kubernetes에서 배포 가능한 가장 작은 단위입니다. 하나 이상의 컨테이너를 포함하며, 같은 Pod 안의 컨테이너는 네트워크와 스토리지를 공유합니다.
apiVersion: v1
kind: Pod
metadata:
name: web
spec:
containers:
- name: app
image: nginx:alpine
ports:
- containerPort: 80보통 Pod를 직접 운영하기보다는 Deployment 같은 상위 리소스가 Pod를 생성하고 관리합니다.
Deployment
Deployment는 원하는 개수의 Pod가 항상 실행되도록 관리합니다. 롤링 업데이트, 롤백, replica 수 조정도 담당합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: app
image: nginx:alpine
ports:
- containerPort: 80Pod가 죽으면 Deployment가 새 Pod를 생성해 desired state를 맞춥니다.
Service
Pod는 생성과 삭제에 따라 IP가 바뀔 수 있습니다. Service는 변하는 Pod들 앞에 안정적인 네트워크 엔드포인트를 제공합니다.
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: ClusterIPselector가 app: web인 Pod들로 트래픽을 전달합니다.
Service 타입
| 타입 | 설명 |
|---|---|
| ClusterIP | 클러스터 내부에서만 접근 |
| NodePort | 각 노드의 포트를 통해 외부 접근 |
| LoadBalancer | 클라우드 로드밸런서를 생성 |
| ExternalName | 외부 DNS 이름으로 연결 |
관계 정리
Deployment
-> ReplicaSet
-> Pod 여러 개
Service
-> label selector로 Pod들을 찾아 트래픽 전달Deployment는 Pod의 수명과 배포를 관리하고, Service는 그 Pod들에 접근하는 안정적인 방법을 제공합니다.
실무에서 함께 고려할 것
- readinessProbe: 트래픽을 받을 준비가 되었는지 확인
- livenessProbe: 컨테이너가 살아 있는지 확인
- resources requests/limits: CPU/메모리 요청과 제한
- ConfigMap/Secret: 설정과 민감 정보 분리
- Ingress: HTTP 라우팅과 TLS 처리
정리
Pod는 컨테이너 실행 단위, Deployment는 Pod를 원하는 상태로 유지하는 배포 관리자, Service는 변하는 Pod들에 안정적으로 접근하게 해주는 네트워크 추상화입니다.
Kubernetes 리소스 관계
Pod는 컨테이너를 실행하는 최소 배포 단위, Deployment는 Pod 복제본과 롤링 업데이트를 관리하는 컨트롤러, Service는 변하는 Pod IP 앞에 안정적인 네트워크 진입점을 제공합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels: { app: web }
template:
metadata:
labels: { app: web }
spec:
containers:
- name: web
image: example/web:1.0.0
---
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector: { app: web }
ports:
- port: 80
targetPort: 3000왜 Service가 필요한가?
Pod는 재시작/스케일링 때 IP가 바뀝니다. Service는 label selector로 현재 살아 있는 Pod들을 찾아 로드밸런싱하므로 클라이언트는 web:80 같은 안정적인 주소만 알면 됩니다.
운영 체크포인트
- readinessProbe와 livenessProbe를 구분합니다.
- 리소스 requests/limits를 설정해 스케줄링과 장애 격리를 돕습니다.
- ConfigMap/Secret으로 환경 설정을 이미지와 분리합니다.
- Deployment 전략(rolling update, maxUnavailable)을 서비스 특성에 맞춥니다.