[Kubernetes] 어플리케이션 배포 관리

1. Rollout이란

Rollout은 어플리케이션의 변경 내용을 적용하고 업데이트 이력 관리를 하는 것을 말한다. Rolling Update Strategy로는 두가지가 있다.

1) Recreate

모든 레플리카를 종료하고 새 버전으로 실행한다. 이 때 어플리케이션 다운이 발생한다.

2) Rolling Update

레플리카의 일부분씩 rolling update를 수행하여 어플리케이션 중단이 없도록 하는 방법이다. 디폴트 배포 방법. 한번에 다운시키는 레플리카 수는 RollingUpdate에서 설정 가능하다.

  • maxSurge : 매회 새로 추가할 신규 버전의 파드 수, 정수 혹은 비율(%)로 지정 가능
  • maxUnavailable : 매회 제거할 기존 버전의 파드 수, 정수 혹은 비율(%)로 지정 가능
replicas:5
strategy:
  type: RollingUpdate
  rollingUpdate: 
    maxSurge: 1
    maxUnavailable: 0

위 예시대로라면 Ready 상태 파드를 항상 5개 유지하고 업데이트 버전의 파드를 1개씩 생성(Not Ready 상태) 후 신규 파드가 Ready 상태가 되면 기존 파드를 1개씩 Terminating 시킨다. 배포 도중 파드의 수를 보면 최대 6개(업데이트 버전 신규 파드 1개 포함)이거나 기존 파드가 제거되어 5개인 상태 둘 중 하나를 가지게 된다.

3) ReadinessProbe

앞서 배포 시에 신규 파드가 Ready 상태가 되면 기존 파드를 설정값에 맞게 제거한다고 했다. 만약 파드는 생성 되었지만 대규모 데이터를 불러오거나 프로세스를 실행하는데 시간이 많이 걸린다면 기존 파드를 제거 했을 때 한동안 서비스에 문제가 발생할 수도 있다. 이 때 Ready 상태의 체크와 관련된 설정을 ReadinessProbe로 할 수 있다. ReadinessProbe는 kubelet이 실행하는 Probe들 중에 하나로 컨테이너가 트래픽을 처리할 수 있는 준비가 되었는지 체크한다. 특정 경로와 포트로 HTTP요청을 해 체크하는 방식과 스크립트파일을 실행해 성공여부로 체크하는 방식이 있다. HTTP의 성공코드(200)나 쉘스크립트 exit code가 0일 때 성공으로 간주한다.

readinessProbe:
  periodSeconds: 10
  timeoutSeconds: 2
  successThreshold: 2
  failureThreshold: 2
  httpGet:
    path: /status
    port: 80
readinessProbe:
    exec: 
    command:
      - /startup.sh
  initialDelaySeconds: 5
  periodSeconds: 10
  successThreshold: 2

2. Command

# Rollout Command (모든 레플리카셋에 업데이트 적용)
kubectl rollout status deployment/myapp-deployment

# Rollout History
kubectl rollout history deployment/myapp-deployment

# Rollout Status
kubectl rollout status deployment/myapp-deployment

# Pause deployment
kubectl rollout pause deploy/myapp-deployment

# Resume deployment
kubectl rollout resume deploy/myapp-deployment

# Rollback
kubectl rollout undo deployment/myapp-deployment

# Rollback to specific revision
kubectl rollout undo deploy/myapp-deployment --to-revision=1

# yaml 수정 후 업데이트 적용 방법
kubectl apply -f deployment-definition.yml

# 직접 업데이트 적용 방법
kubectl edit

# kubectl set (이 방법은 yaml파일을 수정하지 않기 때문에 추후 yaml 파일을
# 사용할 때 주의해야 한다.
kubectl set image deployment/myapp-deployment ngingx=nginx:1.9.1

# rolling update 방법 조회
kubectl describe deployment

'Kubernetes' 카테고리의 다른 글

[Kubernetes] 백업, 복구  (0) 2020.12.23
[Kubernetes] 클러스터 업그레이드  (0) 2020.12.17
[Kubernetes] 모니터링, 로깅  (0) 2020.11.28
[Kubernetes] Service  (0) 2020.11.19
[Kubernetes] POD, ReplicaSet, Deployment  (0) 2020.11.12