Post

쿠버네티스 아키텍처

쿠버네티스 아키텍처

참고 자료


이전 글에서 컨테이너 기술의 기반을 살펴봤다면, 이제 그 위에 구축된 쿠버네티스의 전체 아키텍처를 깊이 있게 분석해보자. 쿠버네티스는 단순히 “컨테이너 오케스트레이션 도구”가 아니다. 분산 시스템을 관리하는 완전한 플랫폼이며, 각 컴포넌트가 정교하게 설계되어 있다.

이 글에서는 쿠버네티스의 전체 아키텍처와 각 컴포넌트의 역할, 그리고 이들이 어떻게 협력해서 안정적인 클러스터를 구성하는지 자세히 알아보겠다.

1. 쿠버네티스 전체 아키텍처 개요

1.1 마스터-워커 아키텍처

쿠버네티스는 마스터 노드(Control Plane)워커 노드(Worker Node)로 구성된 클러스터 아키텍처를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
┌─────────────────────────────────────────────────────────────┐
│                 Kubernetes Cluster                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Control Plane (마스터 노드)                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐  │   │
│  │  │   kube-     │  │    etcd     │  │   kube-     │  │   │
│  │  │  apiserver  │  │             │  │ controller  │  │   │
│  │  │             │  │ (State      │  │  manager    │  │   │
│  │  │ (API 게이트 │  │  Store)     │  │             │  │   │
│  │  │   웨이)     │  │             │  │ (상태 관리) │  │   │
│  │  └─────────────┘  └─────────────┘  └─────────────┘  │   │
│  │                                                     │   │
│  │  ┌─────────────┐  ┌─────────────┐                  │   │
│  │  │   kube-     │  │   cloud-    │                  │   │
│  │  │  scheduler  │  │  controller │                  │   │
│  │  │             │  │   manager   │                  │   │
│  │  │ (파드 배치) │  │ (클라우드   │                  │   │
│  │  │             │  │  연동)      │                  │   │
│  │  └─────────────┘  └─────────────┘                  │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│                           │ API 호출                        │
│                           ▼                                 │
│  Worker Nodes (워커 노드들)                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  Node 1              Node 2              Node N     │   │
│  │  ┌─────────────┐     ┌─────────────┐     ┌────────┐ │   │
│  │  │   kubelet   │     │   kubelet   │     │kubelet │ │   │
│  │  │             │     │             │     │        │ │   │
│  │  │ ┌─────────┐ │     │ ┌─────────┐ │     │┌──────┐│ │   │
│  │  │ │  Pod A  │ │     │ │  Pod C  │ │     ││Pod E ││ │   │
│  │  │ │  Pod B  │ │     │ │  Pod D  │ │     ││Pod F ││ │   │
│  │  │ └─────────┘ │     │ └─────────┘ │     │└──────┘│ │   │
│  │  │             │     │             │     │        │ │   │
│  │  │ kube-proxy  │     │ kube-proxy  │     │kube-   │ │   │
│  │  │ (네트워킹)  │     │ (네트워킹)  │     │proxy   │ │   │
│  │  │             │     │             │     │        │ │   │
│  │  │ Container   │     │ Container   │     │Container│ │   │
│  │  │ Runtime     │     │ Runtime     │     │Runtime │ │   │
│  │  │(containerd) │     │(containerd) │     │        │ │   │
│  │  └─────────────┘     └─────────────┘     └────────┘ │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

핵심 설계 원칙:

  • 선언적 관리: 원하는 상태를 선언하면 쿠버네티스가 현재 상태를 맞춰간다
  • 분산 시스템: 여러 노드에 걸쳐 안정적으로 동작
  • 확장성: 수천 개의 노드까지 확장 가능
  • 자가 치유: 장애 상황에서 자동으로 복구

1.2 컴포넌트 간 통신 흐름

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
┌─────────────────────────────────────────────────────────────┐
│              Component Communication Flow                   │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 사용자 요청 처리 과정                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  kubectl                                            │   │
│  │     │                                               │   │
│  │     │ ① HTTP/HTTPS API 호출                         │   │
│  │     ▼                                               │   │
│  │  kube-apiserver                                     │   │
│  │     │                                               │   │
│  │     │ ② 인증 & 인가                                 │   │
│  │     │ ③ 리소스 검증                                 │   │
│  │     │ ④ etcd에 저장                                 │   │
│  │     ▼                                               │   │
│  │  etcd                                               │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  2. 컨트롤러 동작 과정                                      │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  kube-controller-manager                            │   │
│  │     │                                               │   │
│  │     │ ① Watch API로 상태 변화 감지                  │   │
│  │     │ ② 현재 상태와 원하는 상태 비교                │   │
│  │     │ ③ 차이 발견 시 조정 작업 수행                 │   │
│  │     ▼                                               │   │
│  │  kube-apiserver (다시 API 호출)                     │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  3. 파드 스케줄링 과정                                      │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  kube-scheduler                                     │   │
│  │     │                                               │   │
│  │     │ ① 스케줄링 대기 중인 파드 감지                │   │
│  │     │ ② 노드 필터링 (리소스, 제약 조건)             │   │
│  │     │ ③ 최적 노드 선택 (스코어링)                   │   │
│  │     │ ④ 바인딩 정보 API 서버에 전송                 │   │
│  │     ▼                                               │   │
│  │  kube-apiserver                                     │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  4. 워커 노드 동작 과정                                     │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  kubelet                                            │   │
│  │     │                                               │   │
│  │     │ ① API 서버 폴링 (파드 상태 확인)              │   │
│  │     │ ② 할당된 파드 감지                            │   │
│  │     │ ③ 컨테이너 런타임 호출 (CRI)                  │   │
│  │     │ ④ 파드 상태 API 서버에 보고                   │   │
│  │     ▼                                               │   │
│  │  Container Runtime (containerd/CRI-O)               │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

2. Control Plane 컴포넌트 상세 분석

2.1 kube-apiserver: 쿠버네티스의 중앙 허브

kube-apiserver는 쿠버네티스 클러스터의 중앙 API 게이트웨이다. 모든 통신이 이 컴포넌트를 거쳐간다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
┌─────────────────────────────────────────────────────────────┐
│                    kube-apiserver 구조                     │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  External Clients              Internal Components         │
│  ┌─────────────────┐           ┌─────────────────────────┐  │
│  │ kubectl         │           │ kube-controller-manager │  │
│  │ Dashboard       │           │ kube-scheduler          │  │
│  │ Custom Tools    │           │ kubelet                 │  │
│  └─────────────────┘           └─────────────────────────┘  │
│           │                              │                  │
│           │ HTTPS (443)                  │ HTTPS (443)      │
│           ▼                              ▼                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              kube-apiserver                         │   │
│  │                                                     │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │            Authentication                   │   │   │
│  │  │  ┌───────────┐ ┌───────────┐ ┌───────────┐ │   │   │
│  │  │  │  Client   │ │   OIDC    │ │ Service   │ │   │   │
│  │  │  │   Cert    │ │ Provider  │ │ Account   │ │   │   │
│  │  │  └───────────┘ └───────────┘ └───────────┘ │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                          │                          │   │
│  │                          ▼                          │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │            Authorization                    │   │   │
│  │  │  ┌───────────┐ ┌───────────┐ ┌───────────┐ │   │   │
│  │  │  │   RBAC    │ │   ABAC    │ │ Webhook   │ │   │   │
│  │  │  └───────────┘ └───────────┘ └───────────┘ │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                          │                          │   │
│  │                          ▼                          │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │          Admission Control                  │   │   │
│  │  │  ┌───────────┐ ┌───────────┐ ┌───────────┐ │   │   │
│  │  │  │ Mutating  │ │Validating │ │  Custom   │ │   │   │
│  │  │  │  Webhook  │ │  Webhook  │ │Controllers│ │   │   │
│  │  │  └───────────┘ └───────────┘ └───────────┘ │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                          │                          │   │
│  │                          ▼                          │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │              REST API                       │   │   │
│  │  │                                             │   │   │
│  │  │ • CRUD Operations                           │   │   │
│  │  │ • Watch API (Real-time Updates)            │   │   │
│  │  │ • Proxy API (Pod/Service 접근)             │   │   │
│  │  │ • OpenAPI/Swagger Docs                     │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                          │                          │   │
│  │                          ▼                          │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │              etcd Client                    │   │   │
│  │  │                                             │   │   │
│  │  │ • JSON → Protocol Buffers                  │   │   │
│  │  │ • Data Serialization                       │   │   │
│  │  │ • Optimistic Concurrency                   │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
│                          │                              │
│                          ▼                              │
│  ┌─────────────────────────────────────────────────┐   │
│  │                    etcd                         │   │
│  │              (분산 키-값 저장소)                │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

