1. Kubernetes의 개념 및 특징
- 개념
- 컨테이너화된 애플리케이션의 배포, 스케일링 및 관리를 자동화하는 오픈소스 시스템이다.
- MSA를 도입하면서 서비스 별로 수많은 컨테이너가 돌아가게 되는데 이를 일일이 수동으로 관리하는 것에 한계가 있어 여러 개의 컨테이너들을 자동으로 확장, 배치, 복구하기 위해 만들어졌다.
- 쉽게 말해서 컨테이너들의 배치, 개수 관리 등등을 일일이 디테일하게 관리하는 지휘자 역할을 한다고 생각하면 된다.
- 특징
- 배포 자동화: 수십, 수백 개의 컨테이너를 일일이 사람이 켤 필요 없이 설정만 해두면 알아서 실행해준다.
- 스케일링: 접속자가 많아지면 컨테이너 수를 늘리고 적어지면 줄여서 자원을 효율적으로 사용한다.
- 자가 복구: 컨테이너가 갑자기 죽으면 이를 감지하고 즉시 새 컨테이너를 띄워 서비스를 유지한다.
- 서비스 디스커버리와 로드 밸런싱: 컨테이너에 고정된 주소를 부여하고 트래픽이 몰리지 않게 골고루 분산해 줌.
- 자동화된 롤아웃과 롤백: 새로운 버전을 업데이트할 때 하나씩 차례대로 교체하고 문제가 생기면 즉시 이전 버전으로 되돌림.
- 빈 패킹 (Bin Packing): 가용한 자원을 분석해서 컨테이너를 가장 효율적인 위치에 배치함.
2. 클러스터 아키텍처 및 구성 요소
쿠버네티스는 여러 대의 컴퓨터가 하나처럼 움직이는 ‘클러스터’ 단위로 운영된다.

- Cluster: 컨테이너화된 애플리케이션을 실행하기 위한 일련의 노드 머신의 집합이다.
- Master Node (Control Plane): 클러스터 전체를 컨트롤하며 내부에 있는 모든 node를 관리하는 가상 머신이다.
- kube-api-server: 모든 통신의 중심 창구다. 쿠버네티스의 모든 통신은 kube-api-server를 통해 통신한다.
- etcd: 클러스터의 모든 데이터를 저장하는 키-값 저장소이다.
- kube-scheduler: 리소스(파드)를 어떤 노드에 할당할지 결정한다.
- 자세하게 말해서 새로 만든 컨테이너(파드)를 어떤 컴퓨터(노드)에서 실행할 지 결정하는 작업을 한다는 것이다.
- kube-scheduler가 판단을 내려서 가장 적합한 서버를 골라준다.
- kube-controller-manager: 파드들을 관리하는 각각의 컨트롤러를 제어한다.
- Worker Node: 마스터에 의해 명령을 받고 실제 컨테이너들이 생성되고 동작하는 가상 머신이다.
- kubelet: 모든 노드에서 실행되며 컨테이너 실행 및 지속적인 헬스체크를 통해 마스터의 kube-api-server와 통신한다.
- 목적이 컨테이너 실행 및 지속적인 헬스체크이기 떄문에 worker node에서만 실행된다고 생각할 수 있지만 master node에서도 필수적으로 실행되어야 한다.
- 쿠버네티스 master node의 핵심 기능인
kube-api-server, etcd, kube-scheduler 등은 그 자체로 컨테이너 형태로 실행되는 경우가 대부분이다.
- master node에 있는 kubelet은 내부의 핵심 컴포넌트들이 제대로 실행되고 있는지 감시하고, 죽으면 다시 살리는 역할을 수행한다.
- kube-proxy: 클러스터 내부의 가상 네트워크를 설정하여 관리한다.

3. 주요 리소스(오브젝트)

| Namespace |
하나의 물리적인 클러스터를 논리적으로 분리하여 사용하는 단위 프로젝트나 팀별로 자원을 나누어 관리할 때 사용 |
| Pod |
컨테이너를 실행하는 최소 단위이며 하나 이상의 컨테이너 그룹 |
| 컨테이너를 직접 관리하지 않고 파드 단위로 관리한다. |
|
| ReplicaSet |
파드의 개수를 유지하고 관리하는 리소스 |



Pod를 한 번 띄우고 끝내는 게 아니라 상황에 맞게 Pod를 관리하는 방식을 정의하는 도구