쿠버네티스 아키텍처
참고 자료
- Kubernetes Architecture Documentation - 공식 아키텍처 문서
- etcd Documentation - etcd 공식 문서
- Container Runtime Interface (CRI) - CRI 명세
- Container Network Interface (CNI) - CNI 명세
- Container Storage Interface (CSI) - CSI 명세
이전 글에서 컨테이너 기술의 기반을 살펴봤다면, 이제 그 위에 구축된 쿠버네티스의 전체 아키텍처를 깊이 있게 분석해보자. 쿠버네티스는 단순히 “컨테이너 오케스트레이션 도구”가 아니다. 분산 시스템을 관리하는 완전한 플랫폼이며, 각 컴포넌트가 정교하게 설계되어 있다.
이 글에서는 쿠버네티스의 전체 아키텍처와 각 컴포넌트의 역할, 그리고 이들이 어떻게 협력해서 안정적인 클러스터를 구성하는지 자세히 알아보겠다.
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: 비즈니스 메트릭 기반 스케일링