🐙 쿠버네티스란?
쿠버네티스(Kubernetes): 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼
마이크로서비스, 클라우드 플랫폼 지향
Serverless, CI/CD, Machine Learning 등이 모두 쿠버네티스 위에서 작동
🐙 쿠버네티스 특징
- 글로벌 IT 기업들이 함께하는 Eco System
→ Google 등 거대 IT 기업들로 이루어져 세계적 스케일의 경험과 기술이 녹아 있음
- 다양한 배포 방식
→ Deployment, StatefulSets, DaemonSet, Job, CronJob 등 다양한 배포 방식 지원
- Ingress 설정
→ 설정한 Proxy 서버와 어플리케이션 간 연결 자동화, 1 Cluster N Ingress 가능
- Cloud 지원
→ Cloud Controller로 클라우드 연동 쉽게 확장
- Name Space & Label
→ 한 Cluster를 논리적으로 구분해서 사용
- RBAC (Role-Based Access Control)
→ 접근 권한 시스템
- CRD (Custom Resource Definition)
→ 쿠버네티스가 제공하지 않는 기능을 기본기능과 동일한 방식으로 사용 가능
- Auto Scaling
→ CPU / memory 사용랑, 현재 접속자 수에 따른 확장 가능
→ HPA, VPA, CA
- Federation, Multi Cluster
→ Cloud와 자체 서버 Cluster들을 하나로 묶어 사용 가능
🐙 쿠버네티스 기본 개념
Desired State

- 쿠버네티스는 Current State를 Desired State와 비교하여 이에 맞추려 하는 로직으로 작동
- 때문에 배포할 때 동작을 명령하지 않고 상태를 선언함 → 웹 서버 얼마나 많이? 어느 포트로?
- 쿠버네티스를 사용하기 위해서는 어떤 State가 있고 이 State들을 어떻게 선언하는지 알아야 함
Kubernetes Object
1. Pod

- 쿠버네티스 배포 최소 단위
→ 1개 이상의 Container와 Storage, Network 속성
→ Pod의 모든 Container는 Network와 Storage 공유 + 서로 localhost로 접근 가능
2. ReplicaSet

- Pod을 하나 이상 복제하여 관리하는 객체
- Pod을 생성하고 개수를 유지하기 위해서는 반드시 ReplicaSet 사용
- 복제할 개수, 개수 확인할 Label 선택자, 생성할 Pod 템플릿 포함
3. Service
- Network 관련 Object
- Pod를 외부 네트워크와 연결 + 여러 개의 Pod를 바라보는 내부 Load Balancer 생성 시 사용
- 내부 DNS에 서비스명을 도메인으로 등록하기 때문에 Service Discovery 역할도 수행
4. Volume
- 저장소 관련 Object
- 대부분의 저장 방식 지원
Object Spec
Object Specification은 YAML 파일로 정의
→ Object 종류, Desired State 선언
쿠버네티스 배포 방식
Desired State를 다양한 Object에 Label을 붙여 yaml 파일에 정의하고 API 서버에 전달
🐙 쿠버네티스 아키텍처
Master - Node 구조

Kubernetes = 전체 Cluster를 관리하는 Master + Container가 배포되는 Node
모든 명령은 Master의 API Server를 호출하는 것
Master
- 명령이 들어오면 Node server와 통신하여 받은 응답을 전달
- 기능 별로 나뉘어 있음
- 보통 3대를 구성 → 안정성
Node
- Master와 통신하며 필요한 Pod 생성하고 Network와 Volume 설정
- Container들이 생성되는 곳으로, 수백~수천 대로 확장 가능
- Label을 붙여 사용목적 정의 가능
Master 구성 요소

- API server
- 모든 요청(kubectl + 내부 req)을 처리하는, Master의 핵심 모듈
- Desired State를 key-value 저장소에 저장 및 조회
- Node에서 실행 중인 Container의 log를 보여주고 명령을 보내는 등 Debugger 역할도 수행
- etcd (분산 데이터 저장소)
- key-value 저장소 → 안정성, 속도 high
- write, read 기능 뿐만 아니라 watch 기능도 있어 State 변하면 바로 확인하여 로직 실행
- 오직 API server와 통신
- scheduler
- 아직 할당되지 않은 Pod을 조건에 따라 적절한 Node에 할당
- kube-controller
- 쿠버네티스에 있는 거의 모든 Object의 State 관리
- Object들은 철저히 분업: Deployment → ReplicaSet → Pod ← Scheduler
- cloud-controller
- Node 추가/삭제, Load Balancer 연결, Volume attach
Node 구성 요소

- kubelet
- Node의 Pod 생명주기 관리
- Pod에 상태 확인하면서 주기적으로 Master에 상태 전달
- API server의 요청 받아 Container log 전달 or 특정 명령 대신 수행
- kube-proxy
- Pod으로 연결되는 Network 관리
- TCP, UDP, SCTP 스트림 forwarding, 여러 개의 Pod를 Round-Robin 방식으로 서비스 제공
- 추상화
🐙 하나의 Pod이 생성되는 과정

✓ 각 모듈은 오직 API server와 통신
kubectl
- ReplicaSet Specification을 yml 파일로 정의 → kubectl 커맨드로 API server에 명령 전달
- API server는 새 ReplicaSet을 etcd에 저장
Kube Controller
- Kube Controller에 포함된 ReplicaSet Controller가 ReplicaSet 모니터링
→ ReplicaSet에 정의된 Label 선택자 조건 만족하는 Pod 존재하는지 확인
- 해당하는 Label의 Pod이 없으면 ReplicaSet의 Pod 템플릿 보고 할당되지 않은 새로운 Pod 생성 (생성은 API server에 전달하고 API server는 etcd에 저장)
Scheduler
- Scheduler는 할당되지 않은 Pod이 있는지 확인
- 할당되지 않은 Pod 있으면 조건에 맞는 Node 찾아 해당 Pod 할당
Kubelet
- 자신의 Node에 할당 되었지만 아직 생성되지는 않은 Pod 있는지 확인
- 생성되지 않은 Pod 있으면 Specification 보고 Pod 생성
- Pod 상태를주기적으로 API Server에 전달