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

스케줄링 과정:

  1. Predicates (필터링): 조건에 맞는 노드 선택

    • 리소스 충분한가?
    • 포트 중복 없는가?
    • 노드 셀렉터/어피니티 만족하는가?
  2. 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 ControllerService와 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

동작 모드:

모드설명특징
iptablesiptables 규칙 사용기본, 대규모 시 성능 저하
ipvsIPVS 사용대규모에 적합
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특징사용처
CalicoBGP 기반, NetworkPolicy 지원일반적
CiliumeBPF 기반, 고성능, 보안대규모/보안
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