-
CKAD - Application DeploymentTools for IT/- Kubernetes 2024. 3. 11. 17:59
Understand Deployments and how to perform rolling updates
Use Kubernetes primitives to implement common deployment strategies (e.g. blue/green or canary)
Deployment
Create
kubectl create -f <deployment_yml_file>
Get
kubectl get deployments
Describe
kubectl describe deployment <deployment_name>
Update
- Apply file
kubectl apply -f <deployment_yaml_file>
- Set image
kubectl set image deployment/<deployment_name> <container_name>=<image_detail>
Status
- Status
kubectl rollout status deployment/<deployment_name>
- History
kubectl rollout history deployment/<deployment_name>
기본적으로
kubectl history
에서CHANGE-CAUSE
는 <none>으로 되어 있고CHANGE-CAUSE
에 기록하길 원한다면 아래와 같이 deployment를 생성할 때--record
를 설정해줘야 한다.kubectl create -f <deployment_yml_file> --record
Delete
kubectl delete deployment <deployment_name>
Rollback
- 현재 상태의 배포의 오류가 발생했을때 이전 배포 상태로 돌리는 기능
kubectl rollout undo deployment/<deployment_name>
배포 전략
Recreate
- 모든 pod를 한 번에 down 시키고 새로운 것을 한 번에 up 하는 단순한 방식
Rolling Update
- 새로운 pod로 하나씩 교체(기본 배포 전략)
- RollingUpdateStrategy: 25% max unavailable, 25% max surge
- maxSurge: 업데이트 중 desired Pod 개수 중 생성될 수 있는 Pod 비율
- e.g. desired Pod: 4개, maxSurge: 25% -> 새로 생성될 수 있는 Pod: 1개
- maxUnavailable: 업데이트 중 unavailable Pod로 만들 수 있는 Pod 비율
- e.g. desired Pod: 4개, maxUnavailable: 25% -> 정지시킬 수 있는 Pod: 1개
- maxSurge: 업데이트 중 desired Pod 개수 중 생성될 수 있는 Pod 비율
Blue Green
- Blue와 Green 모두 배포한 상태에서 배포된 Green의 테스트가 완료되면 트래픽을 한 번에 100% 전환하는 방식
- Blue: 기존 버전
- Green: 신규 버전
- Deployment 배포 전략으로 선택할 수는 없고 Deployment와 Service로 구현해야 함.
Blue Green 구현
- 구현 순서
- Deployment - blue 배포 <- Service가 blue Deployment의 selector 설정
- Deployment - green 배포
- green 테스트 및 완료
- Service 라벨 선택기 green으로 Update
Example
- myapp-blue.yml (Deployment yaml file)
apiVersion: apps/v1 kind: Deployment metadata: name: myapp-blue labels: app: myapp type: front-end spec: template: metadata: name: myapp-pod labels: version: v1 spec: containers: - name: app-container image: myapp-image:1.0 replicas: 5 selector: matchLabels: version: v1
- my-service.yml (Service yaml file)
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: version: v1
기존의 배포(blue) 상태는 위와 같음.
아래과 같이 변경한 green 배포
- myapp-green.yml (Deployment yaml file)
apiVersion: apps/v1 kind: Deployment metadata: name: myapp-green labels: app: myapp type: front-end spec: template: metadata: name: myapp-pod labels: version: v2 spec: containers: - name: app-container image: myapp-image:2.0 replicas: 5 selector: matchLabels: version: v2
Green 테스트 완료 후 service selector update
- my-service.yml (Service yaml file)
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: version: v2
Canary
- Canary 배포 방식
- 기존 배포 Pod들 배포된 상태
- 몇 개의 Test 용 새로운 버전의 Pod 배포
- 적은 양의 트래픽만 새로운 버전으로 경로를 지정
- 새로운 버전으로 들어온 트래픽이 정상적으로 동작하는 것이 테스트 완료
- 기존 배포들을 새로운 버전으로 Update
- Test 용 새로운 버전의 Pod 제거
- Blue/Green 배포 전략과 마찬가지로 Deployment 배포 전략으로 선택할 수는 없고 Deployment와 Service로 구현해야 함.
Canary 구현
- 구현 순서
- 기존 primary 배포가 존재하는 상태 <- Service가 front-end를 selector로 선택
- canary를 최소 replica(1)로 설정하여 배포
- 이때 canary의 image와 version은 Update
- Service는 label을 선택하여 트래픽을 분산하기 때문에 primary(5)와 canary(1)로 트래픽이 분산됨
- canary가 정상적으로 동작하는 것이 테스트 완료
- primary의 image와 version을 Update
- canary 배포 제거
Example
- myapp-primary.yml (Deployment yaml file)
apiVersion: apps/v1 kind: Deployment metadata: name: myapp-primary labels: app: myapp type: front-end spec: template: metadata: name: myapp-pod labels: version: v1 app: front-end spec: containers: - name: app-container image: myapp-image:1.0 replicas: 5 selector: matchLabels: version: front-end
- my-service.yml (Service yaml file)
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: version: front-end
위와 같이 배포된 상태에서
canary 배포
- myapp-canary.yml (Deployment yaml file)
apiVersion: apps/v1 kind: Deployment metadata: name: myapp-canary labels: app: myapp type: front-end spec: template: metadata: name: myapp-pod labels: version: v2 app: front-end spec: containers: - name: app-container image: myapp-image:2.0 replicas: 1 selector: matchLabels: version: front-end
반응형