시간이 지남에 따라 어플리케이션 버전 관리 필요 -> ReplicaSet
은 어플리케이션 업데이트에 관한 기능을 제공하지 않는다.
이를 해결하기위해 사용하는 것이 Deployment
Pod
와 ReplicaSet
에 대한 선언적 업데이트를 제공한다.ReplicaSet
의 상위 개념으로, Pod
와 ReplicaSet
에 대한 배포를 관리한다.Deployment
는 다양한 방식의 배포 전략이 있다.
설명 : 기존 버전 Pod을 하나씩 삭제하고 새로운 버전 Pod 생성, 순차적(점진적) 교체
장점
- 다운타임 발생 안함
- 구버전의 환경을 재활용하거나 롤백하기 쉬움
단점
- 기존 버전의 Pod과 새로운 버전의 Pod 공존하는 시간 발생
- 사용중인 인스턴스에 트래픽이 몰리는 문제 가능성 존재
- 버전 호환성 문제 가능성 존재
설명 : 기존 버전 Pod 모두 삭제 후 새로운 버전 Pod 생성
장점
- 단순함
단점
- 다운타임 발생 가능 (무중단 배포 불가능)
설명 : 기존 버전 Pod 유지한채로 새로운 버전 Pod 생성, Service가 트래픽을 전달하는 대상을 교체한 뒤 기존 버전 Pod 삭제
장점
- 다운타임 발생 안함
- 기존 버전의 Pod과 새로운 버전의 Pod 공존하는 문제 해결
단점
- 배포시 자원을 2배로 사용함
- 새로운 환경에 대한 테스트가 전제되어야 함
설명 : 기존 버전 Pod과 신버전 Pod을 모두 구성한 뒤, 트래픽의 양을 조절하여 테스트 진행 후 교체
장점
- 문제 상황 빠르게 감지 가능
- A/B 테스트로 활용 가능
단점
- 구현 복잡성 존재(평가 방식, 트래픽 배분 등)
- 롤링 배포와 마찬가지로 호환성 문제 발생 가능
sudo vi [yaml 파일]
apiVersion: apps/v1
kind: Deployment
metadata:
name: [Deployment 이름]
spec:
replicas: 4 # 원하는 Pod 개수 선언
selector:
matchLabels:
app: [App 이름]
tier: [tier 이름]
minReadySeconds: 5
strategy:
type: RollingUpdate # update(배포) 전략 선언
rollingUpdate:
maxSurge: 3 # Default값은 25%
maxUnavailable: 3
template:
metadata:
labels:
app: [App 이름]
tier: [tier 이름]
spec:
containers:
- name: [컨테이너 이름]
image: [이미지]
livenessProbe: # 컨테이너 상태 모니터링 필요에 따라 추가
httpGet:
path: /
port: 3000
kubectl apply -f [yaml 파일]
이후 이미지 등 리소스를 업데이트 할 때, 선언된 배포 방식에 따라 업데이트가 된다.
(새로운 ReplicaSet
을 만들고, Pod
개수 조정하는 형태로 업데이트 수행)
Deployment Controller
는 Deployment
조건을 감시하면서 현재 상태와 원하는 상태가 다른 것을 체크Deployment Controller
가 원하는 상태가 되도록 ReplicaSet
설정ReplicaSet Controller
는 ReplicaSet
조건을 감시하면서 현재 상태와 원하는 상태가 다른 것을 체크ReplicaSet Controller
가 원하는 상태가 되도록 Pod
을 생성하거나 제거Scheduler
는 API 서버
를 감시하면서 할당되지 않는 unassigned Pod
이 있는지 체크Scheduler
는 할당되지 않은 새로운 Pod
을 감지하고 적절한 노드
에 배치노드
는 기존대로 동작kubectl set image deploy/[Deployment 이름] [컨테이너 이름]=[변경하고자 하는 이미지]
: 이미지 변경 (명령어로)
kubectl describe deploy/[Deployment 이름]
: 이벤트 확인
Deployment
는 변경된 상태를 기록한다.
kubectl rollout history deploy/[Deploy 이름]
: 히스토리 확인
kubectl rollout history deploy/[Deploy 이름] --revision=1
: revision 1 히스토리 상세 확인
kubectl rollout undo deploy/echo-deploy
: 바로 전으로 롤백
kubectl rollout undo deploy/echo-deploy --to-revision=2
: 특정 버전으로 롤백
sudo vi nginx-dp.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLables:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
kubectl describe deploy/nginx
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 5 # 복제 개수 변경
selector:
matchLables:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.5 # 이미지 버전 변경
kubectl describe deploy/nginx
: 배포 업데이트 상태 확인
참고
https://subicura.com/k8s/guide/deployment.html#deployment-%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5
https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/