쿠버네티스 내부 동작

Kubernetes 컴포넌트의 내부 메커니즘과 데이터 흐름


Kubernetes 컴포넌트의 내부 메커니즘과 데이터 흐름

목표: Kubernetes가 어떻게 동작하는지 깊이 이해하고 문제를 진단할 수 있는 수준


🏗️ 컴포넌트 아키텍처

graph TB
    subgraph "Control Plane"
        API["🔷 API Server"]
        ETCD["🗄️ etcd"]
        SCHED["📅 Scheduler"]
        CM["🎮 Controller Manager"]
        
        API <--> ETCD
        SCHED --> API
        CM --> API
    end
    
    subgraph "Worker Node"
        KUBELET["🔧 kubelet"]
        PROXY["🌐 kube-proxy"]
        CRI["📦 Container Runtime"]
        
        KUBELET --> API
        KUBELET --> CRI
        PROXY --> API
    end
    
    CLI["💻 kubectl"] --> API

🗄️ etcd

역할

모든 클러스터 데이터의 분산 저장소.

graph LR
    API["API Server"] -->|"gRPC"| ETCD["etcd"]
    ETCD -->|"Watch"| API

특징:

  • Raft 합의 알고리즘
  • Key-Value 저장소
  • Watch API로 변경 감지
  • 백업 필수

주요 데이터

경로내용
/registry/podsPod 정보
/registry/servicesService 정보
/registry/deploymentsDeployment 정보
/registry/nodesNode 정보

etcdctl 사용

# etcdctl 설치
apt-get install etcd-client

# 스냅샷 백업
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

# 복원
ETCDCTL_API=3 etcdctl snapshot restore backup.db

# 데이터 조회
ETCDCTL_API=3 etcdctl get /registry/pods/default/my-pod

🔷 API Server

역할

모든 요청의 중앙 게이트웨이.

graph LR
    CLI["kubectl"] -->|"HTTP/REST"| API["API Server"]
    NODE["kubelet"] -->|"HTTP/REST"| API
    CTRL["Controller"] -->|"HTTP/REST"| API
    
    API -->|"인증"| AUTH["Authentication"]
    API -->|"인가"| RBAC["Authorization"]
    API -->|"변환"| ADM["Admission Control"]

요청 흐름

# 1. 인증 (Authentication)
# - 클라이언트 인증서, 토큰, 기본 인증

# 2. 인가 (Authorization)
# - RBAC, ABAC, Webhook

# 3. 어드미션 (Admission)
# - Mutating: 요청 수정
# - Validating: 요청 검증

어드미션 컨트롤러

# 기본 활성화된 컨트롤러
--enable-admission-plugins=NodeRestriction,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota

# 커스텀 웹훅
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: my-webhook
webhooks:
- name: my-webhook.example.com
  clientConfig:
    service:
      name: webhook-service
      namespace: default
      path: "/validate"
    caBundle: <CA_BUNDLE>
  rules:
  - operations: ["CREATE", "UPDATE"]
    apiGroups: ["apps"]
    apiVersions: ["v1"]
    resources: ["deployments"]

📅 Scheduler

역할

Pod를 적절한 Node에 배치.

graph TB
    subgraph "스케줄링 과정"
        PENDING["⏳ Pending Pod"] --> FILTER["🔍 필터링"]
        FILTER --> SCORE["📊 점수 계산"]
        SCORE --> BIND["🔗 바인딩"]
        BIND --> RUNNING["✅ Running"]
    end

스케줄링 단계

# 1. 필터링 (Predicates)
# - 리소스 충분?
# - 노드 셀렉터 일치?
# - 테인트/톨러레이션?
# - 볼륨 바인딩 가능?

# 2. 점수 계산 (Priorities)
# - 리소스 여유 (더 여유로운 노드 선호)
# - Pod 분산 (여러 노드에 분산)
# - 어피니티/안티어피니티

# 3. 바인딩
# - 선택된 노드에 Pod 할당

커스텀 스케줄러

apiVersion: v1
kind: Pod
metadata:
  name: custom-scheduled-pod
spec:
  schedulerName: my-custom-scheduler
  containers:
  - name: app
    image: nginx

🎮 Controller Manager

역할

클러스터 상태를 원하는 상태로 유지.

graph LR
    DESIRED["Desired State"] --> CTRL["Controller"]
    CURRENT["Current State"] --> CTRL
    CTRL -->|"조정"| ACTION["Action"]

주요 컨트롤러

컨트롤러역할
DeploymentReplicaSet 관리, 롤링 업데이트
ReplicaSetPod 복제본 수 유지
StatefulSet상태유지 Pod 관리
DaemonSet모든 노드에 Pod 배포
Job배치 작업 완료 보장
CronJob주기적 Job 실행
Node노드 상태 모니터링
EndpointService 엔드포인트 관리
ServiceAccount토큰 관리

컨트롤러 루프

# 1. Watch API로 변경 감지
# 2. 현재 상태와 원하는 상태 비교
# 3. 차이를 해소하는 액션 수행
# 4. 반복

🔧 kubelet

역할

노드 에이전트. Pod 생명주기 관리.

graph TB
    KUBELET["kubelet"] -->|"CRI"| RUNTIME["Container Runtime"]
    KUBELET -->|"CNI"| NETWORK["Network Plugin"]
    KUBELET -->|"CSI"| STORAGE["Storage Plugin"]
    
    KUBELET -->|"상태 보고"| API["API Server"]

주요 기능

# 1. PodSpec 수신 (API Server)
# 2. 컨테이너 생성/실행 (CRI)
# 3. 볼륨 마운트 (CSI)
# 4. 네트워크 설정 (CNI)
# 5. 상태 보고 (API Server)
# 6. 프로브 실행 (Liveness, Readiness)
# 7. 리소스 모니터링

🐛 문제 해결

컴포넌트 로그

# Control Plane (Static Pod)
kubectl logs -n kube-system kube-apiserver-master
kubectl logs -n kube-system kube-scheduler-master
kubectl logs -n kube-system kube-controller-manager-master
kubectl logs -n kube-system etcd-master

# Worker Node
journalctl -u kubelet
kubectl logs -n kube-system kube-proxy-xxx

etcd 문제

# etcd 상태 확인
ETCDCTL_API=3 etcdctl endpoint health

# 리더 확인
ETCDCTL_API=3 etcdctl endpoint status --write-out=table

# 알람 확인
ETCDCTL_API=3 etcdctl alarm list

📋 체크리스트

  • etcd 백업/복원
  • API Server 요청 흐름
  • 어드미션 컨트롤러
  • 스케줄링 단계
  • 컨트롤러 루프
  • kubelet 기능
  • 컴포넌트 로그 확인

🔗 관련 노트

  • 01-01-K8s-아키텍처-이해 — 전체 아키텍처
  • 02-11-Pod-실패-원인-분석 — 문제 해결
  • 03-02-Operator-패턴 — 커스텀 컨트롤러

마지막 업데이트: 2026-06-01