쿠버네티스 클러스터를 구성하면 최소 한개 이상의 워커노드를 가지게 되고, 워커 노드에 컨테이너화된 애플리케이션을 실행 하게된다.
컨트롤 플레인은 워커노드와 클러스터 내 파드를 관리한다.
컨트롤 플레인 컴포넌트는 클러스터에 관한 전반적인 결정(스케줄링)을 수행하고 클러스터 이벤트를 감지하고 반응한다.
(ex, 디플로이먼트의 replicas 필드에 대한 요구 조건이 충족되지 않을 경우 새로운 파드를 구동시키는 것, 컨트롤러)
컨트롤 플레인 컴포넌트는 클러스터 내 어떠한 머신에서든지 동작할 수 있지만 간결성을 위하여, 보통 동일 머신 상에 모든 컨트롤 플레인 컴포넌트를 구동시킨다.
사용자 컨테이너는 해당 머신 상에 동작시키지 않는다.(마스터노드, 워커노드 분리)
kubeadm을 통해 여러 노드에서 컨트롤 플레인을 설정하여 고가용성 클러스터를 구성한다.
API 서버는 쿠버네티스 API를 노출하는 쿠버네티스 컨트롤 플레인 컴포넌트이다.
쿠버네티스의 frontend로 클러스터 내의 모든 요청 및 명령을 처리하는 핵심 구성요소 이다.
클러스터 관리자나 사용자가 쿠버네티스와 상호 작용하기 위한 주요 진입점이고 이를 통해 리소스의 생성, 조회, 수정, 삭제 등의 작업을 수행한다.
요청은 Kube-apiserver에서 사용자 인증(user authenticate)을 거친 후 ETCD에 저장된다.
Etcd는 분산 키-값 저장소로, Kubernetes 클러스터 구성 정보와 상태 정보를 안정적으로 저장하고 관리한다.
Kubectl command에서 얻을 수 있는 모든 정보는 마스터 노드의 ETCD 서버가 제공 한다.
노드를 추가할 때, 파드를 배포할 때 등 상태가 변화할 때 ETCD 서버에 지속 업데이트 된다.
새로 생성 될 파드를 어느 노드에 생성할지 결정하는 역할을 수행한다.
모든 파드는 scheduler를 통해 최적의 노드가 결정되고 실행된다.
스케줄링 결정을 위해서 고려되는 요소는 리소스에 대한 개별 및 총체적 요구 사항, 하드웨어/소프트웨어/정책적 제약, 어피니티(affinity) 및 안티-어피니티(anti-affinity) 명세, 데이터 지역성, 워크로드-간 간섭, 데드라인을 포함한다.
Controller는 kube-apiserver를 통해 클러스터의 상태를 확인하고 현재 상태를 변경하는 역할 수행한다.
Controller-manager는 이런 Controller들을 관리한다.
Replication Controller: 파드개수 보장해주는 베이직한 컨트롤러
Replicaset: Replication Controller + 풍부한 Label을 지원
Deployment: Replicaset을 제어(Rolling update, Roll back)
DaemonSet: 노드당 1개씩 실행되도록 보장
StatefulSet: 파드의 이름을 보장
Job: 배치처리에 유용한 파드의 정상적인 종료를 관리
CronJob: Job예약 스케쥴링 예약 사용 지원
노드 컨트롤러: 노드가 다운되었을 때 통지와 대응에 관한 책임을 가진다.
잡 컨트롤러: 일회성 작업을 나타내는 잡 오브젝트를 감시한 다음, 해당 작업을 완료할 때까지 동작하는 파드를 생성한다.
엔드포인트슬라이스 컨트롤러: (서비스와 파드 사이의 연결고리를 제공하기 위해) 엔드포인트슬라이스(EndpointSlice) 오브젝트를 채운다
서비스어카운트 컨트롤러: 새로운 네임스페이스에 대한 기본 서비스어카운트(ServiceAccount)를 생성한다.
노드 컴포넌트는 동작 중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공하며, 모든 노드 상에서 동작한다.
클러스터의 각 노드에서 실행되는 에이전트로 Kubelet은 파드에서 컨테이너가 동작하도록 조작하고 관리한다.
클러스터의 각 노드에서 데몬셋으로 실행되는 네트워크 프록시로, 쿠버네티스의 서비스 개념의 구현부이다.
kube-proxy는 노드의 네트워크 규칙을 유지 관리한다. 이 네트워크 규칙이 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 해준다.
컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어이다.
쿠버네티스는 containerd, CRI-O와 같은 컨테이너 런타임 및 모든 Kubernetes CRI (컨테이너 런타임 인터페이스) 구현체를 지원한다.