kube-apiserver의 주요 역할:

1. API 게이트웨이:

  • 모든 클러스터 통신의 중앙 집중점
  • RESTful API 제공 (GET, POST, PUT, DELETE)
  • HTTP/2 및 gRPC 지원

2. 인증 및 인가:

  • 인증: 클라이언트 신원 확인 (인증서, 토큰, OIDC)
  • 인가: 요청한 작업의 허가 여부 결정 (RBAC, ABAC)
  • Admission Control: 요청 내용 검증 및 변경

3. 데이터 영속성:

  • etcd와의 유일한 통신 창구
  • 클러스터의 모든 상태 정보 관리
  • 낙관적 동시성 제어로 데이터 일관성 보장

4. Watch API:

  • 실시간 상태 변화 알림
  • 컨트롤러들의 반응적 동작 지원

2.2 etcd: 클러스터 상태 저장소

etcd는 쿠버네티스의 “두뇌” 역할을 하는 분산 키-값 저장소다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
┌─────────────────────────────────────────────────────────────┐
│                      etcd Architecture                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  etcd Cluster (High Availability)                          │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  etcd-1 (Leader)     etcd-2 (Follower)             │   │
│  │  ┌─────────────┐     ┌─────────────────────────┐   │   │
│  │  │   Raft      │────▶│         Raft            │   │   │
│  │  │  Leader     │     │       Follower          │   │   │
│  │  │             │     │                         │   │   │
│  │  │ ┌─────────┐ │     │ ┌─────────────────────┐ │   │   │
│  │  │ │ Storage │ │     │ │      Storage        │ │   │   │
│  │  │ │ Engine  │ │     │ │      Engine         │ │   │   │
│  │  │ └─────────┘ │     │ └─────────────────────┘ │   │   │
│  │  └─────────────┘     └─────────────────────────┘   │   │
│  │         │                        │                 │   │
│  │         │    Raft Replication    │                 │   │
│  │         └────────────────────────┘                 │   │
│  │                                │                   │   │
│  │  etcd-3 (Follower)            │                   │   │
│  │  ┌─────────────────────────┐   │                   │   │
│  │  │         Raft            │   │                   │   │
│  │  │       Follower          │◀──┘                   │   │
│  │  │                         │                       │   │
│  │  │ ┌─────────────────────┐ │                       │   │
│  │  │ │      Storage        │ │                       │   │
│  │  │ │      Engine         │ │                       │   │
│  │  │ └─────────────────────┘ │                       │   │
│  │  └─────────────────────────┘                       │   │
│  └─────────────────────────────────────────────────────┘   │
│                          │                                 │
│                          │ gRPC API                        │
│                          ▼                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              kube-apiserver                         │   │
│  │                                                     │   │
│  │  저장된 데이터 구조:                               │   │
│  │  /registry/                                         │   │
│  │  ├── pods/                                          │   │
│  │  │   ├── default/                                   │   │
│  │  │   │   ├── pod-1                                  │   │
│  │  │   │   └── pod-2                                  │   │
│  │  │   └── kube-system/                               │   │
│  │  │       └── coredns-xxx                            │   │
│  │  ├── services/                                      │   │
│  │  ├── deployments/                                   │   │
│  │  ├── configmaps/                                    │   │
│  │  ├── secrets/                                       │   │
│  │  └── nodes/                                         │   │
│  │                                                     │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

etcd의 핵심 특징:

1. Raft 합의 알고리즘:

  • 분산 환경에서 데이터 일관성 보장
  • 리더 선출 및 로그 복제
  • 네트워크 분할 내성 (Split-brain 방지)

2. ACID 특성:

  • 원자성: 모든 변경사항이 전부 적용되거나 전부 롤백
  • 일관성: 데이터 무결성 보장
  • 격리성: 동시 접근 시 격리 보장
  • 지속성: 커밋된 데이터는 영구 보존

3. 성능 최적화:

  • Multi-Version Concurrency Control (MVCC): 읽기 성능 최적화
  • 압축: 정기적인 데이터 압축으로 스토리지 효율성 향상
  • 스냅샷: 빠른 백업 및 복구

4. 보안:

  • TLS 암호화 지원
  • 클라이언트 인증서 인증
  • 역할 기반 접근 제어

2.3 kube-controller-manager: 상태 조정의 핵심

kube-controller-manager는 여러 컨트롤러를 하나의 바이너리로 패키징한 컴포넌트다. 각 컨트롤러는 Control Loop 패턴을 사용해 클러스터 상태를 지속적으로 모니터링하고 조정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
┌─────────────────────────────────────────────────────────────┐
│            kube-controller-manager Structure                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │          kube-controller-manager                    │   │
│  │                                                     │   │
│  │  ┌─────────────────┐  ┌─────────────────────────┐  │   │
│  │  │   Deployment    │  │     ReplicaSet          │  │   │
│  │  │   Controller    │  │     Controller          │  │   │
│  │  │                 │  │                         │  │   │
│  │  │ • 롤링 업데이트 │  │ • 파드 복제본 관리     │  │   │
│  │  │ • 롤백 관리     │  │ • 파드 수 조정         │  │   │
│  │  │ • 히스토리 관리 │  │ • 실패한 파드 교체     │  │   │
│  │  └─────────────────┘  └─────────────────────────┘  │   │
│  │                                                     │   │
│  │  ┌─────────────────┐  ┌─────────────────────────┐  │   │
│  │  │     Node        │  │     Service             │  │   │
│  │  │   Controller    │  │     Controller          │  │   │
│  │  │                 │  │                         │  │   │
│  │  │ • 노드 상태감시 │  │ • 엔드포인트 관리      │  │   │
│  │  │ • 장애 노드처리 │  │ • 로드밸런서 연동      │  │   │
│  │  │ • 파드 퇴거     │  │ • 서비스 디스커버리    │  │   │
│  │  └─────────────────┘  └─────────────────────────┘  │   │
│  │                                                     │   │
│  │  ┌─────────────────┐  ┌─────────────────────────┐  │   │
│  │  │   Namespace     │  │    StatefulSet          │  │   │
│  │  │   Controller    │  │    Controller           │  │   │
│  │  │                 │  │                         │  │   │
│  │  │ • 네임스페이스  │  │ • 순서 보장 배포       │  │   │
│  │  │   생명주기 관리 │  │ • 안정적 네트워크 ID   │  │   │
│  │  │ • 리소스 정리   │  │ • 영구 스토리지        │  │   │
│  │  └─────────────────┘  └─────────────────────────┘  │   │
│  │                                                     │   │
│  │  ┌─────────────────┐  ┌─────────────────────────┐  │   │
│  │  │    DaemonSet    │  │      Job/CronJob        │  │   │
│  │  │   Controller    │  │      Controller         │  │   │
│  │  │                 │  │                         │  │   │
│  │  │ • 노드당 1개    │  │ • 배치 작업 관리       │  │   │
│  │  │   파드 보장     │  │ • 완료/실패 상태 추적  │  │   │
│  │  │ • 노드 추가시   │  │ • 재시도 로직          │  │   │
│  │  │   자동 배포     │  │ • 스케줄링 기반 실행   │  │   │
│  │  └─────────────────┘  └─────────────────────────┘  │   │
│  └─────────────────────────────────────────────────────┘   │
│                          │                                 │
│                          │ Watch API                       │
│                          ▼                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                kube-apiserver                       │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

