Pod와 Deployment YAML 파일의 차이점을 비교해서 설명드리겠습니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
# Pod
apiVersion: v1
kind: Pod
# Deployment
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 3 # Pod 복제 개수
selector: # 관리할 Pod 선택 기준
matchLabels:
app: nginx
template: # Pod 템플릿 (Pod spec이 여기 들어감)
metadata:
labels:
app: nginx
spec:
# 여기가 Pod의 spec과 동일
Deployment
├── metadata (Deployment 정보)
├── spec
├── replicas (복제본 수)
├── selector (어떤 Pod를 관리할지)
└── template
├── metadata (Pod의 metadata)
└── spec (Pod의 spec - 컨테이너 정의 등)
# simple-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-nginx
spec:
containers:
- name: nginx
image: nginx
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx-deployment
spec:
replicas: 1 # 1개만 생성
selector:
matchLabels:
app: nginx
template: # 위의 Pod spec이 여기 들어감
metadata:
labels:
app: nginx # selector와 매칭되어야 함
spec:
containers:
- name: nginx
image: nginx
template 부분이 바로 Pod의 정의입니다template.spec는 Pod의 spec와 완전히 동일selector.matchLabels와 template.metadata.labels가 일치해야 함metadata.name으로 직접 이름 지정# 1. Pod 직접 생성
kubectl apply -f simple-pod.yaml
kubectl get pods
# 결과: my-nginx
# 2. Deployment 생성
kubectl apply -f nginx-deployment.yaml
kubectl get pods
# 결과: my-nginx-deployment-xxxxxxxxx-xxxxx
# 3. 구조 비교
kubectl describe pod my-nginx
kubectl describe deployment my-nginx-deployment
| 항목 | Pod | Deployment |
|---|---|---|
| 구조 | 단순 1단계 | 2단계 중첩 |
| 핵심 목적 | 컨테이너 실행 | Pod 관리 |
| 고유 필드 | - | replicas, selector, template |
| 관리 방식 | 수동 | 자동 (복제, 복구, 업데이트) |
결론: Deployment YAML은 Pod YAML을 template 안에 감싸고, 추가적인 관리 기능(replicas, selector)을 제공하는 구조입니다!