# Kubernetes

## Docker

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LxjHkZu4T9MzJ5fEMNe%2Fuploads%2Fgit-blob-642c215e7f25d71435de5603a8c59adc5694dfaf%2F1920xauto.webp?alt=media)

* 도커
  * 하나의 애플리케이션처럼 동작한다.
* 가상 머신
  * 내부에 독자적인 게스트 운영체제가 있다.
  * 도커에 비해 성능을 발휘하기 어렵다.

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LxjHkZu4T9MzJ5fEMNe%2Fuploads%2Fgit-blob-2b10b33d7e98680abaa01943e03646eb09e0b3cf%2F1920xauto2.webp?alt=media)

* 도커 컨테이너를 띄우려면 이미지가 필요하다.
  * 도커 파일을 빌드하면 도커 이미지가 만들어진다.
* 이미지를 도커 허브에 업로드한 뒤 실행할 컨테이너에서 다운받는다.

예제에서는 젠킨스로 스크립트를 하나하나 넣으면서 컨트롤 했다. 하지만 도커 컨테이너가 많아지면 관리가 어려워진다.

## 오케스트레이션 툴

* 가상 머신 인스턴스를 생성, 제거 하는 등 내부적으로 처리해주는 툴
  * ex. GCP는 내부적으로 오케스트레이션 툴로 처리한다.

## 컨테이너 오케스트레이션 툴

* 도커 컨테이너를 관리해주는 툴
* 쿠버네티스가 대표적이다.

## 쿠버네티스

### 클러스터

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LxjHkZu4T9MzJ5fEMNe%2Fuploads%2Fgit-blob-c8b3239db03e06752a852aa267c724c73b70b0d1%2F1920xauto3.webp?alt=media)

* 워커 노드와 마스터 노드로 이루어진다.
* 각 노드는 물리적 서버일 수도 있고 가상의 서버일 수도 있다.
  * 어쨌든 네트워크로 구분되는 하나하나의 서버를 의미한다.

### 마스터 노드

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LxjHkZu4T9MzJ5fEMNe%2Fuploads%2Fgit-blob-e43d1c56a5c620981011c7f30d903cf99acbf101%2F1920xauto4.webp?alt=media)

* 마스터 노드는 클러스터 전체를 관리한다.
  * 마스터 노드가 직접 애플리케이션을 실행하지는 않는다.
* 마스터 노드의 수는 워커 노드의 수에 따라 3개에서 7개까지 나올 수 있다.
  * 정말 테스트용인 경우는 1개여도 무관하다.
  * 이 때 개수는 반드시 홀수여야 한다.
  * 홀수가 되어야 클러스터 상태를 관리할 때 **컨센서스**를 이룰 수 있다.

#### 컨센서스

* 합의를 뜻한다.
* 마스트 노드끼리 투표를 하는데 짝수면 동점이 될 수 있으므로 홀수를 유지한다.

### 워커 노드

* 직접 애플리케이션을 실행하는 노드
* 마스터 노드의 관리를 받는다.
* 워커 노드의 개수는 몇 개가 되어도 무관하다.
  * 쿠버네티스에서 제공하는 네트워크 플러그인에 따라 수 백에서 수 천개까지 제한이 있다.

### 디플로이먼트

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LxjHkZu4T9MzJ5fEMNe%2Fuploads%2Fgit-blob-4c25ab20820582d633d00d8af566e452068a0b8a%2F1920xauto5.webp?alt=media)

* 마스터 노드에 생성된다.
* 워커 노드에 컨테이너화 된 애플리케이션이 떠있는지 확인한다.
  * 노드가 다운되거나 삭제되어 동작하지 않는다면 다른 노드에 애플리케이션을 생성한다.
* yaml 파일에 선언하는 것만으로도 간단하게 생성할 수 있다.

### 파드

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LxjHkZu4T9MzJ5fEMNe%2Fuploads%2Fgit-blob-7681618221df01dabbfd60af0fb5792dfb677964%2F1920xauto6.webp?alt=media)

* 그림에서 실제 애플리케이션 컨테이너는 `containerized app`이다.
* 하나의 파드에는 여러 애플리케이션이 뜰 수 있다.
  * 하나의 파드 = 하나의 애플리케이션 (X)
* 파드부터는 클러스터 내부 IP를 갖게 된다.
* 하지만 이 상태로는 실행중인 애플리케이션을 클러스터 외부로 서비스할 수 없다.

### 서비스

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LxjHkZu4T9MzJ5fEMNe%2Fuploads%2Fgit-blob-84d1275fceb83103ff18bbf9937509235364e0e8%2F1920xauto7.webp?alt=media)

* 클러스터 외부로 서비스 하려면 서비스가 필요하다.
* 파드를 묶어 외부에 노출시킨다.
  * `Label`처럼 이름도 붙일 수 있다.
* 서비스만으로는 간단한 라우팅만 할 수 있다.
  * 로드 밸런싱이나 https 같은 추가적인 처리는 인그레스가 필요하다.

### 인그레스

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LxjHkZu4T9MzJ5fEMNe%2Fuploads%2Fgit-blob-3e77ce7549ff50c6f5fc2b134457d4a59a4cb780%2F1920xauto8.webp?alt=media)

* 클러스터 외부에서 트래픽을 받아 라우팅 룰에 따라 서비스로 라우팅 한다.
* 마치 nginx가 해주는 역할과 거의 동일한 존재라고 생각하면 된다.

### 스케일링

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LxjHkZu4T9MzJ5fEMNe%2Fuploads%2Fgit-blob-93ed0f3d7c7ba5884570c67b4e5e82bd679882f7%2F1920xauto9.webp?alt=media)

* 스케일링 되는 기준
  * 파드
  * 이 파드는 서비스로 묶여있다.
* 쿠버네티스에서 기본적으로 제공하는 오토 스케일링을 사용할 수 있다.
  * CPU와 메모리 사용량을 기준으로 정한다.
  * 그 외의 기준으로 하고 싶다면 쿠베네티스 API를 사용해야 한다.