Control Loop 패턴:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
┌─────────────────────────────────────────────────────────────┐
│                    Control Loop Pattern                     │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  무한 루프 실행:                                           │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  1. Watch ──┐                                       │   │
│  │     │       │                                       │   │
│  │     │       ▼                                       │   │
│  │     │   ┌─────────────────────────────────────┐     │   │
│  │     │   │        상태 변화 감지              │     │   │
│  │     │   │                                     │     │   │
│  │     │   │ • API 서버에서 이벤트 수신         │     │   │
│  │     │   │ • 리소스 추가/수정/삭제            │     │   │
│  │     │   │ • 타이머 기반 주기적 검사          │     │   │
│  │     │   └─────────────────────────────────────┘     │   │
│  │     │                   │                           │   │
│  │     │                   ▼                           │   │
│  │     │   ┌─────────────────────────────────────┐     │   │
│  │     │   │         현재 상태 조회             │     │   │
│  │     │   │                                     │     │   │
│  │     │   │ • 클러스터의 실제 상태 확인        │     │   │
│  │     │   │ • 리소스 상태 수집                 │     │   │
│  │     │   │ • 헬스 체크                        │     │   │
│  │     │   └─────────────────────────────────────┘     │   │
│  │     │                   │                           │   │
│  │     │                   ▼                           │   │
│  │     │   ┌─────────────────────────────────────┐     │   │
│  │     │   │       원하는 상태와 비교           │     │   │
│  │     │   │                                     │     │   │
│  │     │   │ • Desired State vs Current State   │     │   │
│  │     │   │ • 차이점 분석 (Diff)               │     │   │
│  │     │   │ • 조정 필요성 판단                 │     │   │
│  │     │   └─────────────────────────────────────┘     │   │
│  │     │                   │                           │   │
│  │     │                   ▼                           │   │
│  │     │   ┌─────────────────────────────────────┐     │   │
│  │     │   │         조정 작업 수행             │     │   │
│  │     │   │                                     │     │   │
│  │     │   │ • 파드 생성/삭제                   │     │   │
│  │     │   │ • 스케일링 작업                    │     │   │
│  │     │   │ • 설정 변경                        │     │   │
│  │     │   │ • 상태 업데이트                    │     │   │
│  │     │   └─────────────────────────────────────┘     │   │
│  │     │                   │                           │   │
│  │     │                   ▼                           │   │
│  │     │   ┌─────────────────────────────────────┐     │   │
│  │     │   │         대기 및 반복               │     │   │
│  │     │   │                                     │     │   │
│  │     │   │ • 다음 이벤트 대기                 │     │   │
│  │     │   │ • 주기적 재동기화                  │     │   │
│  │     │   │ • 에러 처리 및 재시도              │     │   │
│  │     │   └─────────────────────────────────────┘     │   │
│  │     │                   │                           │   │
│  │     └───────────────────┘                           │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

컨트롤러별 상세 기능:

Deployment Controller:

  • 선언된 파드 템플릿과 복제본 수 관리
  • 롤링 업데이트 전략 실행
  • 버전 히스토리 관리 및 롤백

ReplicaSet Controller:

  • 지정된 수의 파드 복제본 유지
  • 파드 장애 시 자동 교체
  • 라벨 셀렉터를 통한 파드 관리

Node Controller:

  • 노드 상태 모니터링 (Ready, NotReady, Unknown)
  • 장애 노드에서 파드 퇴거 (Eviction)
  • 노드 라이프사이클 관리

2.4 kube-scheduler: 지능적 파드 배치

kube-scheduler는 새로운 파드를 어떤 노드에 배치할지 결정하는 핵심 컴포넌트다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
┌─────────────────────────────────────────────────────────────┐
│                kube-scheduler Architecture                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Scheduling Process (2단계)                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  1단계: Filtering (필터링)                         │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │                                             │   │   │
│  │  │  모든 노드 (100개)                         │   │   │
│  │  │  ┌─────┐ ┌─────┐ ┌─────┐ ... ┌─────┐      │   │   │
│  │  │  │Node1│ │Node2│ │Node3│     │NodeN│      │   │   │
│  │  │  └─────┘ └─────┘ └─────┘     └─────┘      │   │   │
│  │  │                                             │   │   │
│  │  │              │ 필터 적용                   │   │   │
│  │  │              ▼                             │   │   │
│  │  │                                             │   │   │
│  │  │  적합한 노드 (20개)                        │   │   │
│  │  │  ┌─────┐ ┌─────┐ ┌─────┐ ... ┌─────┐      │   │   │
│  │  │  │Node2│ │Node5│ │Node7│     │NodeX│      │   │   │
│  │  │  └─────┘ └─────┘ └─────┘     └─────┘      │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                                                     │   │
│  │  2단계: Scoring (스코어링)                         │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │                                             │   │   │
│  │  │  노드별 점수 계산                           │   │   │
│  │  │  ┌─────────┐ ┌─────────┐ ┌─────────┐       │   │   │
│  │  │  │ Node2   │ │ Node5   │ │ Node7   │       │   │   │
│  │  │  │Score: 85│ │Score: 92│ │Score: 78│       │   │   │
│  │  │  └─────────┘ └─────────┘ └─────────┘       │   │   │
│  │  │                                             │   │   │
│  │  │              │ 최고 점수 선택               │   │   │
│  │  │              ▼                             │   │   │
│  │  │                                             │   │   │
│  │  │  선택된 노드                                │   │   │
│  │  │  ┌─────────┐                               │   │   │
│  │  │  │ Node5   │  ← 파드 바인딩               │   │   │
│  │  │  │Score: 92│                               │   │   │
│  │  │  └─────────┘                               │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
│  Filtering Predicates (필터링 조건)                    │
│  ┌─────────────────────────────────────────────────┐   │
│  │                                                 │   │
│  │ ┌─────────────────┐  ┌─────────────────────┐   │   │
│  │ │  NodeResourceFit│  │   NodeAffinity      │   │   │
│  │ │                 │  │                     │   │   │
│  │ │ • CPU 요구사항  │  │ • 노드 라벨 매칭   │   │   │
│  │ │ • 메모리 요구량 │  │ • 하드/소프트 조건 │   │   │
│  │ │ • 포트 충돌검사 │  │ • 스케줄링 제약    │   │   │
│  │ └─────────────────┘  └─────────────────────┘   │   │
│  │                                                 │   │
│  │ ┌─────────────────┐  ┌─────────────────────┐   │   │
│  │ │   PodAffinity   │  │      Taints &       │   │   │
│  │ │                 │  │     Tolerations     │   │   │
│  │ │ • 파드 간 친화성│  │                     │   │   │
│  │ │ • 안티 어피니티 │  │ • 노드 오염 확인   │   │   │
│  │ │ • 토폴로지 제약 │  │ • 내결함성 검증    │   │   │
│  │ └─────────────────┘  └─────────────────────┘   │   │
│  │                                                 │   │
│  │ ┌─────────────────┐  ┌─────────────────────┐   │   │
│  │ │   VolumeZone    │  │   NodeUnschedulable │   │   │
│  │ │                 │  │                     │   │   │
│  │ │ • 볼륨 가용성   │  │ • 스케줄링 비활성화│   │   │
│  │ │ • 스토리지 제약 │  │ • 유지보수 모드    │   │   │
│  │ │ • AZ 호환성     │  │ • 관리 작업 중     │   │   │
│  │ └─────────────────┘  └─────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
│  Scoring Functions (점수 계산 함수)                     │
│  ┌─────────────────────────────────────────────────┐   │
│  │                                                 │   │
│  │ ┌─────────────────┐  ┌─────────────────────┐   │   │
│  │ │  NodeResourceFit│  │ NodeAffinityPriority│   │   │
│  │ │  Priority       │  │                     │   │   │
│  │ │                 │  │ • 선호도 매칭 점수 │   │   │
│  │ │ • CPU 사용률    │  │ • 가중치 기반 계산 │   │   │
│  │ │ • 메모리 사용률 │  │ • 소프트 제약 고려 │   │   │
│  │ │ • 리소스 균형   │  │                     │   │   │
│  │ └─────────────────┘  └─────────────────────┘   │   │
│  │                                                 │   │
│  │ ┌─────────────────┐  ┌─────────────────────┐   │   │
│  │ │ LeastRequested  │  │   BalancedResource  │   │   │
│  │ │    Priority     │  │      Allocation     │   │   │
│  │ │                 │  │                     │   │   │
│  │ │ • 사용률이 낮은 │  │ • CPU/메모리 균형   │   │   │
│  │ │   노드 선호     │  │ • 리소스 파편화 방지│   │   │
│  │ │ • 스케일링 여유 │  │ • 효율적 배치      │   │   │
│  │ └─────────────────┘  └─────────────────────┘   │   │
│  │                                                 │   │
│  │ ┌─────────────────┐  ┌─────────────────────┐   │   │
│  │ │ NodePreferAvoid │  │   ImageLocality     │   │   │
│  │ │    Pods         │  │     Priority        │   │   │
│  │ │                 │  │                     │   │   │
│  │ │ • 파드 분산배치 │  │ • 이미지 로컬 캐시 │   │   │
│  │ │ • 장애 도메인   │  │ • 이미지 풀 시간   │   │   │
│  │ │ • 고가용성 보장 │  │ • 네트워크 트래픽  │   │   │
│  │ └─────────────────┘  └─────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

