Docker, k8s

k8s_ deployment 배포 전략

우당탕탕인생기 2023. 9. 22. 15:49

k8s에서 deployment가 이전 deploy을 제거하고 수정된(버전 업그레이드 혹은 일부 코드 수정 등) deploy로 교체해야 할 순간들이 생길 수 있다.(ex 이미지 파일 변경 등)

일반적으로 deployment을 새로 배포하면, pod을 삭제하고 새로운 pod를 올리지만, 이 외에, 삭제와 생성을 동시에 한다거나, 일단 교체할 pod을 생성하고 이전 pod을 제거한거나 이런 배포 전략을 설정 하는 실습을 해보겠다.

 

 

일단 배포 전략은 크게 recreate, rollingupdate, 블루/그린이 있다.

 

Deployment 배포 전략

recreate

  • 이전 버전이 즉시종료되면서 새로운 버전 배포
  • 배포 도중 유휴상태가 발생하므로 운영에는 적합하지 않다.

이렇게 기존이 v1 pod가 없어지고 v2 pod가 생성될때 유휴상태가 발생한다,

rollingupdate

  • 유휴상태 없이 pod을 하나씩 바꿔 가면서 배포 하는 방식 즉 새로 배포하면서 이전 버전을 하나씩 종료한다.
  • 서비스 다운 타임 최소화되나 노드갯수가 많아져 리소스가 많이들어갈 수 있다.

(1) max-unavailable:

  • rolling-update을 수행하는 동안 유지할 수 있는 최소의 파드비율의 수
  • (2) maxSurge
  • 롤링업데이트 동안 허용할 수 있는 최대 파드의 비율

 

 

블루/그린(Blue/Green)

이전버전과 새버전을 동시에 나란히 구성  트래픽을 일제히 전환한다.

롤링에서 존재하는 버전차이에 대한 문제를 해결할  있다.

 


실습

 

 

환경 세팅

우선 , 시작 deploy가 하나 있어야한다.

이때, nginx을 1.14로 만들어보자

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dep-nginx
spec:
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14
          ports:
            - containerPort: 80

 

 

 

 

 

Strategy : Recreate

 

아래와 같이 yml 파일을 작성하고 어떻게 변화되는지 확인 해보자

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dep-nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 5
  strategy:
    type: Recreate      # recreate 전략
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: Never
        ports:
        - containerPort: 80

이렇게 처음에 있던 pod와 그 다음 파드의 이름이 달라진것을 볼 수 있는데, 이 때 이전 파드를 완전히 삭제하고 생성하는것을 볼 수 있다.

 

Strategy : Rollingupdate

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dep-nginx

spec:
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 2
      maxUnavailable: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
       - name: nginx
         image: nginx
         ports:
         - containerPort: 80
~

 

rollingupdate yml 파일을 적용하기 전의 모습이다.

파일을 적용하면 처음에 새로은 dep 이름이 나오면서 2개가 준비된다. 그러면서 기존에 있던 deploy는 2개가 줄어든다.

 

 

 

 

'Docker, k8s' 카테고리의 다른 글

k8s_Volume (2) Persistent Volume  (0) 2023.10.02
k8s_ Service Account 개념  (1) 2023.09.30
k8s_로드밸런스 Metallb  (0) 2023.09.20
k8s_ Autoscaling Metric Server(HPA)  (0) 2023.09.18
k8s_NodePort , Port, TargetPort  (0) 2023.09.17