> For the complete documentation index, see [llms.txt](https://kubernetes.youngwjung.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kubernetes.youngwjung.com/overview/basics-of-kubernetes.md).

# Basics of Kubernetes

## 쿠버네티스란?

* 컨테이너 오케스트레이션 도구
* 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화&#x20;
* 구글의 컨테이너 워크로드 운영 경험에서 시작&#x20;
* 오픈소스 (최초의 CNCF 프로젝트)&#x20;
* 다양하고 빠르게 발전하는 컨테이너 Ecosystem의 중심&#x20;
* Helmsman, Pilot을 뜻하는 그리스어에서 유래&#x20;
* 코드명 "세븐" (스타트랙 1등 항해사 Seven of Nine에서 유래) - 로고에 그 뜻이 숨어있음
* 쿠버네티스, 쿠버, 쿠베, 큐브, k8s 등으로 불림

## 쿠버네티스 기능&#x20;

* 서비스 디스커버리 : 유동적으로 생성되는 컨테이너간에 통신을 제
* 오토스케일링 : 애플리케이션 부하에 따라 수직적 또는 수평적 확장&#x20;
* 로드 밸런싱 : 네트워크 트래픽을 다수의 컨테이너로 분산&#x20;
* 스토리지 오케스트레이션 : 원하는 스토리지 시스템을 자동으로 마운트할 수 있는 기능 제공&#x20;
* 자동화된 롤아웃과 롤백 : 현재 상태를 원하는 상태로 설정한 속도에 따라 변경&#x20;
* 자동화된 빈 배킹 : 각 컨테이너 필요한 CPU 및 메모리 양 설정&#x20;
* 자동화된 복구 : 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며 상태 검사에 응답하지 않는 컨테이너를 종료&#x20;
* 시크릿과 구성 관리 : OAuth 토큰 및 SSH 키와 같은 중요한 정보 저장 및 관리

## 쿠버네티스 아키텍쳐 &#x20;

![](https://3606318946-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_a7PGjEhpIoPdQwI7L%2F-Mandn-gFQ2-HbwvKJ8f%2F-ManeFQVnshzH4oISu1n%2FScreen%20Shot%202021-05-29%20at%2012.47.30%20AM.png?alt=media\&token=0eed9be4-d1f5-4f55-aa50-b18676adb9b1)

* Microservices&#x20;
* Decoupling
* API driven
* Declarative&#x20;

### 컨트롤 플레인 구성요소

![](https://3606318946-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_a7PGjEhpIoPdQwI7L%2F-Mandn-gFQ2-HbwvKJ8f%2F-Mane_CM_Cx9V-3NMF7C%2FScreen%20Shot%202021-05-29%20at%2012.48.33%20AM.png?alt=media\&token=55762723-70c1-4011-a2ca-2dc4df9e9f54)

#### kube-apiserver

* Kubernetes API를 노출하는 컴포넌트
* kubectl 등으로부터 리소스를 조작하라는 지시를 받음
* API 서버는 최종 사용자, 클러스터의 다른 부분 그리고 외부 컴포넌트가 서로 통신할 수 있도록 HTTP API를 제공

#### etcd

* 고가용성을 갖춘 분산 키-값 스토어 (key-value store)&#x20;
* 쿠버네티스 클러스터에서 생성, 관리되는 모든 객체에 대한 정보를 저장&#x20;

#### kube-scheduler

* 노드를 모니터링하고 애플리케이션(Pod)을 배치할 적절한 노드를 선택
* Pod에 명시된 요구 사항(CPU, 메모리등의 리소스) 및 제한 사항(특정 Pod와 같은 노드에 배포되어야 한다던지 특정 라벨을 가진 노드에 배포되어야 한다는 등등)과 노드의 리소스 현황 및 제한사항등을 확인

#### kube-controller-manager

* Pod를 복제하거나 노드 운영 등 각 리소스를 제어하는 컨트롤러들을 감독하고 실행
* 노드 컨트롤러, 레플리케이션 컨트롤러, 디플로이먼트 컨트롤러 등

#### cloud-controller-manager

* AWS, Auzre, GCP 등의 퍼블릭 클라우드 및 VMware, OpenStack 등의 프라이빗 클라우드에 쿠버네티스 클러스터를 구축, 운영할 할때 해당 클라우드 제공자의 API에 통해서 VM, 로드밸런서, 볼륨등의 클라우드 리소스를 생성 및 관리
* AWS를 예를 들면 Service 타입을 LoadBalancer로 지정할 경우 ELB가 생성되고 PersistentVolume을 생성할 경우 EBS 볼륨이 생성됨&#x20;
* <https://github.com/kubernetes?q=cloud-provider&type=&language=&sort=>

### 노드 구성요소&#x20;

![](https://3606318946-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_a7PGjEhpIoPdQwI7L%2F-Mandn-gFQ2-HbwvKJ8f%2F-ManfD99naVUwh7oQUkZ%2FScreen%20Shot%202021-05-29%20at%2012.50.59%20AM.png?alt=media\&token=f499e269-4447-4d2f-bf20-e8263acba523)

#### kubelet

* 클러스터의 각 노드에서 실행되는 에이전트
* 컨트롤 플레인으로부터의 요청을 처리 (컨테이너 생성 및 상태 확인)

#### kube-proxy

* 클러스터의 각 노드에서 실행되는 네트워크 프록시
* 노드의 네트워크 규칙을 유지 관리하여 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 함

#### container runtime

* 컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어
* 도커(Docker), containerd 등

## 컨터이너 생성 프로세스&#x20;

![](https://3606318946-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_a7PGjEhpIoPdQwI7L%2F-ManvgzqLHCXsZYRG9Ns%2F-ManwtRfWkxN2yYFQ8eV%2FScreen%20Shot%202021-05-29%20at%202.08.42%20AM.png?alt=media\&token=61e6811e-142c-4d51-931c-8692e7bd6064)

1. 사용자가 생성할 컨테이의 정보가 명시된 Manifest 파일을 HTTP 요청으로 Kubernetes API 서버로 전송&#x20;
2. API 서버는 Manifest 파일에 명시된 정보를 ETCD에 저장&#x20;
3. 해당 객체(Pod, ReplicaSet, Deployment, StatefulSet, DaemonSet, etc) 를 담당하는 Controller가 객체를 생성 (해당 정보를 API 서버로 객체에 대한 정보를 보내고 API서버가 ETCD에 저장)
4. Scheduler가 Pod를 배포할 노드를 지정&#x20;
5. Kubelet이 자신이 설치된 노드에 Pod가 배정된걸 확인하고 컨테이너 생성&#x20;
6. Kube Proxy가 컨테이너 생성을 감지하고 해당 컨테이너 IP 주소를 업데이트&#x20;
7. Kubelet 및 해당 객체를 담당하는 Controller가 객체 및 컨테이너의 상태 확인&#x20;

## Links

* [**Kubernetes Components**](https://kubernetes.io/docs/concepts/overview/components/)

&#x20;