스케줄링 과정 상세:

1. 필터링 단계 (Predicates):

  • 파드의 요구사항을 만족하지 않는 노드 제외
  • 바이너리 결과 (적합/부적합)
  • 빠른 실행으로 후보 노드 수 감소

2. 스코어링 단계 (Priorities):

  • 각 필터를 통과한 노드에 0-100점 부여
  • 가중평균으로 최종 점수 계산
  • 최고 점수 노드 선택

3. 바인딩:

  • 선택된 노드에 파드 할당
  • API 서버를 통해 바인딩 정보 저장

2.5 cloud-controller-manager: 클라우드 연동

cloud-controller-manager는 클라우드 제공업체별 기능을 추상화하는 컴포넌트다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
┌─────────────────────────────────────────────────────────────┐
│             cloud-controller-manager Structure              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │          cloud-controller-manager                   │   │
│  │                                                     │   │
│  │  ┌─────────────────┐  ┌─────────────────────────┐  │   │
│  │  │     Node        │  │      Service            │  │   │
│  │  │   Controller    │  │    Controller           │  │   │
│  │  │                 │  │                         │  │   │
│  │  │ • 노드 메타데이터│  │ • LoadBalancer 생성    │  │   │
│  │  │ • 가용영역 정보 │  │ • 외부 IP 할당         │  │   │
│  │  │ • 인스턴스 타입 │  │ • 헬스체크 설정        │  │   │
│  │  │ • 네트워크 정보 │  │ • SSL 인증서 관리      │  │   │
│  │  └─────────────────┘  └─────────────────────────┘  │   │
│  │                                                     │   │
│  │  ┌─────────────────┐  ┌─────────────────────────┐  │   │
│  │  │     Route       │  │   PersistentVolume      │  │   │
│  │  │   Controller    │  │     Controller          │  │   │
│  │  │                 │  │                         │  │   │
│  │  │ • 파드 네트워크 │  │ • 동적 볼륨 프로비저닝 │  │   │
│  │  │   라우팅 설정   │  │ • 스토리지 클래스 매핑 │  │   │
│  │  │ • VPC 라우팅    │  │ • 볼륨 스냅샷 관리     │  │   │
│  │  │ • 서브넷 관리   │  │ • 백업 및 복원         │  │   │
│  │  └─────────────────┘  └─────────────────────────┘  │   │
│  └─────────────────────────────────────────────────────┘   │
│                          │                                 │
│                          │ Cloud Provider API              │
│                          ▼                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │               Cloud Provider                        │   │
│  │                                                     │   │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐   │   │
│  │  │     AWS     │ │    Azure    │ │     GCP     │   │   │
│  │  │             │ │             │ │             │   │   │
│  │  │ • EC2       │ │ • VM        │ │ • Compute   │   │   │
│  │  │ • ELB       │ │ • LB        │ │ • LB        │   │   │
│  │  │ • EBS       │ │ • Disk      │ │ • PD        │   │   │
│  │  │ • VPC       │ │ • VNet      │ │ • VPC       │   │   │
│  │  └─────────────┘ └─────────────┘ └─────────────┘   │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

주요 기능:

  • 노드 관리: 클라우드 인스턴스 메타데이터 동기화
  • 로드밸런서: 서비스와 클라우드 LB 연동
  • 스토리지: 동적 볼륨 프로비저닝
  • 네트워킹: 클라우드 네이티브 라우팅

3. Worker Node 컴포넌트 상세 분석

3.1 kubelet: 노드 에이전트

kubelet은 각 워커 노드에서 실행되는 핵심 에이전트로, Control Plane과 Worker Node를 연결하는 역할을 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
┌─────────────────────────────────────────────────────────────┐
│                    kubelet Architecture                     │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Control Plane Communication                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                kube-apiserver                       │   │
│  └─────────────────────────────────────────────────────┘   │
│                          │                                 │
│                          │ HTTPS (10250)                   │
│                          ▼                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                   kubelet                           │   │
│  │                                                     │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │              Pod Manager                    │   │   │
│  │  │                                             │   │   │
│  │  │ • 파드 생명주기 관리                       │   │   │
│  │  │ • 파드 명세 검증                           │   │   │
│  │  │ • 상태 동기화                              │   │   │
│  │  │ • 이벤트 생성                              │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                          │                          │   │
│  │                          ▼                          │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │            Container Manager                │   │   │
│  │  │                                             │   │   │
│  │  │ • 컨테이너 생성/시작/중지                  │   │   │
│  │  │ • 이미지 관리                              │   │   │
│  │  │ • 리소스 제한 적용                         │   │   │
│  │  │ • 헬스체크 실행                            │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                          │                          │   │
│  │                          ▼                          │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │             Volume Manager                  │   │   │
│  │  │                                             │   │   │
│  │  │ • 볼륨 마운트/언마운트                     │   │   │
│  │  │ • 스토리지 플러그인 관리                   │   │   │
│  │  │ • PVC 바인딩 처리                          │   │   │
│  │  │ • 볼륨 확장                                │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                          │                          │   │
│  │                          ▼                          │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │            Status Manager                   │   │   │
│  │  │                                             │   │   │
│  │  │ • 노드 상태 보고                           │   │   │
│  │  │ • 파드 상태 업데이트                       │   │   │
│  │  │ • 리소스 사용량 수집                       │   │   │
│  │  │ • 이벤트 전송                              │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
│                          │                              │
│                          │ CRI gRPC                     │
│                          ▼                              │
│  ┌─────────────────────────────────────────────────┐   │
│  │           Container Runtime                     │   │
│  │            (containerd/CRI-O)                   │   │
│  └─────────────────────────────────────────────────┘   │
│                          │                              │
│                          ▼                              │
│  ┌─────────────────────────────────────────────────┐   │
│  │              Linux Kernel                       │   │
│  │         (Namespaces, Cgroups)                   │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

