K8s 아키텍처 이해
Kubernetes 클러스터의 전체 구성과 각 컴포넌트의 역할 완벽 가이드
Kubernetes 클러스터의 전체 구성과 각 컴포넌트의 역할 완벽 가이드
목표: 각 컴포넌트가 무엇을 하는지, 어떻게 통신하는지 설명할 수 있는 수준
🏗️ 전체 아키텍처
graph TB
subgraph "🔴 Control Plane"
direction TB
API["🔷 API Server<br/>kube-apiserver"]
ETCD["🗄️ etcd<br/>데이터 저장소"]
SCHED["⚡ Scheduler<br/>kube-scheduler"]
CTRL["🎮 Controller Manager<br/>kube-controller-manager"]
API --- ETCD
API --- SCHED
API --- CTRL
end
subgraph "🟢 Worker Node 1"
direction TB
KUBE1["🔧 kubelet"]
PROXY1["🌐 kube-proxy"]
RUNTIME1["📦 containerd"]
POD1["📋 Pod"]
CONT1["🐳 Container"]
KUBE1 --- RUNTIME1
KUBE1 --- POD1
PROXY1 --- POD1
POD1 --- CONT1
RUNTIME1 --- CONT1
end
subgraph "🟢 Worker Node 2"
direction TB
KUBE2["🔧 kubelet"]
PROXY2["🌐 kube-proxy"]
RUNTIME2["📦 containerd"]
POD2["📋 Pod"]
CONT2["🐳 Container"]
KUBE2 --- RUNTIME2
KUBE2 --- POD2
PROXY2 --- POD2
POD2 --- CONT2
RUNTIME2 --- CONT2
end
API ---|"HTTPS:6443"| KUBE1
API ---|"HTTPS:6443"| KUBE2
PROXY1 ---|"Service IP"| POD2
PROXY2 ---|"Service IP"| POD1
🎛️ Control Plane 컴포넌트
API Server (kube-apiserver)
역할: Kubernetes의 “프론트 데스크”. 모든 요청의 입구.
# API Server 확인
kubectl get pods -n kube-system -l component=kube-apiserver
# API Server 로그
kubectl logs -n kube-system -l component=kube-apiserver
# API Server 직접 호출 (인증 필요)
curl -k https://localhost:6443/api --header "Authorization: Bearer $TOKEN"
핵심 기능:
- REST API 제공
- 인증/인가 (Authentication/Authorization)
- 요청 검증 (Validation)
- etcd와의 유일한 통로
graph LR
User["👤 사용자/kubectl"] -->|"1. HTTP/HTTPS"| API["🔷 API Server"]
API -->|"2. gRPC"| ETCD["🗄️ etcd"]
API -->|"3. 인증/인가"| RBAC["🔐 RBAC"]
API -->|"4. 검증"| Validation["✅ Validation"]
API -->|"5. 응답"| User
etcd
역할: Kubernetes의 “데이터베이스”. 모든 클러스터 데이터 저장.
# etcd Pod 확인
kubectl get pods -n kube-system -l component=etcd
# etcd 백업
sudo ETCDCTL_API=3 etcdctl snapshot save backup.db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
# etcd 복원
sudo ETCDCTL_API=3 etcdctl snapshot restore backup.db \
--data-dir=/var/lib/etcd-backup
저장되는 데이터:
- 클러스터 상태 (Nodes, Pods, Services)
- 설정 (ConfigMaps, Secrets)
- 메타데이터 (Labels, Annotations)
Scheduler (kube-scheduler)
역할: Pod를 “어떤 노드에 배치할지” 결정.
# Scheduler 로그
kubectl logs -n kube-system -l component=kube-scheduler
# 스케줄링 이벤트 확인
kubectl get events --field-selector reason=Scheduled
스케줄링 과정:
-
Predicates (필터링): 조건에 맞는 노드 선택
- 리소스 충분한가?
- 포트 중복 없는가?
- 노드 셀렉터/어피니티 만족하는가?
-
Priorities (우선순위): 최적의 노드 선택
- 리소스 여유가 많은 노드
- Pod가 적은 노드
- 어피니티/안티어피니티 고려
Controller Manager (kube-controller-manager)
역할: “Desired State == Actual State”를 유지.
# Controller Manager 확인
kubectl get pods -n kube-system -l component=kube-controller-manager
주요 컨트롤러:
| 컨트롤러 | 역할 |
|---|---|
| Node Controller | 노드 상태 모니터링, 응답 없는 노드 처리 |
| ReplicaSet Controller | 지정된 레플리카 수 유지 |
| Deployment Controller | 롤링업데이트, 롤백 관리 |
| Endpoint Controller | Service와 Pod 연결 |
| Service Account Controller | 기본 SA 생성 |
🖥️ Worker Node 컴포넌트
kubelet
역할: 노드의 “현장 감독관”. Pod 생명주기 관리.
# kubelet 상태
sudo systemctl status kubelet
# kubelet 로그
sudo journalctl -u kubelet -f
# 노드 정보
kubectl describe node worker-1
주요 작업:
- PodSpec 받아서 컨테이너 실행
- Pod 상태 API Server에 보고
- 리소스 사용량 모니터링
- 볼륨 마운트/언마운트
kube-proxy
역할: 네트워크 규칙 관리. Service → Pod 라우팅.
# kube-proxy 확인
kubectl get pods -n kube-system -l k8s-app=kube-proxy
# iptables 규칙 확인 (iptables 모드)
sudo iptables -t nat -L KUBE-SERVICES
# IPVS 확인 (ipvs 모드)
ipvsadm -Ln
동작 모드:
| 모드 | 설명 | 특징 |
|---|---|---|
| iptables | iptables 규칙 사용 | 기본, 대규모 시 성능 저하 |
| ipvs | IPVS 사용 | 대규모에 적합 |
| userspace | 사용자 공간 프록시 | 레거시 |
Container Runtime
역할: 컨테이너 실제 실행.
# containerd 확인
sudo crictl ps
sudo ctr containers ls
# Docker (구버전)
sudo docker ps
CRI (Container Runtime Interface):
graph LR
KUBELET["🔧 kubelet"] -->|"CRI (gRPC)"| CRI["📦 CRI Interface"]
CRI -->|"containerd"| CONTAINERD["containerd"]
CRI -->|"CRI-O"| CRIO["CRI-O"]
CONTAINERD -->|"OCI"| RUNC["🐳 runc"]
CRIO -->|"OCI"| RUNC
RUNC -->|"실행"| CONTAINER["📦 Container"]
📡 통신 흐름
Pod 생성 과정
sequenceDiagram
actor User as 👤 사용자
participant kubectl as 🔧 kubectl
participant API as 🔷 API Server
participant etcd as 🗄️ etcd
participant Scheduler as ⚡ Scheduler
participant kubelet as 🔧 kubelet
participant CRI as 📦 containerd
User->>+kubectl: kubectl apply -f pod.yaml
kubectl->>+API: POST /api/v1/pods
API->>+etcd: 저장 (Create)
etcd-->>-API: 확인
API-->>-kubectl: 201 Created
kubectl-->>-User: ✅ 적용 완료
Note over API,Scheduler: Watch 이벤트 발생
API->>+Scheduler: 새 Pod 생성됨
Scheduler->>Scheduler: Predicates/Priorities
Scheduler->>API: 노드 바인딩 (Bind)
API->>etcd: 업데이트
Scheduler-->>-API: 완료
API->>+kubelet: PodSpec 전달 (Watch)
kubelet->>+CRI: 컨테이너 생성 요청
CRI->>CRI: runc로 컨테이너 실행
CRI-->>-kubelet: ✅ 생성 완료
kubelet->>API: Pod 상태 업데이트 (Running)
API->>etcd: 상태 저장
kubelet-->>-API: 완료
Service 접근 과정
sequenceDiagram
participant Client as 👤 Client Pod
participant DNS as 🌐 CoreDNS
participant Proxy as 🔀 kube-proxy
participant Pod1 as 📦 Pod 1 (10.244.1.10)
participant Pod2 as 📦 Pod 2 (10.244.2.20)
Client->>+DNS: nslookup my-service
DNS-->>-Client: 10.96.123.456
Client->>+Proxy: HTTP GET 10.96.123.456:80
Note over Proxy: iptables/IPVS 규칙
alt Round-robin
Proxy->>+Pod1: 요청 전달
Pod1-->>-Proxy: 응답
else
Proxy->>+Pod2: 요청 전달
Pod2-->>-Proxy: 응답
end
Proxy-->>-Client: HTTP Response
🔧 Addons
CoreDNS
# CoreDNS 확인
kubectl get pods -n kube-system -l k8s-app=kube-dns
# CoreDNS ConfigMap
kubectl get configmap coredns -n kube-system -o yaml
CNI (Container Network Interface)
| CNI | 특징 | 사용처 |
|---|---|---|
| Calico | BGP 기반, NetworkPolicy 지원 | 일반적 |
| Cilium | eBPF 기반, 고성능, 보안 | 대규모/보안 |
| Flannel | 단순, Overlay 네트워크 | 소규모 |
| Weave | 자동 발견, 암호화 옵션 | 간편한 설정 |
# CNI 확인
kubectl get pods -n kube-system
# 노드 IP 범위 확인
kubectl get nodes -o wide
# Pod 네트워크 확인
kubectl get pod -o wide
📋 체크리스트
- Control Plane 컴포넌트 역할
- Worker Node 컴포넌트 역할
- Pod 생성 흐름
- Service 접근 흐름
- etcd 백업/복원
- kubelet 상태 확인
- CNI 동작 확인
🔗 관련 노트
- 01-02-Pod-생명주기 — Pod 상태 변화
- 02-01-kubeadm-클러스터-설치 — 실제 구성
- 03-00-Kubernetes-내부동작-자가학습 — 낮은 수준
- 02-12-클러스터-장애-복구 — 장애 시나리오
마지막 업데이트: 2026-06-01