Control Plane과 Node — 클러스터를 이루는 두 축
Kubernetes 공식 문서(kubernetes.io) 및 운영 블로그 종합 — 아키텍처부터 스케줄링까지 (웹 리서치, 2026) — Kubernetes 공식 문서(concepts/overview/components, workloads/pods, services-networking, pod-qos, pod-lifecycle) + 운영 블로그(Komodor, Datadog 등) 교차 확인 Kubernetes 공식문서 Components of Kubernetes
이 모듈을 다 읽으면
- Control Plane 4대 컴포넌트(API server/etcd/scheduler/controller-manager)가 각각 무엇을 하는지 설명할 수 있다
- Node 컴포넌트(kubelet/kube-proxy/컨테이너 런타임)가 Pod를 실제로 어떻게 실행·유지하는지 설명할 수 있다
Kubernetes 클러스터가 '무엇을 원하는 상태로 만들지 결정하는 두뇌'(Control Plane)와 '실제로 컨테이너를 돌리는 몸'(Node)으로 나뉘어 있다는 것을 전제로, 각 축의 핵심 컴포넌트 역할을 정리한다.
Control Plane — kube-apiserver, etcd, scheduler, controller-manager
kube-apiserver는 Kubernetes HTTP API를 노출하는 핵심 컴포넌트로, 클러스터의 모든 상호작용(kubectl 명령, 컴포넌트 간 통신 포함)이 이곳을 거친다. etcd는 클러스터의 모든 상태(어떤 리소스가 있고 어떤 상태여야 하는지)를 저장하는 일관되고 고가용한 key-value 저장소다. kube-scheduler는 아직 노드에 배정되지 않은 Pod를 찾아 적합한 노드에 할당하는 역할을 하고, kube-controller-manager는 여러 컨트롤러(예: ReplicaSet 컨트롤러, Deployment 컨트롤러)를 실행해 Kubernetes API가 선언한 '원하는 상태'를 실제로 구현한다.
핵심 포인트
- kube-apiserver: 모든 클러스터 상호작용이 거치는 HTTP API 진입점
- etcd: 클러스터 전체 상태를 저장하는 일관·고가용 key-value 저장소
- kube-scheduler: 아직 배정 안 된 Pod를 적합한 노드에 할당, kube-controller-manager: 여러 컨트롤러로 '원하는 상태'를 실제 구현
Node — kubelet, kube-proxy, 컨테이너 런타임
각 워커 노드에서는 kubelet이 그 노드에 배정된 Pod들이 실제로(컨테이너까지 포함해) 정상 실행 중인지 보장하는 핵심 에이전트 역할을 한다 — 노드를 API 서버에 등록하고, Pod 명세를 감시해 컨테이너를 기동·유지하며, 노드/Pod 상태를 컨트롤 플레인에 보고한다. kube-proxy는 노드에 네트워크 규칙을 유지해 Service 추상화(가상 IP, 트래픽 라우팅)를 구현한다. 컨테이너 런타임(containerd, CRI-O 등)은 실제로 이미지를 받아오고 컨테이너를 시작·중지하는 하위 계층이다.
핵심 포인트
- kubelet: 노드에 배정된 Pod의 컨테이너가 실제로 정상 실행 중인지 보장하는 핵심 에이전트, 상태를 컨트롤 플레인에 보고
- kube-proxy: 노드에 네트워크 규칙을 유지해 Service의 가상 IP·트래픽 라우팅 구현, 컨테이너 런타임: 이미지 pull+컨테이너 시작/중지 담당
Pod 스케줄링의 전체 흐름 — 컴포넌트들이 실제로 어떻게 협력하는가
새 Pod가 생성되면 API 서버가 이를 etcd에 저장하고, 스케줄러가 아직 노드가 안 정해진 Pod를 찾아 적합한 노드를 결정해 API 서버에 기록한다. 그 노드의 kubelet이 이 배정을 감지해 컨테이너 런타임에게 이미지를 받아 컨테이너를 시작하도록 지시한다. 이후 Pod가 죽으면(예: 크래시) 컨트롤러(ReplicaSet 컨트롤러 등)가 '원하는 replica 수'와 '실제 상태'의 차이를 감지해 대체 Pod 생성을 API 서버에 요청하는 식으로 전체 루프가 계속 돈다.
핵심 포인트
- 생성→API서버가 etcd 저장→스케줄러가 노드 결정→해당 노드 kubelet이 컨테이너 런타임으로 실행 지시, 이후 컨트롤러가 원하는 상태와의 차이를 계속 감시·보정