발표

53일차 발표

김영재0412 2022. 7. 1. 17:09
  • [C181] 디플로이먼트가 지원하는 배포 전략에서 블루/그린이나 카나리는 찾아볼 수 없습니다. 어떻게 블루/그린이나 카나리 배포를 할 수 있을까요?

 

블루-그린 배포

블루-그린 배포 를 사용하면 모든 포드에서 애플리케이션의 기존 버전을 한 번에 교체할 ​​수 있다.

  1. 애플리케이션의 버전 1이 이미 배포되있는 상태이다.
  2. 애플리케이션 버전 2를 컨테이너 이미지 리포지토리에 푸시합니다.
  3. 애플리케이션의 버전 2를 새 포드 그룹에 배포합니다. 버전 1과 2 포드는 이제 병렬로 실행됩니다. 그러나 버전 1만 외부 클라이언트에 노출되어있다.
  4. 버전 2에서 내부 테스트를 실행하고 출시할 준비가 되었는지 확인합니다.
  5. 스위치를 돌리면 클러스터 앞의 수신 컨트롤러가 버전 1 팟(Pod)에 대한 트래픽 라우팅을 중지하고 버전 2 팟(Pod)으로 라우팅을 시작합니다.

장점

  • RollingUpdate와 달리 기존앱에서 새로운앱으로 바로 이전이 가능하다.
  • 이전 앱과 새로 배포할 앱을 테스트 할 수 있다.
  • 새로운 앱에서 문제가 발생할 때 이전 버전으로 빠르게 롤백할 수 있다.

단점

  • 두 배의 리소스가 필요함으로 인프라 비용이 증가할 수 있다.
  • PaaS 솔루션이나 argo 같은 도구를 사용하지 않으면 배포하기가 까다롭다.

 

Kubernetes는 기본적으로 블루/그린 배포 기능을 제공하지 않으며 Istio, Nginx 또는 Argo 와 같은 도구를 사용하여 Blue/Green 배포를 많이 진행한다.

 

먼저, 블루 yaml과 그린 yaml를 만들어준다.

 

 

그 후 다음명령어를 통해 디플로이먼트를 배포한다.

$ kubectl apply -f echo-version-blue.yaml
$ kubectl apply -f echo-version-green.yaml

그 후 서비스 야멜을 만든다.

echo-version-service.yaml

처음엔 blue버젼인 0.1이다.

 

셀렉터 레이블을 변경해 디플로이먼트를 변경할 수 있다. 

 

위의 명령어를 입력하여 서비스 대상 디플로이먼트를 변경할 수 있다.

 

그 후는 2.0이 뜨는걸 확인 할 수 있다.

 

 

카나리 배포

카나리 배포 는 모든 필수 애플리케이션 코드 및 종속성을 포함하는 기존 배포의 업그레이드된 버전이며 새로운 기능 및 업그레이드를 테스트하여 프로덕션 환경을 처리하는 방법을 확인하는 데 사용된다.

 

카나리아 배포를 Kubernetes 클러스터에 추가하면 선택기  레이블 을 통해 서비스에서 관리합니다 . 서비스는 지정된 레이블이 있는 팟(Pod)으로 트래픽을 라우팅하며 이를 통해 배포를 쉽게 추가하거나 제거할 수 있습니다.

 

카나리아가 받는 트래픽의 양은 카나리아가 회전하는 포드 수에 해당합니다. 대부분의 경우 먼저 카나리아로 더 적은 비율의 트래픽을 라우팅하고 시간이 지남에 따라 수를 늘립니다.

 

두 배포가 모두 설정되면 카나리아 동작을 모니터링하여 문제가 발생하는지 확인합니다. 요청 처리 방식에 만족하면 모든 배포를 최신 버전으로 업그레이드할 수 있습니다.

 

 

 

먼저, name=mainui version=stable 버전의 pod를 생성한다.

 

 

그 후 서비스와 카나리 또한 생성한다.

stable, canary 버전이 공존해 있으면서 배포된 것을 확인할 수 있다.

 

 

그 후 문제가 없으면 canary의 pod을 늘리고 확인한다.

 

앤드포인트가 4개가 된 걸 확인할 수 있다.

 

그 후 기존 버전을 삭제한다.

 

 

 

 

 

https://kkimsangheon.github.io/2019/06/15/kube17/

https://yscho03.tistory.com/72

 

 

 

 

 

  • [C182] 서비스의 타입은 ClusterIP, NodePort, LoadBalancer, ExternalName 네 가지가 있습니다. 이들은 어떻게 다른가요

 

 clusterIP

클러스터 IP는 기본 서비스 유형으로, 클러스터 내부의 IP 주소에 서비스를 노출하는 데 사용됩니다. 클러스터 내에서만 액세스가 허용되기때문에 외부에서는 이용할 수 없습니다.

NodePort

NodePort는 모든 클러스터 노드의 열린 포트입니다. Kubernetes는 해당 노드에서 서비스가 실행되고 있지 않더라도 NodePort로 들어오는 트래픽을 서비스로 라우팅합니다. NodePort는 로드 밸런서와 같은 다른 상위 레벨 수신 방법을 위한 기반으로 고안되었으며 개발에 유용합니다.

 

즉, 노드의 지정된 포트를 할당하는 방식입니다. node1:8080, node2:8080 이런방식으로 노드에 상관없이 포트번호만 서비스에 지정된걸 사용하면 접근이 가능합니다. 특이한 점은 포드가 node1에만 떠 있고 node2에는 없다고 하더라도 node2:8080으로 접근하면 node1에 떠 있는 포드로 연결이 가능합니다. 클러스터외부에서 클러스터내부의 포드로 접근할때 사용할 수 있는 가장 간단한 방법입니다.

 

ExternalName

ExternalName 서비스는 다른 Kubernetes 서비스와 유사합니다. 그러나 clusterIP 주소를 통해 액세스하는 대신 서비스를 생성할 때 externalName: 매개변수에 정의된 값으로 CNAME 레코드를 반환합니다.

 

클러스터 내부에서 외부로 접근할때 주로 사용하며 외부로 접근할때 사용하는 값이기 때문에 설정할때 셀렉터가 필요 없습니다.

 

 

 

LoadBalancer

AWS 또는 Azure와 같은 퍼블릭 클라우드 제공자 에서 실행되는 클러스터 의 경우 LoadBalancer 서비스를 생성하면 clusterIP 서비스와 동등한 기능을 제공하여 클라우드 제공자에 특정한 외부 로드 밸런서로 확장합니다. Kubernetes는 자동으로 로드 밸런서를 생성하고, 필요한 경우 방화벽 규칙을 제공하고, 클라우드 공급자가 할당한 외부 IP 주소로 서비스를 채웁니다.

 

포드를 클라우드에서 제공해주는 로드밸런서와 연결해서 그 로드밸런서의 IP를 이용해서 클러스터 외부에서 접근이 가능하게 해줍니다

 

 

https://arisu1000.tistory.com/27838

 

https://www.vmware.com/topics/glossary/content/kubernetes-services.html

'발표' 카테고리의 다른 글

62일차 발표  (0) 2022.07.13
56일차 발표  (0) 2022.07.05
49일차 발표  (0) 2022.06.24
45일차 발표  (0) 2022.06.20
44일차 발표  (0) 2022.06.17