kubelet의 핵심 기능:

1. 파드 생명주기 관리:

  • API 서버에서 할당된 파드 감지
  • 파드 명세(PodSpec) 검증
  • 컨테이너 런타임과 협력해 파드 실행
  • 파드 상태 모니터링 및 보고

2. 헬스체크:

  • Liveness Probe: 컨테이너 생존 여부 확인
  • Readiness Probe: 트래픽 수신 준비 상태 확인
  • Startup Probe: 초기 시작 시간이 긴 컨테이너 지원

3. 리소스 관리:

  • CPU/메모리 제한 적용
  • QoS(Quality of Service) 클래스 관리
  • 노드 리소스 사용량 모니터링

3.2 kube-proxy: 네트워크 프록시

kube-proxy는 쿠버네티스 서비스의 네트워크 프록시 역할을 수행한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
┌─────────────────────────────────────────────────────────────┐
│                 kube-proxy Architecture                     │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Service Discovery & Load Balancing                        │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  Client Request                                     │   │
│  │       │                                             │   │
│  │       │ ①                                          │   │
│  │       ▼                                             │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │            Service VIP                      │   │   │
│  │  │         (10.96.0.100:80)                    │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │       │                                             │   │
│  │       │ ②                                          │   │
│  │       ▼                                             │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │            kube-proxy                       │   │   │
│  │  │                                             │   │   │
│  │  │  Proxy Mode 선택:                          │   │   │
│  │  │  ┌─────────────┐ ┌─────────────────────┐   │   │   │
│  │  │  │  iptables   │ │      IPVS           │   │   │   │
│  │  │  │             │ │                     │   │   │   │
│  │  │  │ • 기본모드  │ │ • 고성능            │   │   │   │
│  │  │  │ • 간단구성  │ │ • 다양한 알고리즘   │   │   │   │
│  │  │  │ • 널리사용  │ │ • 대규모 환경 적합  │   │   │   │
│  │  │  └─────────────┘ └─────────────────────┘   │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │       │                                             │   │
│  │       │ ③ 로드밸런싱                                │   │
│  │       ▼                                             │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │              Endpoints                      │   │   │
│  │  │                                             │   │   │
│  │  │  Pod 1: 10.244.1.10:8080                   │   │   │
│  │  │  Pod 2: 10.244.2.15:8080                   │   │   │
│  │  │  Pod 3: 10.244.3.20:8080                   │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
│  iptables Mode 동작 방식                               │
│  ┌─────────────────────────────────────────────────┐   │
│  │                                                 │   │
│  │  iptables 규칙 체인:                           │   │   │
│  │  ┌─────────────────────────────────────────┐   │   │
│  │  │ PREROUTING                              │   │   │
│  │  │  ├── KUBE-SERVICES                      │   │   │
│  │  │      ├── KUBE-SVC-APP1 (10.96.0.100)   │   │   │
│  │  │      │   ├── KUBE-SEP-POD1              │   │   │
│  │  │      │   ├── KUBE-SEP-POD2              │   │   │
│  │  │      │   └── KUBE-SEP-POD3              │   │   │
│  │  │      └── KUBE-SVC-APP2 (10.96.0.200)   │   │   │
│  │  │                                         │   │   │
│  │  │ OUTPUT                                  │   │   │
│  │  │  ├── KUBE-SERVICES                      │   │   │
│  │  │      └── (동일한 규칙 적용)              │   │   │
│  │  └─────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
│  IPVS Mode 동작 방식                                   │
│  ┌─────────────────────────────────────────────────┐   │
│  │                                                 │   │
│  │  IPVS 로드밸런싱 알고리즘:                     │   │
│  │  ┌─────────────────────────────────────────┐   │   │
│  │  │ • Round Robin (rr)                      │   │   │
│  │  │ • Least Connection (lc)                 │   │   │
│  │  │ • Destination Hashing (dh)              │   │   │
│  │  │ • Source Hashing (sh)                   │   │   │
│  │  │ • Shortest Expected Delay (sed)         │   │   │
│  │  │ • Never Queue (nq)                      │   │   │
│  │  └─────────────────────────────────────────┘   │   │
│  │                                                 │   │
│  │  Virtual Server Table:                         │   │
│  │  ┌─────────────────────────────────────────┐   │   │
│  │  │ VIP: 10.96.0.100:80                    │   │   │
│  │  │  ├── Real: 10.244.1.10:8080 (weight=1) │   │   │
│  │  │  ├── Real: 10.244.2.15:8080 (weight=1) │   │   │
│  │  │  └── Real: 10.244.3.20:8080 (weight=1) │   │   │
│  │  └─────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

kube-proxy 모드 비교:

특성iptables 모드IPVS 모드
성능서비스 수에 따라 선형 증가일정한 성능 (O(1))
로드밸런싱랜덤 선택다양한 알고리즘 지원
확장성~5,000 서비스~10,000+ 서비스
복잡성단순상대적으로 복잡
디버깅iptables 명령어로 쉬움ipvs 도구 필요

3.3 Container Runtime: 실제 컨테이너 실행

컨테이너 런타임은 실제로 컨테이너를 생성하고 관리하는 저수준 컴포넌트다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
┌─────────────────────────────────────────────────────────────┐
│             Container Runtime Interaction                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  kubelet                                                    │
│     │                                                       │
│     │ CRI gRPC API 호출                                     │
│     ▼                                                       │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              Container Runtime                      │   │
│  │               (containerd)                          │   │
│  │                                                     │   │
│  │  Pod Sandbox 생성:                                 │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │                                             │   │
│  │  │ 1. Network Namespace 생성                   │   │   │
│  │  │    ├── veth pair 생성                       │   │   │
│  │  │    ├── CNI 플러그인 호출                    │   │   │
│  │  │    └── IP 주소 할당                         │   │   │
│  │  │                                             │   │   │
│  │  │ 2. IPC Namespace 생성                       │   │   │
│  │  │    ├── 공유 메모리 공간                     │   │   │
│  │  │    └── 세마포어 격리                        │   │   │
│  │  │                                             │   │   │
│  │  │ 3. UTS Namespace 생성                       │   │   │
│  │  │    ├── 호스트명 설정                        │   │   │
│  │  │    └── 도메인명 격리                        │   │   │
│  │  │                                             │   │   │
│  │  │ 4. PID Namespace 생성                       │   │   │
│  │  │    ├── 파드 내 PID 1 프로세스               │   │   │
│  │  │    └── 프로세스 트리 격리                   │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                                                     │   │
│  │  Container 생성 및 시작:                           │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │                                             │   │
│  │  │ 1. 이미지 준비                              │   │   │
│  │  │    ├── 이미지 풀 (필요시)                   │   │   │
│  │  │    ├── 레이어 압축 해제                     │   │   │
│  │  │    └── 읽기전용 파일시스템 마운트           │   │   │
│  │  │                                             │   │   │
│  │  │ 2. 컨테이너 파일시스템 준비                 │   │   │
│  │  │    ├── Union FS 마운트                      │   │   │
│  │  │    ├── 쓰기 가능 레이어 생성                │   │   │
│  │  │    └── 볼륨 마운트                          │   │   │
│  │  │                                             │   │   │
│  │  │ 3. Cgroup 설정                              │   │   │
│  │  │    ├── CPU 제한 적용                        │   │   │
│  │  │    ├── 메모리 제한 적용                     │   │   │
│  │  │    └── I/O 제한 적용                        │   │   │
│  │  │                                             │   │   │
│  │  │ 4. Security Context 적용                    │   │   │
│  │  │    ├── User/Group ID 설정                   │   │   │
│  │  │    ├── Capabilities 적용                    │   │   │
│  │  │    └── SELinux/AppArmor 설정                │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────────┘   │
│                          │                                 │
│                          │ OCI Runtime 호출                │
│                          ▼                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    runc                             │   │
│  │                                                     │   │
│  │  실제 컨테이너 프로세스 생성:                      │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │                                             │   │
│  │  │ 1. 새로운 프로세스 fork                     │   │   │
│  │  │ 2. Namespace 연결                           │   │   │
│  │  │ 3. Cgroup 연결                              │   │   │
│  │  │ 4. 파일시스템 pivot_root                    │   │   │
│  │  │ 5. 실행 파일 exec                           │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

