Tools for IT/- Kubernetes

CKAD - Application Deployment

자굿 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개
  •  

Blue Green

  • Blue와 Green 모두 배포한 상태에서 배포된 Green의 테스트가 완료되면 트래픽을 한 번에 100% 전환하는 방식
    • Blue: 기존 버전
    • Green: 신규 버전
  • Deployment 배포 전략으로 선택할 수는 없고 Deployment와 Service로 구현해야 함.

Blue Green 구현 

  • 구현 순서
    1. Deployment - blue 배포 <- Service가 blue Deployment의 selector 설정
    2. Deployment - green 배포
    3. green 테스트 및 완료
    4. 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 배포 방식
    1. 기존 배포 Pod들 배포된 상태
    2. 몇 개의 Test 용 새로운 버전의 Pod 배포
    3. 적은 양의 트래픽만 새로운 버전으로 경로를 지정
    4. 새로운 버전으로 들어온 트래픽이 정상적으로 동작하는 것이 테스트 완료
    5. 기존 배포들을 새로운 버전으로 Update
    6. Test 용 새로운 버전의 Pod 제거
  • Blue/Green 배포 전략과 마찬가지로 Deployment 배포 전략으로 선택할 수는 없고 Deployment와 Service로 구현해야 함.

Canary 구현

  • 구현 순서
    1. 기존 primary 배포가 존재하는 상태 <- Service가 front-end를 selector로 선택
    2. canary를 최소 replica(1)로 설정하여 배포
      1. 이때 canary의 image와 version은 Update
    3. Service는 label을 선택하여 트래픽을 분산하기 때문에 primary(5)와 canary(1)로 트래픽이 분산됨
    4. canary가 정상적으로 동작하는 것이 테스트 완료
    5. primary의 image와 version을 Update
    6. 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
반응형