쿠버네티스란?

쿠버네티스의 역할, 그리고 무엇을 하는지?
1) 오케스트레이션
- 오늘날의 개발에서 애플리케이션은 더 이상 하나의 통일체가 아니라, 특정 애플리케이션이 설계된 대로 기능하도록 함께 작동해야 하는 수십 또는 수백 개의 느슨하게 결합된 컨테이너로 구성된다.
- 하지만 수백 개의 컨테이너를 끊임없이 배포하고 관리하는 일은 굉장한 리소스를 요구로 한다. 이러한 어려움을 해결하기 위해 오케스트레이션이 등장했다. 오케스트레이션이란 컨테이너화된 애플리케이션의 자동화 및 최적화를 뜻하며, 컨테이너 오케스트레이션이란 용어로 쓰인다.
- 즉 정리하자면, 컨테이너 오케스트레이션의 목적은 여러 컨테이너의 배포 프로세스를 최적화 하는데 있으며, 이것은 컨테이너와 호스트의 수가 증가함에 따라 점점 더 가치가 있게 된다는 것이다.
- 대표적인 Docker기반 컨테이너 오케스트레이션 툴로는 Docker Swarm, Kubernetes, Apache Mesos가 있으며, 우리가 알아보고 사용하고자 하는 것은 Kubernetes이다.
2) 쿠버네티스
- Kubernetes는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 시스템, 즉 컨테이너 오케스트레이션 도구이다.
- Kubernetes를 사용하면 컨테이너화된 애플리케이션을 배포 및 확장하는 데 수반되는 수동 프로세스의 많은 부분을 자동화 할 수 있다.
- 즉, 여러 Linux 호스트들을 클러스터링 할 수 있으며 이러한 클러스터를 쉽고 효율적으로 관리할 수 있다. 또한 Kubernetes는 On-premise, Private Cloud, Public Cloud 등 다양한 환경에서 적용이 가능하다.
- 쿠버네티스로 인하여 각각의 컨테이너를 직접 하나씩 관리하지 않아도 된다. 개발자는 여러 컨테이너에 걸친 애플리케이션의 배치도를 작성하는데, 여기에는 각 컨테이너가 네트워킹과 스토리지를 사용하는 방식 등의 세부 정보가 담겨 있다. 쿠버네티스는 런타임에서 나머지 부분을 처리한다. 또한 기밀이나 앱 환경 구성 같은 성가신 세부 관리도 맡는다.
그래서 쿠버네티스를 왜 쓰는데 ?
이유는 몇 년 전만 해도 대부분의 소프트웨어 애플리케이션은 하나의 프로세스 또는 몇 개의 서버에 분산된 프로세스로 실행되었다.
이런 레거시 시스템은 릴리즈 주기가 느리고 비교적 업데이트가 자주 되지 않는다. 급변하는 현대 비즈니스의 요구사항을 충족시키려면 자주, 그리고 니즈에 맞춰서 빠르게 구성 요소를 변경할 수 있어야 한다.
그래서 마이크로서비스 개념이 등장했으며 이는 시스템을 독립적으로 실행되는 더 작은 구성 요소로 세분화 할 수 있다.
하지만 점차 배포 가능한 구성 요소의 수가 많아지고 데이터 센터의 규모가 커지면서 전체 시스템을 원활하게 구성, 관리할 수 있는 자동화가 필요해졌는데, 이것이 바로 쿠버네티스가 등장한 이유다.
쿠버네티스는 하드웨어 인프라를 추상화하고 데이터 센터 전체를 하나의 거대한 컴퓨팅 리소스로 제공한다.
쿠버네티스 아키텍처

K8s Master
전체 클러스터 관리를 담당하는 노드로 k8s 워커의 오케스트레이션을 처리한다.
- API Server : 쿠버네티스 컨트롤 플레인의 프론트엔드로 쿠버네티스 클러스터를 정의하고 구성하기 위해 Restful 웹 서비스를 제공하고 있다.
- etcd : 시스템에서 실행 중인 모든 오브젝트의 상태를 유지관리하는 고가용성 요소로 쿠버네티스의 구성의 모든 변경 사항이 저장되고 있으며 (일종의 서비스 레지스트리이다.)
- Scheduler: 스케줄러는 각 파드의 리소스 요구 사항을 읽는다. 가용성에 따라 클러스터 전체에 파드를 배포하고 있다. 파드의 스냅샷을 다른 노드에 배포함으로 가용성을 보장하고 있다.
- ControllerManager : 컨트롤러 매니저는 클러스터의 백그라운드 컨트롤러 등을 관리한다. 컨트롤러는 구성 변경을 감시하고, 클러스터를 원하는 형태로 만드는 작업을 수행한다.
컨트롤러 종류
- 노드 컨트롤러 : 클러스터의 노드를 모니터링하며 노드가 가동하거나 종료할 때 Response한다. 이를 통해 스케줄러는 노드의 가용성을 파악하고 스케줄링 작업을 수행하고 있다.
- 앤드포인트 컨트롤러 : API 앤드포인트 레코드를 생성해 서비스와 파드를 연결한다. 서비스를 실행하는 파드를 가르키는 주소를 반환하도록 DNS 구성을 변경한다.
- 레플리케이션 컨트롤러 : 레플리케이션 컨트롤러는 원하는 수의 파드 snapshot이 클러스터에서 실행되고 있는지를 확인한다.
쿠버네티스 워커
- kubelet : 컨테이너가 정상적으로 작동하는지 모니터링한다. kubelet은 파드를 설명이 적힌 YAML, JSON, 등의 정보를 바탕으로 컨테이너를 모니터링 한다.
- kube-proxy : • 서비스들 간의 네트워크 프록시와 로드 밸런서를 생성한다
- 파드 : 파드는 클러스터에서 실행 중인 프로세스를 뜻함. 일반적으로 파드 하나에 컨테이너 하나를 포함시키지만 단단히 결합된 컨테이너 그룹을 하나의 파드로 구성하기도 한다.
컨테이너 레지스트리
컨테이너를 배포할 때마다 매번 빌드하고 라이브러리를 가져오고 하기엔 시간이 좀 걸리니까 한번 만들어진 컨테이너 이미지를 컨테이너 레지스트리에 저장하고 필요할 때 사용하도록 한다.
Reference
https://www.redhat.com/ko/topics/containers/what-is-kubernetes
https://cloud.google.com/kubernetes-engine?hl=ko
https://www.openmaru.io/구글과-쿠버네티스/