컨트롤 플레인 컴포넌트

2024년 06월 12일 작성10분 소요

개요

쿠버네티스는 클러스터로 관리된다. 클러스터란 여러 노드가 모여 하나의 시스템처럼 동작하는 것을 말한다. 쿠버네티스의 경우엔 여러 쿠버네티스 컴포넌트가 모여서 하나의 시스템처럼 동작한다고 말 할 수 있다.

모든 쿠버네티스 클러스터는 여러 노드 내부에서 컨테이너화된 애플리케이션을 구동시키며, 최소 1개의 노드가 존재한다. 노드 안에서는 파드라는 컴포넌트를 호스팅한다. 파드는 애플리케이션의 워크로드를 구성하는 컴포넌트라고 할 수 있다.

운영환경에서 컨트롤 플레인은 여러 컴퓨터 걸쳐 실행되며, 클러스터는 여러 노드를 실행하게 된다. 이를 통해 고가용성과 내결함성을 확보하게 된다.

The components of a kubernetes cluster

컨트롤 플레인 컴포넌트

컨트롤 플레인 컴포넌트는 쿠버네티스 클러스터 전역적인 의사결정을 담당한다. 디플로이먼트의 최소 레플리카 수를 유지하기 위해 새 파드를 실행하거나, 파드에 장애가 발생할 경우에 대응하는 등 전체 클러스터에서 워크로드가 예상한대로 잘 동작할 수 있도록 해준다. 컨트롤 플레인은 여러 컴퓨터에 걸쳐서 구동되거나 아니면, 한 컴퓨터에서 구동될 수도 있다. 보통은 가능한 한 컴퓨터 내에서 여러 컨트롤 플레인을 구동한다. 다만, 고가용성을 위해선 여러 컴퓨터에 분산시켜 구동하는게 도움이 될 수 있다.

kube-apiserver

kube-apiserver는 클러스터의 컨트롤 플레인을 제어할 수 있도록 외부에 노출된 API이다. 해당 API를 사용하가 위해 kubectl같은 커맨드 라인 툴을 사용할 수 있지만, 직접 API 엔드포인트로 컨트롤 플레인에게 요청을 전달할 수 있다.

etcd

쿠버네티스의 모든 클러스터 데이터에 대한 백업 저장소로 사용되는 키-밸류 저장소이다. 해당 저장소는 분산 시스템 혹은 여러 노드로 구성된 클러스터에 걸쳐 일관성, 고가용성을 보장한다. etcd에 데이터를 백업해두기 때문에 쿠버네티스 클러스터에 장애가 발생해도 해당 데이터를 통해 장애로부터 빠르게 회복할 수 있도록 해준다. 그러나 메모리에 데이터를 저장해두기 때문에 주기적으로 하드디스크같은 저장장치에 데이터를 기록해둬야 한다.

kube-scheduler

컨트롤 플레인 컴포넌트는 노드가 할당되지 않은 파드가 새로생긴다면 가용한 노드를 할당하여 실행시킨다. 파드에 노드를 할당할 때 영향을 미치는 요소들은 다음과 같다.

  • 자원요구량
  • 하드웨어, 소프트웨어, 정책 상에 제약
  • 선호도
  • 데이터 지역성
  • 워크로드간 간섭
  • 데드라인

kube-control-manager

컨트롤러 프로세스들을 실행하는 컨트롤 플레인 내부 컴포넌트다. 논리적으론 여러 컨트롤러는 독립된 프로세스지만, 복잡성을 줄이기 위해 하나의 이진파일(binary)로 컴파일되며, 단일 프로세스로 실행된다. 컨트롤러는 역할에 따라 아래와 같은 세부유형이 나뉜다.

  • 노드 컨트롤러: 노드가 실행되거나 종료되는 이벤트를 감지하는데 책임이 있다.
  • 레플리카 컨트롤러: 레플리카셋의 상태를 모니터링하고 의도한 수만큼 파드가 유지될 수 있도록 합니다.
  • 잡 컨트롤러: 일회성 작업을 실행해야 될 대, 해당 작업을 실행할 파드를 생성한다.
  • 엔드포인트슬라이스 컨트롤러: 서비스와 파드간에 링크를 제공하기위한 엔드포인트슬라이스 오브젝트를 생성한다. 엔드포인트슬라이스는 클러스터 내부 네트워크 엔드포인트를 추적하는 방법을 제공한다.
  • 서비스어카운트 컨트롤러: 새 네임스페이스를 위한 기본 서비스어카운트를 생성한다.
  • 디플로이먼트 컨트롤러: 디플로이먼트가 의도한대로 동작하도록 관리합니다. 파드 스펙에 맞게 디플로이먼트 내 파드를 동작시키고, 어떠한 볼륨이 파드와 연결되어야 하며, 새 버전을 점차적으로 레플리카셋에 배포하는 등의 작업을 진행합니다.

cloud-controller-manager

클라우드 환경 맞춤 로직을 제공합니다. 쿠버네티스 클러스터를 클라우드 프로바이더의 API 따라 연결할 수 있도록 합니다. 또한 클라우드 프로바이더와 상호작용하는 컴포넌트들과 그렇지 않은 컴포넌트들을 분리합니다. 만약 온프레미스로 쿠버네티스 클러스터를 구동한다면 클라우드 맞춤형 컨트롤러는 실행되지 않습니다. kube-controller-manager가 복잡성을 줄이기 위해 하나의 프로세스로 동작하는 것과 동일하게 동작하지만, 가용성과 내결함성을 확보하기 위해 수평확장 할 수 있습니다. 다음과 같은 컴포넌트들은 클라우드 프로바이더에 의존성을 갖습니다. 여기서 말하는 클라우드 프로바이더는 AWS나 GCP같은 서비스들을 말합니다.

  • 노트 컨트롤러: 노드가 응답하지 않을 때, 노드의 상태를 파악하기 위해 클라우드 프로바이더와 상호작용합니다.
  • 라우트 컨트롤러: 클라우드 인프라 상에서 라우트를 설정하기 위해 상호작용합니다.
  • 서비스 컨트롤러: 클라우드 프로바이더와 로드밸런서를 생성, 수정, 삭제하기 위해 상호작용합니다.

정리

kube-apiserver를 통해 쿠버네티스 클러스터를 제어할 수 있도록 한다. etcd 클러스터의 전체 상태를 저장하는 저장소로서 클러스터 장애 발생 시, 복구를 돕는다. kube-scheduler는 클러스터 내에서 스케줄링된 일회성 작업들을 가용한 파드 내에서 실행한다. kube-controller-manager는 여러 유형의 컨트롤러들을 실행시키는 내부 컴포넌트다. cloud-controller-manager는 클라우드 상에서 클러스터를 유지하기 위해 필요한 컨트롤러들을 관리한다. 보통 클라우드 상의 자원에 접근하기 위해 프로바이더 별로 상이한 API에 맞춰 컨트롤러를 구동시키는 걸로 보인다.