여러 영역(zone)에서 실행하기

여러 영역(zone)에서 실행하기 (Running in multiple zones)

이 페이지는 여러 영역(zone)에 걸쳐 Kubernetes를 실행하는 방법을 설명해요.

출처: 문서

본문

배경 (Background)

Kubernetes는 단일 Kubernetes 클러스터가 여러 장애 영역(failure zone)에 걸쳐 실행될 수 있도록 설계되었어요. 보통 이 영역들은 리전(region) 이라는 논리적 그룹 안에 들어가요. 주요 클라우드 프로바이더는 일관된 기능 집합을 제공하는 장애 영역(가용 영역이라고도 함)의 집합으로 리전을 정의해요. 리전 안에서 각 영역은 같은 API와 서비스를 제공해요.

일반적인 클라우드 아키텍처는 한 영역의 장애가 다른 영역의 서비스도 손상시킬 가능성을 최소화하는 것을 목표로 해요.

컨트롤 플레인 동작 (Control plane behavior)

모든 컨트롤 플레인 컴포넌트는 컴포넌트별로 복제된, 교체 가능한 리소스 풀로서 실행되는 것을 지원해요.

클러스터 컨트롤 플레인을 배포할 때는 컨트롤 플레인 컴포넌트의 복제본을 여러 장애 영역에 걸쳐 배치해요. 가용성이 중요한 문제라면, 최소한 세 개의 장애 영역을 선택하고 각 개별 컨트롤 플레인 컴포넌트(API 서버, 스케줄러, etcd, 클러스터 컨트롤러 매니저)를 최소 세 개의 장애 영역에 걸쳐 복제해요. 클라우드 컨트롤러 매니저를 실행한다면 그것도 선택한 모든 장애 영역에 복제해야 해요.

노드 동작 (Node behavior)

Kubernetes는 DeploymentStatefulSet 같은 워크로드 리소스의 파드를 클러스터의 서로 다른 노드에 자동으로 분산시켜요. 이 분산은 장애 영향을 줄이는 데 도움이 돼요.

노드가 시작되면 각 노드의 kubelet이 Kubernetes API에서 그 특정 kubelet을 나타내는 Node 객체에 라벨을 자동으로 추가해요. 이 라벨에는 영역 정보가 포함될 수 있어요.

클러스터가 여러 영역이나 리전에 걸쳐 있다면, 노드 라벨을 파드 토폴로지 분산 제약과 함께 사용해 파드가 리전, 영역, 특정 노드 같은 장애 도메인 간에 어떻게 분산될지 제어할 수 있어요. 이런 힌트는 스케줄러가 더 나은 기대 가용성을 위해 파드를 배치하게 해주며, 상관관계가 있는 장애가 전체 워크로드에 영향을 줄 위험을 줄여줘요.

예를 들어, 가능할 때마다 StatefulSet의 복제본 3개가 모두 서로 다른 영역에서 실행되도록 제약을 설정할 수 있어요. 각 워크로드에 어떤 가용 영역이 사용되는지 명시적으로 정의하지 않고도 이 제약을 선언적으로 정의할 수 있어요.

영역 간 노드 분산

Kubernetes 코어는 노드를 직접 만들지 않아요. 직접 만들거나, Cluster API 같은 도구를 사용해 노드를 대신 관리해야 해요.

Cluster API 같은 도구를 사용하면 여러 장애 도메인에 걸쳐 클러스터의 워커 노드로 실행할 머신 집합과, 전체 영역의 서비스 중단 시 클러스터를 자동 복구하는 규칙을 정의할 수 있어요.

파드의 수동 영역 할당

생성하는 파드뿐 아니라 Deployment, StatefulSet, Job 같은 워크로드 리소스의 파드 템플릿에도 노드 셀렉터 제약을 적용할 수 있어요.

영역 스토리지 접근

영구 볼륨이 생성되면 Kubernetes는 특정 영역에 연결된 PersistentVolume에 영역 라벨을 자동으로 추가해요. 그런 다음 스케줄러NoVolumeZoneConflict 조건을 통해 주어진 PersistentVolume을 요청하는 파드가 그 볼륨과 같은 영역에만 배치되도록 보장해요.

영역 라벨을 추가하는 방법은 클라우드 프로바이더와 사용 중인 스토리지 프로비저너에 따라 달라질 수 있으니 주의해야 해요. 올바른 구성을 위해 항상 사용 환경의 특정 문서를 참고해요.

PersistentVolumeClaim에 대해, 해당 클래스의 스토리지가 사용할 수 있는 장애 도메인(영역)을 지정하는 StorageClass를 지정할 수 있어요. 장애 도메인 또는 영역을 인식하는 StorageClass 구성에 대해 배우려면 허용된 토폴로지(Allowed topologies)를 참고해요.

네트워킹 (Networking)

Kubernetes 자체는 영역 인식 네트워킹을 포함하지 않아요. 네트워크 플러그인으로 클러스터 네트워킹을 구성할 수 있는데, 그 네트워크 솔루션에 영역 특화 요소가 있을 수 있어요. 예를 들어 클라우드 프로바이더가 type=LoadBalancer 서비스를 지원한다면, 로드밸런서는 특정 연결을 처리하는 로드밸런서 요소와 같은 영역에서 실행되는 파드에만 트래픽을 보낼 수도 있어요. 자세한 내용은 클라우드 프로바이더 문서를 확인해요.

사용자 지정 또는 온프레미스 배포에도 비슷한 고려 사항이 적용돼요. ServiceIngress 동작(서로 다른 장애 영역 처리 포함)은 클러스터가 정확히 어떻게 설정되어 있는지에 따라 달라져요.

장애 복구 (Fault recovery)

클러스터를 설정할 때, 한 리전의 모든 장애 영역이 동시에 오프라인이 되면 설정이 서비스를 복구할 수 있는지도 고려해야 해요. 예를 들어, 영역에 파드를 실행할 수 있는 노드가 최소 하나 있다는 것에 의존하나요? 클러스터에 중요한 복구 작업이 클러스터에 최소 하나의 정상 노드가 있다는 것에 의존하지 않도록 해야 해요. 예를 들어 모든 노드가 비정상이면, 복구가 최소한 하나의 노드를 서비스에 투입할 수 있을 만큼 완료될 수 있도록 특별한 톨러레이션(toleration)이 있는 복구 Job을 실행해야 할 수도 있어요.

Kubernetes는 이 문제에 대한 정답을 제공하지 않지만, 고려해야 할 사항이에요.

다음 단계

스케줄러가 구성된 제약을 존중하며 클러스터에 파드를 배치하는 방법을 배우려면 스케줄링과 축출(Scheduling and Eviction)을 방문해요.

더 알아보기 (Learn more)