4. 쿠버네티스 네트워킹 아키텍처

4.1 클러스터 네트워킹 모델

쿠버네티스는 플랫하고 단순한 네트워킹 모델을 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
┌─────────────────────────────────────────────────────────────┐
│              Kubernetes Networking Model                   │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  네트워킹 기본 원칙:                                       │
│  • 모든 파드는 NAT 없이 직접 통신 가능                     │
│  • 모든 노드는 NAT 없이 모든 파드와 통신 가능              │
│  • 파드가 보는 자신의 IP = 다른 파드가 보는 그 파드의 IP   │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                 Cluster Network                     │   │
│  │                (10.244.0.0/16)                      │   │
│  │                                                     │   │
│  │  Node 1 (10.244.1.0/24)    Node 2 (10.244.2.0/24) │   │
│  │  ┌─────────────────────┐   ┌─────────────────────┐ │   │
│  │  │                     │   │                     │ │   │
│  │  │ Pod A               │   │ Pod C               │ │   │
│  │  │ 10.244.1.10         │   │ 10.244.2.10         │ │   │
│  │  │  ┌─────────────┐    │   │  ┌─────────────┐    │ │   │
│  │  │  │ Container 1 │    │   │  │ Container 1 │    │ │   │
│  │  │  │ Container 2 │    │   │  │ Container 2 │    │ │   │
│  │  │  └─────────────┘    │   │  └─────────────┘    │ │   │
│  │  │                     │   │                     │ │   │
│  │  │ Pod B               │   │ Pod D               │ │   │
│  │  │ 10.244.1.20         │   │ 10.244.2.20         │ │   │
│  │  │  ┌─────────────┐    │   │  ┌─────────────┐    │ │   │
│  │  │  │ Container 1 │    │   │  │ Container 1 │    │ │   │
│  │  │  └─────────────┘    │   │  └─────────────┘    │ │   │
│  │  │                     │   │                     │ │   │
│  │  └─────────────────────┘   └─────────────────────┘ │   │
│  │           │                           │             │   │
│  │           │ Bridge Network            │             │   │
│  │           │ (cni0, docker0)           │             │   │
│  │           │                           │             │   │
│  │  ┌─────────────────────┐   ┌─────────────────────┐ │   │
│  │  │ Host Network        │   │ Host Network        │ │   │
│  │  │ eth0: 192.168.1.10  │   │ eth0: 192.168.1.20  │ │   │
│  │  └─────────────────────┘   └─────────────────────┘ │   │
│  │           │                           │             │   │
│  │           └─────── Physical Net ──────┘             │   │
│  │                  (192.168.1.0/24)                  │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

4.2 CNI (Container Network Interface)

CNI는 컨테이너 네트워킹을 위한 표준 인터페이스다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
┌─────────────────────────────────────────────────────────────┐
│                    CNI Architecture                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  kubelet                                                    │
│     │                                                       │
│     │ CNI 플러그인 호출                                     │
│     ▼                                                       │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              CNI Runtime                            │   │
│  │                                                     │   │
│  │  ADD/DEL/CHECK 명령어 처리:                        │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │ 1. 네트워크 네임스페이스 생성/삭제          │   │   │
│  │  │ 2. 네트워크 인터페이스 설정                 │   │   │
│  │  │ 3. IP 주소 할당/해제                        │   │   │
│  │  │ 4. 라우팅 규칙 설정                         │   │   │
│  │  │ 5. DNS 설정                                 │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────────┘   │
│                          │                                 │
│                          │ 플러그인별 구현                 │
│                          ▼                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              CNI Plugins                            │   │
│  │                                                     │   │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐   │   │
│  │  │   Flannel   │ │   Calico    │ │    Weave    │   │   │
│  │  │             │ │             │ │             │   │   │
│  │  │ • VXLAN     │ │ • BGP       │ │ • Mesh      │   │   │
│  │  │ • 오버레이  │ │ • 정책기반  │ │ • 암호화    │   │   │
│  │  │ • 간단구성  │ │ • 고성능    │ │ • 자동발견  │   │   │
│  │  └─────────────┘ └─────────────┘ └─────────────┘   │   │
│  │                                                     │   │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐   │   │
│  │  │   Cilium    │ │  Antrea     │ │  Multus     │   │   │
│  │  │             │ │             │ │             │   │   │
│  │  │ • eBPF      │ │ • OVS기반   │ │ • 멀티CNI   │   │   │
│  │  │ • L7정책    │ │ • 하이브리드│ │ • SRIOV     │   │   │
│  │  │ • 관찰성    │ │ • 보안강화  │ │ • 특화용도  │   │   │
│  │  └─────────────┘ └─────────────┘ └─────────────┘   │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

4.3 서비스와 DNS

쿠버네티스는 내장 DNS 서버를 통해 서비스 디스커버리를 제공한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
┌─────────────────────────────────────────────────────────────┐
│                Service & DNS Architecture                   │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  DNS Resolution Flow                                        │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  Client Pod                                         │   │
│  │     │                                               │   │
│  │     │ ① DNS 쿼리: web-service.default.svc.cluster.local
│  │     ▼                                               │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │            CoreDNS                          │   │   │
│  │  │         (kube-system)                       │   │   │
│  │  │                                             │   │   │
│  │  │ DNS 레코드:                                 │   │   │
│  │  │ ┌─────────────────────────────────────────┐ │   │   │
│  │  │ │ web-service.default.svc.cluster.local   │ │   │   │
│  │  │ │ ├── A 10.96.0.100                      │ │   │   │
│  │  │ │                                         │ │   │   │
│  │  │ │ app-service.production.svc.cluster.local│ │   │   │
│  │  │ │ ├── A 10.96.1.200                      │ │   │   │
│  │  │ │                                         │ │   │   │
│  │  │ │ pod-1.web-service.default.svc.cluster.local │ │   │
│  │  │ │ ├── A 10.244.1.10                      │ │   │   │
│  │  │ └─────────────────────────────────────────┘ │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │     │                                               │   │
│  │     │ ② 응답: 10.96.0.100                          │   │
│  │     ▼                                               │   │
│  │  Client Pod                                         │   │
│  │     │                                               │   │
│  │     │ ③ HTTP 요청: 10.96.0.100:80                  │   │
│  │     ▼                                               │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │            kube-proxy                       │   │   │
│  │  │                                             │   │   │
│  │  │ Service VIP 처리:                          │   │   │
│  │  │ ┌─────────────────────────────────────────┐ │   │   │
│  │  │ │ 10.96.0.100:80                          │ │   │   │
│  │  │ │ ├── Endpoint 1: 10.244.1.10:8080        │ │   │   │
│  │  │ │ ├── Endpoint 2: 10.244.2.15:8080        │ │   │   │
│  │  │ │ └── Endpoint 3: 10.244.3.20:8080        │ │   │   │
│  │  │ └─────────────────────────────────────────┘ │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │     │                                               │   │
│  │     │ ④ 로드밸런싱 후 전달                         │   │
│  │     ▼                                               │   │
│  │  Backend Pod (선택된 엔드포인트)                   │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
│  Service Types                                          │
│  ┌─────────────────────────────────────────────────┐   │
│  │                                                 │   │
│  │ ┌─────────────────┐  ┌─────────────────────┐   │   │
│  │ │   ClusterIP     │  │     NodePort        │   │   │
│  │ │                 │  │                     │   │   │
│  │ │ • 클러스터 내부 │  │ • 노드 포트 노출   │   │   │
│  │ │ • 기본 타입     │  │ • 외부 접근 가능   │   │   │
│  │ │ • 10.96.0.0/12  │  │ • 30000-32767      │   │   │
│  │ └─────────────────┘  └─────────────────────┘   │   │
│  │                                                 │   │
│  │ ┌─────────────────┐  ┌─────────────────────┐   │   │
│  │ │  LoadBalancer   │  │   ExternalName      │   │   │
│  │ │                 │  │                     │   │   │
│  │ │ • 클라우드 LB   │  │ • DNS CNAME 매핑   │   │   │
│  │ │ • 외부 IP 할당  │  │ • 외부 서비스 연동 │   │   │
│  │ │ • L4 로드밸런싱 │  │ • 프록시 없음      │   │   │
│  │ └─────────────────┘  └─────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

