본문 바로가기

Docker & Kubenetes

쿠버네티스 Pod 배포 및 Upgrade 전략

NodeSelector

- Node에 설정된 Label을 기반으로 Pod 배치

#label 추가
kubectl label node {노드명} {key}={value}

#label 삭제
kubectl label node {노드명} {key}-

Node Affinity

- 노드 셀렉터와 비슷하게 노드의 레이블을 기반으로 Pod 배치

- 노드 셀렉터는 = 조건만 가능하지만 어피니티는 &&, || 조건도 가능하다 (이 때문에 노드 셀렉터에서 어피니티로 넘어가는 경우가 많다고 한다.)

- 필드 : 

requiredDuringSchedulingIgnoredDuringExecution : '스케쥴링하는 동안 꼭 필요한' 조건

preferredDuringSchedulingIgnoredDuringExecution : '스케쥴링하는 동안 만족하면 좋은' 조건

Taint

- 노드에 설정한다.
- 특정 파드가 배포될 때, taint 설정이 되어 있으면 해당 노드에 배포가 되지 않는다.
- master노드는 taint가 항상 걸려있음

Toleration

pod에 설정, taint가 걸려있는 마스터노드에 배포하고 싶을 때 사용
마스터 노드에도 배포된다. 마스터 노드에는 부하를 주지 않기위해 배포를 하지 않는게 일반적이지만 비교적 다른 노드에 비해 다운이 되지 않는 편이라 의도적으로 배포할 수도 있음

Cordon

- 노드에 더이상 배포가 되지 않도록 하는 것
- 스케쥴링에서 제외함

Drain

- 노드 안에 있는 pod를 다른 노드로 옶긴다 
- drain하면 자동으로 cordon도 실행됨
- drain할 때 에러가 나는 경우가 있는데 이때는 대부분 데몬셋 때문에 에러가 발생하는 것
- 데몬셋으로 배포하면 모든 노드에 하나씩 배포된다 이를 방지하기 위해서는 ignore 옵션을 추가해 drain 한다.


롤링(rolling) 업데이트

- Pod를 순차적으로 업그레이드 한다.

- 새 Replica Set을 만들고 이전 Replica Set의 Replica를 감소 시키면서 새 Replica의 수를 증가 시키는 방식

- 업데이트가 진행되는 동안, 구 버전과 신 버전이 함께 존재한다

Blue/Green 업데이트

- 레드 블랙 업데이트라고 하기도 함

- 구 버전과 동일한 환경으로 신 버전을 전부 구축한 후 로드 밸런서를 수정하여 신 버전으로 한 번에 업데이트 하는 방식

- 신속한 롤백이 가능

- 업데이트를 준비하고 진행하는 과정 동안에 시스템 자원이 두 배로 필요하다

카나리(Canary) 업데이트

- 일부 사용자에게만 신 버전을 테스트 한 후, 그 다음에 모든 사용자에게 업데이트를 진행하고자 할 때 사용

- 구 버전의 트래픽 일부를 신 버전으로 유입하여 테스트 하고 이상이 없을 시 전환하는 방식

- 일부 사용자에게만 새로운 기능이나 달라진 UI가 표출되고 사용자가 새로고침하면 기존 버전에 다시 로드 밸런싱 될 수 있어 UI/UX에 대한 사용자 반응성 테스트를 진행하기 힘들다

만약, 카나리 업데이트로 UI/UX에 대한 사용자 반응성 테스트를 하고자 한다면 사용자와 서버를 1:1 매칭 시키는 스티키 세션을 사용해야 한다.

롤링 업데이트와 카나리 업데이트의 차이

언듯 보기엔 둘다 같은 방식으로 느껴지겠지만 차이점이 있다.

롤링 업데이트의 경우 블루그린 업데이트 보다 자원을 적게 사용하면서 빠르게 업데이트를 할 수 있도록 최소한의 오버헤드를 통해 업데이트를 진행한다. 즉, 문제가 있는 신 버전일 경우 사용자에게 빠르게 노출된다는 문제점이 있다.

 

하지만 카나리 업데이트의 경우, 일부 유저의 트래픽을 신 버전에 테스트 하면서 문제가 있는 신 버전일 경우 비교적 적은 사용자에게 노출된 상태로 파악할 수 있다는 차이점이 있다.

 

 

참고 : 

pod배치전략

 

Kubernetes Pod 배치전략, NodeSelector에 대해 이해하고 실습해보기

- minikube로 멀티노드 클러스터 구성을 이해하고 실습한다. - NodeSelector에 대해 이해하고 실습한다.

velog.io

노드어피니티

 

[k8s] 파드 스케쥴링 - Node Affinity(노드 어피니티)

Node Affinity 노드 어피니티(Node Affinity)는 노드 셀렉터와 비슷하게 노드의 레이블을 기반으로 파드를 스케쥴링합니다. 노드 어피니티와 노드셀렉터를 함께 설정할 수도 있으며, 이 때는 노드 어피

kimjingo.tistory.com

업데이트방식

 

[Kubernetes] 쿠버네티스 배포 전략: 롤링(rolling) vs Blue/Green vs Canary 업데이트

시나리오 쿠버네티스에서 배포한 애플리케이션 코드가 수정되었거나, 보안 취약점을 수정하기 위해 패치를 했다고 가정해보자. 이 경우에는 버전 업데이트를 위해서 새 파드가 생성되어야 한

cn-c.tistory.com