[k8s] deployment: 재배포 전략

재배포에 대한 구성은 지속적인 배포와 운영에 있어서 매우 중요한 부분이다.
deployment를 사용하면서 그 대략적인 종류와 사용법을 정리해보도록 하겠다.

여기서는 deployment에 먹이면서 해보긴 하겠지만, 다른 컨트롤러 단위에도 통용되는 부분이다.

배포 전략에는 Rolling Update, Recreate의 2가지 방법 정도가 지원된다.
Blue/Green이나 Canary 같은것들은 직접 구성을 해서 제어해야 한다.




재생성 (Recreate)

가장 무식한 재배포 방법이다.
기존의 파드를 죽이고, 새 파드를 띄운다. 그뿐이다.

그래서 이걸로 서버를 구성한다면 파드를 죽이고 새로 띄우는 그 사이에는 downtime이 발생한다.
그래도 상관없는 경우에만 쓰면 된다.

Recreate 전략을 설정하려면, 다음과 같이 spec.strategy를 추가하고 타입을 Recreate로 하면 된다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deploy
spec:
  replicas: 3
  selector: 
    matchLabels: 
      app: test-server
  strategy:
    type: Recreate
  template: 
    metadata: 
      labels: 
        app: test-server
    spec: 
      containers: 
        - name: test-server
          image: myyrakle/node-server-for-test

그리고 apply로 추가하거나 적용해준다.

그리고 rollout 명령을 사용하면 재배포를 트리거할 수 있다.

kubectl rollout restart deployments/test-deploy

상태확인은 이걸로 가능하다.

kubectl rollout status deployments/test-deploy

이렇게 죽인 다음에

새로 띄운다.




Rolling Update

롤링은 일반적으로 가장 자주 사용되는 방식이다.

버전을 0.1에서 0.2로 올려서 배포한다 치면, 0.2의 인스턴스를 동시에 띄운 다음에, 0.2가 성공적으로 올라가면 기존의 0.1을 천천히 삭제하는 방법을 취한다.

옛 버전과 새 버전이 공존할 수 있다는 단점이 있다.
이 단점을 극복하려면 Blue/Green 형태로 직접 구성을 좀 해줘야 한다.

아무튼 yaml을 다시 말아보자.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deploy
spec:
  replicas: 3
  selector: 
    matchLabels: 
      app: test-server
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template: 
    metadata: 
      labels: 
        app: test-server
    spec: 
      containers: 
        - name: test-server
          image: myyrakle/node-server-for-test

여기서 좀 중요한 옵션은 maxSurge와 maxUnavailable다.

maxSurge는 기존 레플리카 개수에 더해서, 배포를 위해 몇개나 더 띄울 수 있는지를 정의한다.
그리고 maxUnavailable는 기존 레플리카 개수에서, 배포를 위해 몇개까지 삭제가 될 수 있는지를 정의한다.

위와 같이 정의했다면 하나씩 새로 띄우면서 기존의 구버전 레플리카 3개를 하나씩 제거하는 구성이 되는 것이다.

반대로 maxSurge를 0, maxUnavailable를 1로 한다면 그 반대가 된다. 추가로 더 띄울 수는 없으니 기존에 있던걸 하나씩 내린 뒤에 하나를 새로 띄우는 형태가 된다.

그리고 0, 1처럼 개수를 명시적으로 쓸 수도 있고, 백분율로 파드 개수를 지정할 수도 있다. maxSurge를 100%로 한다면 하나씩 찔끔찔끔 올리는게 아니라 레플리카 개수인 3개를 한번에 올리고 한번에 지울 것이다.

한번 돌려보자.

kubectl rollout restart deployments/test-deploy
kubectl rollout status deployments/test-deploy

그럼 기대한 대로 처리를 해줄 것이다.



참조
https://velog.io/@squarebird/Kubernetes-Replica-Set%EA%B3%BC-Deployment
https://ooeunz.tistory.com/124