kok202
쿠버네티스 입문 - 02 - 컨트롤러 2 - 디플로이먼트

2020. 4. 4. 02:49[정리] 기능별 개념 정리/Kubernetes

디플로이먼트

쿠버네티스에서 상태가 없는 앱을 배포할 때 사용하는 가장 기본적인 컨트롤러이다.

실행 시켜야할 파드 개수를 유지하는 것 뿐만 아니라 롤링 업데이트, 앱 배포 pause, resume, rollback 등의 동작을 할 수 있다.

디플로이먼트도 내부적으로는 Replica set 을 만들어서 구현된다.

 

 

 

디플로이먼트 Sample

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myDeployment
  labels:
    app: myDeployment
  annotations:
    kubernetes.io/change-cause: version 1.10.1
spec:
  template:
    metadata:
      labels:
        app: myDeployment
    spec:
      containers:
      - name: myDeployment
        image: myDockerNamespace/myImage:1.10.1
        imagePullPolicy: Always
        ports:
        - containerPort: 80
          protocol: TCP
        livenessProbe:
          httpGet:
            path: /liveness
            port: 80
        readinessProbe:
          httpGet:
            path: /readiness
            port: 80
        lifecycle:
          preStop:
            httpGet:
              path: /prestop
              port: 80
      terminationGracePeriodSeconds: 30
  replicas: 3
  selector:
    matchLabels:
      app: myDeployment
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate

.metadata.annotations.kubernetes.io/chage-cause : 배포 이력에 CHANGE-CAUSE 내용을 남길 수 있다.

.spec.strategy.rollingUpdate.maxSurge : 배포에 설정된 기본 파드 개수에서 몇개 더 추가해서 rolling update 할 것인지 명시한다.

.spec.strategy.rollingUpdate.maxUnavailable : 배포가 진행되는 동안 몇개의 파드를  이용할 수 없어도 되는지 명시한다.

.spec.containers[].name : deployment 가 띄우려는 컨테이너의 이름

.spec.containers[].image : deployment 가 띄우려는 컨테이너의 이미지

.spec.containers[].imagePullPolicy : deployment 가 띄우려는 컨테이너 이미지를 띄울 때 항상 pull 을 해오고 띄운다.

.spec.containers[].livenessProbe : deployment 가 컨테이너를 띄우고 컨테이너가 제대로 떴는지 진단하는 방법.

.spec.containers[].readinessProbe : deployment 가 컨테이너를 띄우고 컨테이너 안의 어플리케이션이 제대로 떴는지 진단하는 방법

.spec.containers[].lifecycle.preStart : 파드 생명 주기중 파드가 생성 직후 실행되는 훅.

.spec.containers[].lifecycle.preStop : 파드 생명 주기중 파드가 종료 직전 실행되는 훅.

.spec.terminationGracePeriodSeconds : kubelet 의 종료 요청 후 일정 시간동안 그레이스풀 종료되지 않을 때 강제로 SIGKILL 하는 시간.

 

 

 

무중단 배포와 ReadinessProbe

무중단 배포시 주의 할점은 readinessProbe 가 반드시 필요하다는 것이다.

예를 들어 자바 프로세스 같은 경우 초기화 과정이 길수 잇다.

livenessProbe 는 컨테이너의 준비 여부만 진단하므로 컨테이너는 준비되도 어플리케이션은 준비 되지 않을 수 있다.

결과적으로 readinessProbe 가 없다면 준비되지 않은 컨테이너에 요청이 들어갈 수 있다.

컨테이너 자체에 readinessProbe 가 어렵다면 .spec.minReadySeconds 를 사용하면 파드가 완전히 준비될 때까지 기다리게 할 수 있다.

 

 

 

무중단 배포와 그레이스풀 종료

kubelet 은 파드의 생성, 종료할 때 SIGTERM 신호를 보낸다.

따라서 무중단 배포를 하려면 컨테이너에서 SIGTERM 신호를 받은 경우 기존에 받은 요청만 처리하고 새로운 요청을 받지 않는다는 '그레이스풀 종료' 설정이 되어있어야한다.

 

 

 

 

디플로이먼트 관련 커맨드

kubectl rollout history deploy myDeployment.yml
kubectl rollout undo deploy myDeployment.yml
kubectl rollout pause deploy myDeployment.yml
kubectl rollout resume deploy myDeployment.yml
kubectl rollout restart deploy myDeployment.yml
kubectl rollout status

history : 배포 이력 열람

undo : 배포 롤백

pause : 배포 중단

resume : 배포 이어하기

restart : 배포 재시작

statsus : 배포 상태

- Progressing

- Complete

- Fail

 

 

 

배포 전략

재생성 : 무중단 배포가 아니다. 서비스가 잠시 중단된다. 대신 추가적인 자원 요구가 되지 않는다.

1. my-deployment 의 image 버전을 v2 로 바꾼다.

2. my-deployment 를 apply 한다.

    > my-deployment가 만든 v1 ReplicaSet 의 Replicas 를 0으로 만든다. (pod 가 삭제된다.)

    > my-deployment는 만든 v2 ReplicaSet 을 만들고 Replicas 를 5로 만든다. 

 

롤링 업데이트 : 일정 개수씩 교체해가면서 배포한다.

1. my-deployment 의 image 버전을 v2 로 바꾼다.

2. my-deployment 를 apply 한다.

    > my-deployment가 만든 v1 ReplicaSet 의 Replicas 를 4로 만든다. (pod 가 삭제된다.)

    > my-deployment는 만든 v2 ReplicaSet 을 만들고 Replicas 를 1로 만든다.

    > my-deployment가 만든 v1 ReplicaSet 의 Replicas 를 3으로 만든다.

    > my-deployment는 만든 v2 ReplicaSet 의 Replicas 를 2로 만든다. 

    > ...

 

블루 / 그린 : 기존에 실행중인 파드의 갯수와 같은 갯수로 새로운 버전의 파드를 띄운다. 그리고일제히 신규 파드로 요청을 옮기는 방식.

1. my-service 오브젝트는 app:my-app 와 ver:v1 인 태그를 셀렉트한다.

2. my-replicaset-v1 을 작성한다. 템플릿 내용은 v1 이미지를 사용하고 app:my-app, ver:v1 태그를 단다는 내용이다.

3. my-replicaset-v1 을 apply 한다.

    > my-replicaset-v1 은 v1 Replicas 5개를 만든다.

4. 이제 v1 에서 v2 로 버전을 올리고 싶어한다.

5. my-replicaset-v2 을 작성한다. 템플릿 내용은 v2 이미지를 사용하고 app:my-app, ver:v2 태그를 단다는 내용이다.

6. my-replicaset-v2 를 apply 한다.

    > my-replicaset-v2 는 v2 Replicas 5개를 만든다.

7. my-service 오브젝트가 app:my-app 와 ver:v2 인 태그를 셀렉트 하도록 변경한다.

 

카나리 : 신규 파드를 배포할 때 기존 버전과 신규 버전을 같이 띄워보고 사용자의 반응을 살피면서 배포하는 방식.

 

 

 

기타 Deployment 파드 개수 늘리기

kubectl scale deployment myDeployment —replicas 3