개요
쿠버네티스는 클러스터로 관리된다. 클러스터란 여러 노드가 모여 하나의 시스템처럼 동작하는 것을 말한다. 쿠버네티스의 경우엔 여러 쿠버네티스 컴포넌트가 모여서 하나의 시스템처럼 동작한다고 말 할 수 있다.
모든 쿠버네티스 클러스터는 여러 노드 내부에서 컨테이너화된 애플리케이션을 구동시키며, 최소 1개의 노드가 존재한다. 노드 안에서는 파드
라는 컴포넌트를 호스팅한다. 파드
는 애플리케이션의 워크로드를 구성하는 컴포넌트라고 할 수 있다.
운영환경에서 컨트롤 플레인은 여러 컴퓨터 걸쳐 실행되며, 클러스터는 여러 노드를 실행하게 된다. 이를 통해 고가용성과 내결함성을 확보하게 된다.
컨트롤 플레인 컴포넌트
컨트롤 플레인 컴포넌트는 쿠버네티스 클러스터 전역적인 의사결정을 담당한다. 디플로이먼트의 최소 레플리카 수를 유지하기 위해 새 파드
를 실행하거나, 파드에 장애가 발생할 경우에 대응하는 등 전체 클러스터에서 워크로드가 예상한대로 잘 동작할 수 있도록 해준다. 컨트롤 플레인은 여러 컴퓨터에 걸쳐서 구동되거나 아니면, 한 컴퓨터에서 구동될 수도 있다. 보통은 가능한 한 컴퓨터 내에서 여러 컨트롤 플레인을 구동한다. 다만, 고가용성을 위해선 여러 컴퓨터에 분산시켜 구동하는게 도움이 될 수 있다.
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에 맞춰 컨트롤러를 구동시키는 걸로 보인다.