5. 쿠버네티스 스토리지 아키텍처

5.1 영구 볼륨과 스토리지 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
┌─────────────────────────────────────────────────────────────┐
│              Storage Architecture                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Storage Provisioning Flow                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  1. 사용자 요청                                     │   │
│  │     │                                               │   │
│  │     ▼                                               │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │    PersistentVolumeClaim (PVC)              │   │   │
│  │  │                                             │   │   │
│  │  │ apiVersion: v1                              │   │   │
│  │  │ kind: PersistentVolumeClaim                 │   │   │
│  │  │ spec:                                       │   │   │
│  │  │   accessModes: [ReadWriteOnce]              │   │   │
│  │  │   resources:                                │   │   │
│  │  │     requests:                               │   │   │
│  │  │       storage: 10Gi                        │   │   │
│  │  │   storageClassName: fast-ssd                │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │     │                                               │   │
│  │     │ 2. 바인딩 요청                                │   │
│  │     ▼                                               │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │         PV Controller                       │   │   │
│  │  │                                             │   │   │
│  │  │ • PVC와 PV 매칭                            │   │   │
│  │  │ • 동적 프로비저닝 트리거                   │   │   │
│  │  │ • 바인딩 상태 관리                         │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │     │                                               │   │
│  │     │ 3. 스토리지 프로비저닝                        │   │
│  │     ▼                                               │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │        Storage Provisioner                  │   │   │
│  │  │                                             │   │   │
│  │  │ • 클라우드 API 호출                        │   │   │
│  │  │ • 물리적 스토리지 생성                     │   │   │
│  │  │ • PV 객체 생성                             │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │     │                                               │   │
│  │     │ 4. 볼륨 생성 완료                             │   │
│  │     ▼                                               │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │      PersistentVolume (PV)                  │   │   │
│  │  │                                             │   │   │
│  │  │ apiVersion: v1                              │   │   │
│  │  │ kind: PersistentVolume                      │   │   │
│  │  │ spec:                                       │   │   │
│  │  │   capacity:                                 │   │   │
│  │  │     storage: 10Gi                          │   │   │
│  │  │   accessModes: [ReadWriteOnce]              │   │   │
│  │  │   persistentVolumeReclaimPolicy: Delete     │   │   │
│  │  │   storageClassName: fast-ssd                │   │   │
│  │  │   awsElasticBlockStore:                     │   │   │
│  │  │     volumeID: vol-12345678                  │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
│  Storage Classes                                        │
│  ┌─────────────────────────────────────────────────┐   │
│  │                                                 │   │
│  │ ┌─────────────────┐  ┌─────────────────────┐   │   │
│  │ │   Standard      │  │      Fast SSD       │   │   │
│  │ │                 │  │                     │   │   │
│  │ │ • HDD 기반      │  │ • SSD 기반         │   │   │
│  │ │ • 일반 워크로드 │  │ • 고성능 DB        │   │   │
│  │ │ • 저비용        │  │ • 낮은 지연시간    │   │   │
│  │ │ • 기본 클래스   │  │ • 높은 IOPS        │   │   │
│  │ └─────────────────┘  └─────────────────────┘   │   │
│  │                                                 │   │
│  │ ┌─────────────────┐  ┌─────────────────────┐   │   │
│  │ │   Network       │  │     Local SSD       │   │   │
│  │ │   Storage       │  │                     │   │   │
│  │ │                 │  │ • 노드 로컬 SSD    │   │   │
│  │ │ • NFS/iSCSI     │  │ • 최고 성능        │   │   │
│  │ │ • 공유 스토리지 │  │ • 데이터 지역성    │   │   │
│  │ │ • 다중 접근     │  │ • 임시 데이터      │   │   │
│  │ └─────────────────┘  └─────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

5.2 CSI (Container Storage Interface)

CSI는 스토리지 벤더가 쿠버네티스와 통합할 수 있는 표준 인터페이스다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
┌─────────────────────────────────────────────────────────────┐
│                    CSI Architecture                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  CSI Driver Components                                      │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  Controller Service (마스터 노드)                  │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │                                             │   │   │
│  │  │ • CreateVolume / DeleteVolume               │   │   │
│  │  │ • ControllerPublishVolume                   │   │   │
│  │  │ • ControllerUnpublishVolume                 │   │   │
│  │  │ • ValidateVolumeCapabilities                │   │   │
│  │  │ • ListVolumes / GetCapacity                 │   │   │
│  │  │ • CreateSnapshot / DeleteSnapshot           │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                                                     │   │
│  │  Node Service (워커 노드)                          │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │                                             │   │   │
│  │  │ • NodeStageVolume / NodeUnstageVolume       │   │   │
│  │  │ • NodePublishVolume / NodeUnpublishVolume   │   │   │
│  │  │ • NodeGetVolumeStats                        │   │   │
│  │  │ • NodeExpandVolume                          │   │   │
│  │  │ • NodeGetCapabilities                       │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                                                     │   │
│  │  Identity Service (공통)                           │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │                                             │   │   │
│  │  │ • GetPluginInfo                             │   │   │
│  │  │ • GetPluginCapabilities                     │   │   │
│  │  │ • Probe                                     │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
│  Volume Lifecycle                                       │
│  ┌─────────────────────────────────────────────────┐   │
│  │                                                 │   │
│  │  1. 프로비저닝                                  │   │
│  │     ├── external-provisioner                    │   │
│  │     ├── CreateVolume 호출                       │   │
│  │     └── PV 객체 생성                            │   │
│  │                                                 │   │
│  │  2. 노드 준비                                   │   │
│  │     ├── external-attacher                       │   │
│  │     ├── ControllerPublishVolume 호출            │   │
│  │     └── 노드에 볼륨 연결                        │   │
│  │                                                 │   │
│  │  3. 스테이징                                    │   │
│  │     ├── kubelet                                 │   │
│  │     ├── NodeStageVolume 호출                    │   │
│  │     └── 글로벌 마운트 포인트 준비               │   │
│  │                                                 │   │
│  │  4. 퍼블리싱                                    │   │
│  │     ├── kubelet                                 │   │
│  │     ├── NodePublishVolume 호출                  │   │
│  │     └── 파드 디렉토리에 바인드 마운트          │   │
│  │                                                 │   │
│  │  5. 사용                                        │   │
│  │     └── 파드에서 볼륨 사용                      │   │
│  │                                                 │   │
│  │  6. 정리 (역순)                                 │   │
│  │     ├── NodeUnpublishVolume                     │   │
│  │     ├── NodeUnstageVolume                       │   │
│  │     ├── ControllerUnpublishVolume               │   │
│  │     └── DeleteVolume                            │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

6. 컴포넌트 간 통신 보안

