Kubernetes

Rolling Update

라온클 2023. 2. 4. 06:30

롤링 업데이트

<한줄 요약>

  • 새 버전을 배포하면서, 기존 Pod를 제거하고, 새로운 버전의 pod를 지정한 개수만큼 생성하는 방식.



<세줄 요약>

  • 새로운 버전의 Pod를 생성하고 기존 Pod를 제거한다.
  • 무중단 배포라고도 한다.
  • Deployment의 업데이트방식 기본값이다.



<특징>

maxUnavailable

  • 롤링 업데이트 중에 사용할 수 없는 최대 파드의 수(=롤링 업데이트 중에 동시에 삭제할 수 있는 파드의 최대 개수)
  • 퍼센트(%) 혹은 개수를 지정해줄 수 있다.(3으로 지정하면 기존 Pod 3개가 삭제, 10%로 지정하면 기존 Pod들의 10%가 삭제)
  • maxUnavailable의 값을 높게 설정하면, 롤링 업데이트 시간이 줄어드는 대신, 기존 남아있는 Pod들에 Request수가 몰릴 수 있다. 따라서 1로 설정해서 Pod를 하나씩 교체하는 것이 비교적 안전하다

maxSurge

  • 생성할 수 있는 최대 파드의 개수
  • 즉, 롤링 업데이트 중 동시에 생성하는 파드의 갯수를 의미한다.
  • 값을 높게 설정하면 Pod를 더 빨리 더 많이 생성하므로 파드의 교체 시간이 단축되지만, 그만큼 필요한 시스템 자원이 급증할 수 있다.

 

 

 

 

<장단점(한계)>

  • 장점 : 무중단 배포
  • 단점 : 이전 버전과 새로운 버전이 공존하는 시간이 있으므로 시스템 자원이 2배 발생한다.

 

<만드는 법>

deployment 의 strategy 항목에 RollingUpdate 에 해당하는 manifest 를 지정한다

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rolling-dp
spec:
  replicas: 10
  selector:
    matchLabels:
      app: rolling-dp
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: rolling-dp
    spec:
      containers:
      - image: nginx
        name: nginx



Rolling updates 히스토리 보는 방법

롤백하기 전, 버전들을 확인할 때 쓰인다.

kubectl rollout history deployment {deployment 이름}

 

 

<미래> : --record 가 Deprecated 되었으므로 annotation을 붙인다

# deployment 생성
kubectl create deployment {deployment이름}

# kubectl set image로 업데이트하는 법
kubectl set image deployment {deployment이름} {기존 spec.containers.name}={새로운 spec.containers.image}

# 업데이트 후 어노테이션 붙이기
kubectl annotate deployment {deployment이름} kubernetes.io/change-cause="어노테이션 내용"

# 어노테이션 예시
kubectl annotate deployment frontend kubernetes.io/change-cause="image updated to v2"

# 롤링 히스토리 보기
kubectl rollout history deployment {deployment이름}

# 히스토리 중에서 1번으로 리비전하기
kubectl rollout undo deployment {deployment이름} --to-revision=1




 

 

<참고>

https://nearhome.tistory.com/106