Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-upgrading-your-clusters-with-zero-downtime

2018 년 6 월 1 일

Info

Table of Contents

보안과 성능을 최적화하기 위해 애플리케이션을 최신 상태로 유지하는 것이 좋은 방법이라는 것을 누구나 알고 있습니다. Kubernetes 및 Docker를 사용하면 업데이트로 새 컨테이너를 빌드하고 비교적 쉽게 배포 할 수 있으므로 이러한 업데이트를 훨씬 쉽게 수행 할 수 있습니다.

애플리케이션과 마찬가지로 Kubernetes는 새로운 기능과 보안 업데이트를 지속적으로 받고 있으므로 기본 노드와 Kubernetes 인프라도 최신 상태로 유지해야합니다.

이 Kubernetes 권장 사항 에피소드에서는 Google Kubernetes Engine 이 Kubernetes 클러스터를 손쉽게 업그레이드 할 수 있는 방법을 살펴 보겠습니다 .

클러스터의 두 부분

클러스터를 업그레이드 할 때 업데이트해야하는 두 부분 인 마스터와 노드가 있습니다. 먼저 마스터를 업데이트 한 다음 노드를 따라갈 수 있습니다. Kubernetes Engine을 사용하여 두 가지를 모두 업그레이드하는 방법을 살펴 보겠습니다.

다운 타임없이 마스터를 업그레이드하면
Kubernetes Engine이 포인트 릴리스가 출시 될 때 마스터를 자동으로 업그레이드하지만 일반적으로 새 버전 (예 : 1.7에서 1.8)으로 자동으로 업그레이드되지 않습니다. 새 버전으로 업그레이드 할 준비가되면 Kubernetes Engine 콘솔에서 마스터 업그레이드 버튼을 클릭하기만 하면됩니다.

그러나 대화 상자에 다음 내용이 표시됩니다.

“마스터 버전을 변경하면 몇 분의 제어 플레인 다운 타임이 발생할 수 있습니다. 이 기간 동안에는이 클러스터를 편집 할 수 없습니다. "

...

그렇다면 다운 타임없이 마스터를 업데이트하는 방법은 무엇입니까?

Kubernetes Engine 지역 클러스터가있는 고 가용성 마스터

표준 '영역'Kubernetes Engine 클러스터에는이를 지원하는 마스터 노드가 하나만 있지만 다중 영역의 고 가용성 마스터를 제공하는 '지역'클러스터를 만들 수 있습니다.

...

그리고 그게 다야! Kubernetes Engine은 부하 분산 된 IP 주소 뒤에 마스터가있는 세 영역에 노드와 마스터를 자동으로 생성하므로 Kubernetes API는 업그레이드 중에 계속 작동합니다.

다운 타임없이 노드 업그레이드

노드를 업그레이드 할 때 사용할 수있는 몇 가지 다른 전략이 있습니다. 집중하고 싶은 두 가지가 있습니다.

  1. 롤링 업데이트
  2. 노드 풀을 사용한 마이그레이션

롤링 업데이트

Kubernetes 노드를 업데이트 하는 가장 간단한 방법은 롤링 업데이트를 사용하는 것입니다. 이는 Kubernetes Engine이 노드를 업데이트하는 데 사용하는 기본 업그레이드 메커니즘입니다.

...

롤링 업데이트의 완전 자동화 된 특성으로 인해 쉽게 수행 할 수 있지만 프로세스에 대한 제어 권한이 떨어집니다. 롤링 업데이트를 중지 한 다음 실행 취소해야하므로 문제가있는 경우 이전 버전으로 롤백하는데도 시간이 걸립니다.

노드 풀을 사용한 마이그레이션
롤링 업데이트 에서처럼 '활성'노드 풀을 업그레이드하는 대신 새 노드 풀을 만들고 모든 노드가 실행될 때까지 기다린 다음 한 번에 하나의 노드로 워크로드를 마이그레이션 할 수 있습니다.

현재 Kubernetes 클러스터에 3 개의 VM이 있다고 가정 해 보겠습니다. 다음 명령으로 노드를 볼 수 있습니다.

Code Block
kubectl get nodes
NAME                                        STATUS  AGE
gke-cluster-1-default-pool-7d6b79ce-0s6z    Ready   3h
gke-cluster-1-default-pool-7d6b79ce-9kkm    Ready   3h
gke-cluster-1-default-pool-7d6b79ce-j6ch    Ready   3h

새 노드 풀 만들기
'pool-two'라는 이름으로 새 노드 풀 을 만들려면 다음 명령어를 실행하세요.

Code Block
gcloud container node-pools create pool-two

...

그러나 포드는 여전히 이전 노드에 있습니다! 이동합시다.

이전 풀 비우기
이제 작업을 새 노드 풀로 이동해야합니다. 롤링 방식으로 한 번에 하나의 노드 위로 이동합시다.

첫째, 막 으면 이전의 각 노드를. 이렇게하면 새 포드가 예약되지 않습니다.

...

마이그레이션 중에 문제가있는 경우 이전 풀의 연결을 해제 한 다음 새 풀을 연결하고 비우십시오. 포드가 이전 풀로 다시 예약됩니다.

이전 풀 삭제
모든 포드가 안전하게 다시 예약되면 이전 풀 을 삭제할 차례입니다.

"default-pool"을 삭제할 풀로 바꿉니다.

Code Block
gcloud container node-pools delete default-pool

모든 노드를 성공적으로 업데이트했습니다!

결론

Kubernetes Engine을 사용하면 몇 번의 클릭만으로 Kubernetes 클러스터를 최신 상태로 유지할 수 있습니다.

...