목차
Kubernetes란 무엇인가?
Kubernetes(줄여서 K8s)는 컨테이너화된 애플리케이션의 자동 배포, 확장, 운영을 관리하기 위한 오픈소스 플랫폼입니다. 본질적으로 Kubernetes는 수많은 서버 위에서 애플리케이션이 안정적으로 동작하도록 조율하는 오케스트레이터 역할을 하며, 개발자와 운영자의 부담을 줄여줍니다.
이번 글에서는 Kubernetes 아키텍처를 구성하는 핵심 컴포넌트인 Master, Node, Pod, Controller 각각의 역할과 동작 원리를 정리합니다. 이 글을 통해 K8s 클러스터가 어떻게 작동하는지 전체적인 흐름을 명확히 이해할 수 있을 것입니다.
Kubernetes 아키텍처 구성요소 개요
Kubernetes 클러스터는 다음의 주요 구성 요소로 나뉩니다:
- Control Plane (Master): 클러스터 전체를 관리하는 중심 역할
- Node (Worker): 실제 컨테이너가 실행되는 서버
- Pod: 컨테이너가 동작하는 최소 단위
- Controller: 리소스 상태를 관리하고 일관성을 유지하는 자동화 컴포넌트
Control Plane (Master)의 역할
Control Plane은 Kubernetes 클러스터의 두뇌 역할을 하며, 다음과 같은 컴포넌트로 구성됩니다:
1. kube-apiserver
kube-apiserver는 Kubernetes의 API 엔드포인트로, 모든 명령의 입구입니다. kubectl이나 다른 내부 컴포넌트들은 이 API를 통해 클러스터와 상호작용합니다.
2. etcd
etcd는 클러스터의 모든 상태를 저장하는 분산 Key-Value 저장소입니다. 선언적 상태, 리소스 메타데이터, 인증 정보 등 모든 설정이 여기 보관됩니다.
3. kube-scheduler
kube-scheduler는 새로운 Pod를 어느 Node에 배치할지 결정합니다. 리소스 사용량, 노드 상태, 사용자 정의 스케줄링 정책 등을 고려하여 적절한 노드를 선택합니다.
4. kube-controller-manager
kube-controller-manager는 여러 개의 Controller를 실행하여 클러스터 상태를 지속적으로 모니터링하고 필요한 작업을 수행합니다. 예: ReplicaSetController, NodeController, JobController 등
5. cloud-controller-manager
cloud-controller-manager는 클라우드 프로바이더와의 연동을 담당합니다. AWS, GCP, Azure 같은 클라우드 인프라의 리소스를 Kubernetes 리소스로 연결합니다.
Node의 역할
Node는 Kubernetes 클러스터 내에서 실제로 컨테이너가 실행되는 머신입니다. 물리 서버 또는 가상 머신일 수 있으며, 각 Node는 다음 컴포넌트를 포함합니다:
1. kubelet
kubelet은 Node에서 실행 중인 Pod들을 관리합니다. API 서버로부터 명령을 받아 Pod을 생성하거나 상태를 보고합니다.
2. kube-proxy
kube-proxy는 서비스 디스커버리와 로드 밸런싱을 담당하는 컴포넌트로, 각 Node의 네트워크 트래픽을 적절한 Pod으로 라우팅합니다.
3. Container Runtime
컨테이너를 실행시키는 엔진으로, 대표적으로 containerd, CRI-O, Docker 등이 사용됩니다. Kubernetes는 CRI (Container Runtime Interface)를 통해 다양한 런타임과 연동합니다.
Pod란?
Pod는 Kubernetes에서 컨테이너가 실행되는 가장 작은 배포 단위입니다. 일반적으로 하나의 Pod에는 하나의 컨테이너가 존재하지만, 같은 네트워크/스토리지를 공유해야 하는 경우 여러 컨테이너가 함께 배치되기도 합니다.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
Pod는 휘발성이 강하므로 일반적으로 직접 생성하기보다는 Deployment 등의 상위 리소스를 통해 관리합니다.
Controller의 역할
Controller는 Kubernetes의 핵심 자동화 기능을 담당하는 컴포넌트로, 실제 상태가 선언된 상태와 일치하도록 지속적으로 조정합니다.
1. ReplicaSet
정해진 수의 Pod가 항상 실행되도록 유지합니다. Pod가 죽으면 자동으로 재생성합니다.
2. Deployment
ReplicaSet을 관리하며, 버전 업그레이드, 롤백 등 배포 전략을 지원합니다.
3. StatefulSet
상태를 유지해야 하는 서비스 (예: DB)를 위한 컨트롤러입니다. Pod 이름, 순서, 스토리지를 보존합니다.
4. DaemonSet
모든 Node에 반드시 하나씩 Pod을 배포해야 할 때 사용합니다. (예: 로그 수집기, 모니터링 에이전트)
5. Job / CronJob
일회성 작업(Job) 또는 주기적 작업(CronJob)을 정의할 때 사용합니다.
아키텍처 동작 흐름 요약
다음은 Kubernetes 클러스터가 Pod을 실행시키는 전체 흐름입니다:
- 사용자가 kubectl로 Deployment 정의를 API 서버에 전송
- API 서버는 etcd에 상태 저장 및 컨트롤러에 이벤트 전달
- Deployment Controller는 ReplicaSet을 생성하고 필요한 수의 Pod 요청
- Scheduler가 적절한 Node를 선택
- 선택된 Node의 kubelet이 Pod 생성 및 런타임 호출
- kube-proxy가 서비스 트래픽을 해당 Pod으로 라우팅
Kubernetes 아키텍처 설계 시 고려사항
- Control Plane 이중화: API 서버, etcd는 고가용성 구성이 권장됨
- Node Pool 분리: 작업 유형에 따라 태그/라벨로 분리 가능
- 리소스 제한 설정: CPU/메모리 limit 설정은 오버프로비저닝 방지에 필수
- 보안 정책 적용: RBAC, PodSecurityPolicy, NetworkPolicy 적용 필요
실무 예시: Nginx Deployment 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
위의 Deployment는 3개의 nginx Pod를 생성하며, ReplicaSet과 Pod은 자동으로 생성됩니다.
결론 요약
Kubernetes 아키텍처는 Control Plane, Node, Pod, Controller라는 핵심 구성 요소를 중심으로 설계되어 있으며, 각 요소는 유기적으로 동작하면서 컨테이너 기반 애플리케이션의 안정적인 운영을 지원합니다. 이를 정확히 이해하고 활용한다면, DevOps 및 클라우드 네이티브 환경에서 더욱 탄력적이고 확장 가능한 시스템을 구축할 수 있습니다.
Master, Node, Pod, Controller의 역할을 정확히 이해하면, K8s 클러스터의 디버깅, 성능 최적화, 보안 설정까지 전반적인 운영 품질을 높일 수 있습니다.