6.1 TLS 및 인증서 관리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
┌─────────────────────────────────────────────────────────────┐
│                 Security Architecture                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  PKI (Public Key Infrastructure)                           │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  Cluster CA (클러스터 인증 기관)                    │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │ /etc/kubernetes/pki/ca.crt                  │   │   │
│  │  │ /etc/kubernetes/pki/ca.key                  │   │   │
│  │  │                                             │   │   │
│  │  │ 모든 클러스터 인증서의 루트 CA              │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                          │                          │   │
│  │         ┌────────────────┼────────────────┐         │   │
│  │         │                │                │         │   │
│  │         ▼                ▼                ▼         │   │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐   │   │
│  │  │ API Server  │ │   etcd      │ │ Controller  │   │   │
│  │  │ Certificate │ │ Certificate │ │ Manager     │   │   │
│  │  │             │ │             │ │ Certificate │   │   │
│  │  │ • 서버 인증 │ │ • Peer TLS  │ │             │   │   │
│  │  │ • 클라이언트│ │ • Client    │ │ • Client    │   │   │
│  │  │   인증 허용 │ │   인증      │ │   인증      │   │   │
│  │  └─────────────┘ └─────────────┘ └─────────────┘   │   │
│  │                                                     │   │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐   │   │
│  │  │ Scheduler   │ │   kubelet   │ │ kube-proxy  │   │   │
│  │  │ Certificate │ │ Certificate │ │ Certificate │   │   │
│  │  │             │ │             │ │             │   │   │
│  │  │ • Client    │ │ • Server    │ │ • Client    │   │   │
│  │  │   인증      │ │ • Client    │ │   인증      │   │   │
│  │  │             │ │   인증      │ │             │   │   │
│  │  └─────────────┘ └─────────────┘ └─────────────┘   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  Service Account Tokens                                     │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  Service Account CA                                 │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │ /etc/kubernetes/pki/sa.key                  │   │   │
│  │  │ /etc/kubernetes/pki/sa.pub                  │   │   │
│  │  │                                             │   │   │
│  │  │ JWT 토큰 서명 및 검증용                    │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                          │                          │   │
│  │                          ▼                          │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │            Pod Service Account              │   │   │
│  │  │                                             │   │   │
│  │  │ /var/run/secrets/kubernetes.io/serviceaccount/ │   │
│  │  │ ├── token                                   │   │   │
│  │  │ ├── ca.crt                                  │   │   │
│  │  │ └── namespace                               │   │   │
│  │  │                                             │   │   │
│  │  │ • 파드 내 API 서버 접근용                  │   │   │
│  │  │ • RBAC 권한 매핑                           │   │   │
│  │  │ • 네임스페이스별 격리                      │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  Admission Controllers                                      │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  인증 → 인가 → 승인제어 → 영속화                  │   │
│  │                                                     │   │
│  │  ┌─────────────────┐  ┌─────────────────────┐      │   │
│  │  │ Mutating        │  │ Validating          │      │   │
│  │  │ Admission       │  │ Admission           │      │   │
│  │  │ Controllers     │  │ Controllers         │      │   │
│  │  │                 │  │                     │      │   │
│  │  │ • 리소스 수정   │  │ • 리소스 검증      │      │   │
│  │  │ • 기본값 설정   │  │ • 정책 적용        │      │   │
│  │  │ • 라벨 추가     │  │ • 거부/허용 결정   │      │   │
│  │  └─────────────────┘  └─────────────────────┘      │   │
│  │                                                     │   │
│  │  내장 컨트롤러:                                    │   │
│  │  • NamespaceLifecycle                              │   │
│  │  • ServiceAccount                                  │   │
│  │  • DefaultStorageClass                             │   │
│  │  • ResourceQuota                                   │   │
│  │  • PodSecurityPolicy                               │   │
│  │  • NetworkPolicy                                   │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

7. 고가용성과 확장성

7.1 Control Plane HA 구성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
┌─────────────────────────────────────────────────────────────┐
│               High Availability Setup                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  External Load Balancer                                     │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              HAProxy/NGINX/ALB                      │   │
│  │                                                     │   │
│  │  API Server Endpoint: k8s-api.example.com:6443     │   │
│  │                                                     │   │
│  │  Health Check: GET /livez                           │   │
│  │  Load Balancing: Round Robin                        │   │
│  └─────────────────────────────────────────────────────┘   │
│                          │                                 │
│      ┌───────────────────┼───────────────────┐             │
│      │                   │                   │             │
│      ▼                   ▼                   ▼             │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐          │
│  │  Master 1   │ │  Master 2   │ │  Master 3   │          │
│  │             │ │             │ │             │          │
│  │ kube-api    │ │ kube-api    │ │ kube-api    │          │
│  │ scheduler   │ │ scheduler   │ │ scheduler   │          │
│  │ controller  │ │ controller  │ │ controller  │          │
│  └─────────────┘ └─────────────┘ └─────────────┘          │
│                                                             │
│  etcd Cluster (3 or 5 nodes)                              │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  etcd-1 (Leader)    etcd-2 (Follower)              │   │
│  │  ┌─────────────┐    ┌─────────────────────────┐    │   │
│  │  │   Raft      │────│         Raft            │    │   │
│  │  │  Leader     │    │       Follower          │    │   │
│  │  │             │    │                         │    │   │
│  │  │ • 쓰기 처리 │    │ • 복제 수신             │    │   │
│  │  │ • 읽기 처리 │    │ • 읽기 처리             │    │   │
│  │  │ • 동기화    │    │ • 리더 선출 참여        │    │   │
│  │  └─────────────┘    └─────────────────────────┘    │   │
│  │         │                       │                  │   │
│  │         │    Raft Consensus     │                  │   │
│  │         └───────────────────────┘                  │   │
│  │                       │                            │   │
│  │  etcd-3 (Follower)    │                            │   │
│  │  ┌─────────────────────────┐                       │   │
│  │  │         Raft            │                       │   │
│  │  │       Follower          │◀──────────────────────┘   │
│  │  │                         │                           │
│  │  │ • 복제 수신             │                           │
│  │  │ • 읽기 처리             │                           │
│  │  │ • 리더 선출 참여        │                           │
│  │  └─────────────────────────┘                           │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  Leader Election (Scheduler & Controller Manager)          │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                                                     │   │
│  │  Active-Passive 모드:                              │   │
│  │  ┌─────────────────────────────────────────────┐   │   │
│  │  │                                             │   │   │
│  │  │ Master 1: kube-scheduler (Active)           │   │   │
│  │  │ Master 2: kube-scheduler (Standby)          │   │   │
│  │  │ Master 3: kube-scheduler (Standby)          │   │   │
│  │  │                                             │   │   │
│  │  │ Master 1: kube-controller-manager (Active)  │   │   │
│  │  │ Master 2: kube-controller-manager (Standby) │   │   │
│  │  │ Master 3: kube-controller-manager (Standby) │   │   │
│  │  └─────────────────────────────────────────────┘   │   │
│  │                                                     │   │
│  │  리더 선출 메커니즘:                               │   │
│  │  • ConfigMap 또는 Endpoint 기반 리스               │   │
│  │  • 리더 갱신 주기 (--leader-elect-lease-duration)  │   │
│  │  • 재시도 간격 (--leader-elect-retry-period)       │   │
│  │  • 리더 전환 시간 최소화                           │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

7.2 클러스터 확장성

노드 확장:

  • 수평 확장: 워커 노드 추가/제거
  • 자동 스케일링: Cluster Autoscaler
  • 리소스 모니터링: Metrics Server

파드 확장:

  • HPA (Horizontal Pod Autoscaler): CPU/메모리 기반
  • VPA (Vertical Pod Autoscaler): 리소스 요청량 자동 조정
  • Custom Metrics: 비즈니스 메트릭 기반 스케일링
This post is licensed under CC BY 4.0 by the author.