Kubernetes 아키텍처: 쿠버네티스는 어떻게 동작할까?
들어가며
Kubernetes를 공부하다 보면 수많은 개념과 용어에 둘러싸이게 됩니다. 지난 시간에는 각 개념을 하나씩 뜯어보며 기본기를 다졌다면, 이번 시간에는 그 퍼즐 조각들을 어떻게 맞춰야 하나를 배워야 할 차례입니다. 즉, Kubernetes 전체 아키텍처 구조를 통해 전체 그림을 그려보는 것이 목표입니다.
“Pod, Node, Service, Deployment… 다 알 것 같은데, 이게 어떻게 연결돼 있는 거지?”
그 물음에 정확하게 답할 수 있어야 진짜 Kubernetes 입문을 성공했다고 할 수 있습니다. 이 글을 통해 Kubernetes 클러스터가 어떻게 구성되고, 요청이 어떻게 처리되며, 각 컴포넌트가 어떤 역할을 하는지 이해하게 될 것입니다.
1. 쿠버네티스는 클러스터 기반 구조다
Kubernetes는 기본적으로 클러스터 기반 구조입니다. 클러스터는 여러 대의 서버(노드)로 구성되며, 각 노드는 물리 서버이거나 가상 머신일 수 있습니다.
클러스터는 크게 두 종류의 노드로 구성됩니다.
종류 | 설명 |
---|---|
Control Plane (제어 플레인) | 전체 클러스터를 관리하고 통제하는 컴포넌트 집합 |
Worker Node (작업 노드) | 실제로 애플리케이션이 실행되는 공간 |
즉, 사용자는 Control Plane을 통해 Kubernetes에 명령을 내리고, Kubernetes는 이를 Worker Node에 전달해 애플리케이션을 배포하거나 삭제하는 식입니다.
2. 아키텍처를 한눈에 그려보자
아래는 쿠버네티스의 전체적인 구조를 텍스트로 표현한 그림입니다:
+-----------------------------------------------------------+
| Control Plane |
| |
| +------------+ +---------------+ +--------------+ |
| | APIServer | <-> | Scheduler | -> | Controller | |
| | | | | | Manager | |
| +------------+ +---------------+ +--------------+ |
| | ^ |
| v | |
| etcd (DB) | |
+-----------------------------------------------------------+
|
v
+-----------------------------------------------------------+
| Worker Nodes (N개) |
| |
| +-------------+ +-------------+ +-------------+ |
| | Node 1 | | Node 2 | | Node 3 | ... |
| | | | | | | |
| | +---------+ | | +---------+ | | +---------+ | |
| | | kubelet | | | | kubelet | | | | kubelet | | |
| | +---------+ | | +---------+ | | +---------+ | |
| | | Pods | | | | Pods | | | | Pods | | |
| | +---------+ | | +---------+ | | +---------+ | |
| | |kube-proxy| | | |kube-proxy| | | |kube-proxy| | |
| +-------------+ +-------------+ +-------------+ |
+-----------------------------------------------------------+
3. Control Plane의 구성 요소
1) API Server
쿠버네티스의 입구입니다. 모든 요청은 이곳을 거쳐 들어오며, kubectl 명령어도 결국 API Server에 전달됩니다.
- 사용자와 클러스터의 인터페이스
- REST API 형태로 통신
- 인증/인가/검증 로직 수행
비유: 쿠버네티스의 “정문” 또는 “프론트 데스크”
2) etcd
etcd는 쿠버네티스 클러스터의 상태를 저장하는 고가용성 분산 Key-Value 데이터베이스입니다.
- 클러스터 전체 설정, 상태, 오브젝트 정보 저장
- 고가용성(H.A.) 보장
- API Server가 가장 자주 접근하는 저장소
비유: 공장의 모든 설비 및 재고 기록을 저장하는 ERP 시스템
3) Scheduler
새로운 Pod가 생성되면, Scheduler는 이를 어느 Node에 배치할지 결정합니다.
- 자원 사용률, Affinity, Taints/Tolerations 등을 고려하여 노드 선택
- Pod 스펙만 보고 실행은 하지 않음
비유: 작업 지시서를 보고 어떤 직원이 처리할지 결정하는 관리자
4) Controller Manager
클러스터 상태를 감시하고, 실제 상태와 원하는 상태를 일치시키기 위해 동작하는 자동화 로직을 수행합니다.
- DeploymentController, ReplicaSetController 등 다양한 서브 컨트롤러 포함
- 상태 불일치 감지 시 자동 복구 시도
비유: 스케줄에 따라 작업자가 작업을 빠뜨리지 않았는지 확인하는 감독관
4. Worker Node의 구성 요소
1) kubelet
Node 안에서 Pod를 실행하고 관리하는 핵심 에이전트입니다.
- API Server로부터 명령 수신
- Pod 실행, 상태 모니터링
- 상태를 주기적으로 API Server에 보고
비유: 일꾼(Node)에게 구체적인 작업 지시서를 전달하고, 작업 완료 여부를 보고하는 팀장
2) kube-proxy
Kubernetes의 네트워크 통신을 담당하는 컴포넌트입니다.
- Pod 간 네트워크 연결 설정
- Service IP와 Pod 간 연결
- IP 테이블 기반 포워딩
비유: 각 부서 간 문서를 전달해주는 메신저
3) Container Runtime
실제로 컨테이너를 실행하는 프로그램입니다. Docker, containerd, CRI-O 등이 여기에 해당합니다.
5. 실제 요청 흐름은 어떻게 되나?
kubectl apply -f app.yaml
명령을 실행한다고 가정해봅시다. 내부 흐름은 다음과 같습니다:
kubectl
이 API Server에 요청 전송- API Server가 etcd에 오브젝트 저장
- Scheduler가 적절한 Node를 선택
- 선택된 Node의 kubelet이 Pod를 생성
- Pod가 실행되고, kube-proxy가 네트워크 연결
6. 쿠버네티스는 선언형(Declarative)이다
쿠버네티스는 명령형이 아니라 선언형입니다. 즉, “어떻게”가 아니라 “무엇을 원하는지”를 선언합니다.
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: app
image: nginx
위 파일을 apply하면 쿠버네티스는 자동으로 해당 상태를 유지하려고 노력합니다. 이를 위해 Controller들이 지속적으로 상태를 감시하며 복구합니다.
7. 고가용성과 이중화
Control Plane 구성 요소는 단일 장애 지점을 만들 수 있으므로 다중 마스터 구성으로 고가용성을 보장할 수 있습니다.
- etcd는 다수결로 결정 (Raft Consensus)
- Control Plane도 복제 가능
- 노드 실패 시 Pod는 다른 노드로 재배포
8. 클라우드 vs 온프레미스 아키텍처 차이
Kubernetes는 어디서든 구동 가능하지만, 구성 방식이 조금 다릅니다.
구분 | 온프레미스 | 클라우드 |
---|---|---|
LoadBalancer | 직접 구성 | 자동 제공 |
Storage | NFS 등 수동 연결 | EBS, GCP Disk 등 자동 |
노드 추가 | 수동 설정 필요 | 자동 스케일링 가능 |
H.A 구성 | 복잡 | 관리형 Kubernetes에서 기본 제공 |
9. 정리: Kubernetes 아키텍처 요약
구성 요소 | 역할 |
---|---|
API Server | 요청 수신 및 인증, 상태 저장 요청 처리 |
etcd | 클러스터 상태 저장소 |
Scheduler | Pod → Node 배치 결정 |
Controller Manager | 실제 상태 유지 |
kubelet | Pod 생성 및 상태 보고 |
kube-proxy | 네트워크 라우팅 및 포워딩 |
Container Runtime | 컨테이너 실행 |
마무리
이번 글에서는 쿠버네티스의 내부 구조와 각 구성 요소들이 어떤 역할을 맡고 어떻게 상호작용하는지를 살펴보았습니다. 전체적인 큰 그림을 이해하는 것은 앞으로 학습을 이어가는 데 매우 중요한 발판이 됩니다.
다음 시간에는 쿠버네티스의 특징과 장점들에 대해 이야기해보겠습니다. “도대체 왜 이렇게 복잡한 구조를 써야 하나요?”에 대한 답을 드릴 차례입니다.