디플로이먼트(Deployment)는 파드와 레플리카셋(ReplicaSet)에 대한 선언적 업데이트를 제공한다.

  • 디플로이먼트에서 의도하는 상태 를 설명하고,
  • 디플로이먼트 컨트롤러(Controller)는 현재 상태에서 의도하는 상태로 비율을 조정하며 변경한다.


디플로이먼트(Deployment)

  • 애플리케이션을 다운타임 없이 업데이트를 가능하도록 도와주는 리소스
  • 레플리카셋과 레플리케이션컨트롤러 상위에 배포

모든 포드를 업데이트하는 방법

  • Recreate: 파드를 모두 종료하고 바로 다시 생성, 다운타임 발생
  • RollingUpdate: 다운타임 없이 애플리케이션의 파드들을 새버전으로 하나씩 배포

작성요령

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3 # 몇 개의 pod를 배포할지
  selector: # 생성된 ReplicaSet가 관리할 포드를 찾는 방법을 정의
    matchLabels:
      app: nginx
  template: # 아래부터는 pod를 정의
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

위 yaml 내용을 배포하면 아래와 같은 결과를 얻을 수 있다.

$ kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-86dcfdf4c6-96lwz   1/1     Running   0          11s
pod/nginx-deployment-86dcfdf4c6-c66vq   1/1     Running   0          11s
pod/nginx-deployment-86dcfdf4c6-rks5q   1/1     Running   0          11s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   9d

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           11s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-86dcfdf4c6   3         3         3       11s

deployment리소스 1개, replicaset리소스 1개, pod리소스 3개가 만들어 진 것을 확인 할 수 있다.

스케일링

# 직접 수정을 하여 replicas 수를 조정
kubectl edit deploy nginx

# replicas 옵션을 사용
kubectl scale deploy nginx --replicas=10


애플리케이션 롤링 업데이트와 롤백

RollingUpdate는 다운타임 없이 애플리케이션의 파드들을 새버전으로 하나씩 배포하는 방식이다.

  • 새 버전을 실행하는 동안 구 버전 포드와 연결
  • 서비스의 레이블셀렉터를 수정하여 진행
  • 애플리케이션 간의 하위호환이 있어야 한다.
# history 10개 기록지원
$ kubectl create -f nginx.yaml --record=ture

# history 확인
$ kubectl rollout history deployment nginx

# deployment의 pod 이미지 변경
$ kubectl set image deployment nginx nginx=banana/nginx:v2

# 특정 버전으로 되돌아 가기
$ kubectl rollout undo deployment nginx --to-revision=1

# 업데이트 일시정지
$ kubectl rollout pause deployment nginx

# 업데이트 일시정지 취소
$ kubectl rollout undo deployment nginx

# 업데이트 재시작
$ kubectl rollout resume deployment nginx

세부 전략 설정

maxUnavailable

  • 최소 몇개의 포드를 유지해야 하는지(기본값은 25%)
  • 예를 들어 이 값을 30%로 설정하면 롤링 업데이트가 시작되는 즉시 기존 ReplicaSet를 원하는 포드의 70%로 축소할 수 있습니다
apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
 labels:
   app: nginx
spec:
 replicas: 3
 selector:
   matchLabels:
     app: nginx
 template:
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx:1.14.2
       ports:
       - containerPort: 80
 strategy:
   type: RollingUpdate
   rollingUpdate:
     maxUnavailable: 1 # maxUnavailable 설정

maxSurge

  • 최대 몇개까지 포드를 생성할 것인가!(기본값은 25%)
  • 예를 들어 이 값을 30%로 설정하면 롤링 업데이트가 시작될 때 새 ReplicaSet를 즉시 확장할 수 있으므로 이전 및 새 포드의 총 개수가 원하는 포드의 130%를 초과하지 않습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
 labels:
   app: nginx
spec:
 replicas: 3
 selector:
   matchLabels:
     app: nginx
 template:
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx:1.14.2
       ports:
       - containerPort: 80
 strategy:
   type: RollingUpdate
   rollingUpdate:
     maxSurge: 1 # maxSurge 설정
     # maxUnavailable: 1 # maxUnavailable를 추가해서 사용 가능

업데이트를 실패하는 케이스

  • Kubernetes Documentation: Failed Deployment

  • 부족한 할당량(Insufficient quota)
  • 레디네스 프로브 실패(Readiness probe failures)
  • 이미지 가져오기 오류(Image pull errors)
  • 권한 부족(Insufficient permissions)
  • 제한 범위(Limit ranges)
  • 응용 프로그램 런타임 구성 오류(Application runtime misconfiguration)
$ kubectl patch deployment/nginx-deployment -p '{"spec":{"progressDeadlineSeconds":600}}'
  • 업데이트를 실패하는 경우에는 기본적으로 600초(10분) 후에 업데이트를 중지한다.