YOGAE

TODO: FIXME:

kubernetes deployment

15 May 2019

Deployment는 포드를 직접 관리하지 않고 ReplicaSet을 생성하고 ReplicaSet이 관리를 하도록 위임합니다.

Deployment는 ReplicationContoller대신 ReplicaSet을 사용하여 배포합니다.

yaml file 작성

# kubia-deployment-v1.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
 name: kubia
spec:
 replicas: 3
 minReadySeconds: 10
 strategy:
  rollingUpdate:
   maxSurge: 1
   maxUnavailable: 0
  type: RollingUpdate
 template:
  metadata:
   name: kubia
   labels:
    app: kubia
  spec:
   containers:
   - image: luksa/kubia:v1
     name: nodejs
     readinessProbe:
      periodSeconds: 1
      httpGet:
       path: /
       port: 8080
kubectl create -f kubia-deployment-v1.yaml --record # --record 포함하여 리비전 히스토리에 명령이 기록되며 나중에 유용하게 사용할 수 있습니다.

deployment 상태 확인

kubectl rollout status deployment kubia # 실행 중인 pod 상태 확인

deployment 전략

  • Deployment의 디폴트 배포 전략은 RollingUpdate입니다.
  • RollingUpdate 전략은 오래된 포드를 하나씩 제거하는 동시에 새로운 포드를 추가해 전체 업데이트 프로세스에 걸쳐 애플리케이션을 사용할 수 있도록 합니다.(애플리케이션이 이전 버전과 새 버전을 동시에 처리할 수 있는 경우에만 사용해야 합니다.)
  • Recreate 전략을 사용하면 새 포드를 만들기 전에 모든 이전 포드를 삭제할 수 있습니다. (애플리케이션이 여러 버전을 동시에 실행할 수 없으며 새 버전을 시작하기 전에 이전 버전을 완전히 중지해야 하는 경우 사용합니다. 이 전략에는 애플리케이션을 완전히 사용할 수 없게 되는 짧은 시간이 포함됩니다.)

롤링 업데이트 트리거

kubectl set image deployment kubia nodejs=luksa/kubia:v1 # kubia 디플로이먼트의 포드 템플리시 업데이트돼 nodejs 컨테이너에서 사용하고 잇는 이미지가 v1에서 luksa/kubia:v2로 변경됩니다.

Deployment를 이용하여 배포된 pod는 새 레플리카셋에 의해 관리되고 기존 레플리카셋은 삭제되지 않고 남아 있습니다. update를 진행하면서 문제가 발생하면 쉽게 롤백할 수 있도록 합니다.

maxSurge와 maxUnavailable 속성

...
spec:
 stategy:
  rollingUpdate:
   maxSurge: 1
   maxUnavailable: 0
  type: RollingUpdate
  • maxSurge: deployment에 설정되어 있는 기본 pod개수보다 여분의 pod가 몇개가 더 추가될 수 있는지를 설정할 수 있습니다.
  • maxUnavailable: 업데이트하는 동안 몇 개의 pod가 이용 불가능하게 되어도 되는지를 설정하는데 사용됩니다.

minReadySeconds 속성

새로 생성된 포드가 사용 가능한 상태로 전환하기 전 준비 상태로 머무를 시간을 지정합니다.

minReadySeconds를 올바르게 설정하지 않고 readiness probe만 정의하는 경우 readiness probe의 첫 번째 호출이 성공하면 새 포드를 즉시 사용할 수 있는 거으로 간주된다. 잠시 후 readiness probe가 실패하면 잘못된 버전이 모든 포드에 롤아웃된다.

Rollout

Rollout rollback

kubectl rollout undo deployment kubia # 이전 버전으로 롤백

kubectl rollout undo deployment kubia --to-revision=1 # revision 1로 rollback

Rollout history

디플로이먼트는 리비전 히스토리를 유지하므로 롤아웃 롤백이 가능합니다. 히스토리는 레플리카셋 내부에 저장되고 레플리카셋은 이전 버전뿐만 아니라 모든 버전으로 롤백할 수 있습니다.

kubectl rollout history deployment kubia # history 확인

리비전 히스토리의 크기는 디플로이먼트 리소스의 revisionHistoryLimit 속성에 의해 제한됩니다.

Rollout 중지 및 재개

kubectl rollout pause deployment kubia # 롤아웃 중지 -> 카나리아 릴리스가능

kubectl rollout resume deployment kubia # 롤아웃 재개