Kubernetes란?
[ 개요 ]
쿠버네티스는 컨네이너를 위한 분산시스템을 편리하게 제공하기 위한 프레임워크이다.
쿠버네티스가 등장한 배경을 알면 해당 프레임워크의 목적을 더욱 쉽게 알 수 있다.
Virtualized Deployment(가상화된 배포 시대) :
한 서버에 여러개의 어플리케이션을 실행하면 리소스 전부를 차지하는 어플리케이션이 있을 수 있고
리소스를 제어할 수 있는 방법이 용이하지 않아 다른 어플리케이션의 성능저하를 야기한다.
이를 해결하기 위해 다른 서버에 독립적 실행하기에는 리소스 낭비가 있고 이는 비용과 연결된다.
또한 각 서버마다 동일한 어플리케이션 환경을 셋팅하기에 손이 많이가는 문제도 있었다.
이를 위해 가상화가 도입되었다. 가상화는 물리서버에서 어플리케이션을 추가하거나 삭제하기가 용이했고
리소스 제어와 함께 일정 수준의 보안성도 확보할 수 있었다.
위의 그림과 같이 Hypervisor를 통해 각 가상화 머신에 OS를 탑재하여 하나의 독립적인 컴퓨터로써 활용이 가능하였다.
Container Deployment(컨테이너 개발 시대)
Virtual Machine은 운영체제가 있기에 새로 추가하고 삭제하는데 무겁고 느리다.
VM 이미지와 동일하게 자체 파일 시스템, CPU, 메모리 등을 독립적으로 구성할 수 있는Container를 통해 더 빠르게 배포하고 이식할 수 있게 되었다.
쿠버네티스의 필요성
Container를 활용함에 따라 수십 ~ 수백개의 컨테이너가 실행되는 환경을 구성하기도 한다.
이에 따라 다시 여러문제가 생기는데 쿠버네티스는 컨테이너들을 관리하고 배포하는데 효율적이다.
로드 밸런싱
- 몇 몇의 컨테이너에 대한 트래픽이 몰리면 쿠버네티스는 네트워크 트래픽을 로드밸런싱 한다.
스토리지 오케스트레이션
- 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재한다.
자동화된 롤 아웃과 롤백
- 수많은 컨테이너들에 대해 자동으로 배포하고, 기존컨테이너를 제거하고 모든 리소스를 새 컨테이너에 적용 할 수 있다.
자동화된 빈 패킹
- 각 컨테이너가 필요로 하는 CPU와 Memory 리소스를 자동으로 할당한다.
자동화된 복구
- 응답하지 않는 컨테이너를 죽이고 클라이언트에게 노출하지 않는다.
시크릿과 구성관리
- 암호, OAuth 토큰 및 SSH키와 같은 중요 정보를 저장하고 관리한다.
[ 아키텍처 ]
아래는 쿠버네티스를 이루는 요소들이다.
컨트롤 플레인
- 노드를 제어하는 프로세스 컬렉션이다. 모든 태스크에 대한 할당을 수행한다.
노드
- 컨트롤 플레인에서 할당된 요청 태스크를 수행하는 머신이다.
포드
- 단일 노드에 배포된 하나 이상의 컨테이너 그룹이다.
- 포드에 있는 모든 컨테이너는 IP, Address, IPC, HostName, 기타 리소스를 공유한다.
복제 컨트롤러
- 클러스터에서 실행되어야 하는 동일한 포드 복사본의 개수를 제어한다.
Kubelet
- 노드에서 실행되며 컨테이너 매니페스트를 읽고, 정의된 컨테이너가 실행 중인지를 확인한다.
Kubectl
- 쿠버네티스 커맨드 라인 구성 툴이다. 해당 서비스를 통해 쿠버네티스는 실행&관리 한다.
쿠버네티스를 배포하면 클러스터가 실행된다.
각 노드(Compute machines)는 리눅스환경이며 컨테이너로 이루어진 포드(Pod)를 실행한다.
컨트롤 플레인은 사용자에 의해 명령을 전달받고 지침을 노드에 전달한다.
이 전달은 여러 서비스와 연계하여 태스크에 가장 접합한 노드를 자동으로 결정한다.
kube-apiserver
- 쿠버네티스 관련 API 제공
etcd
- 모든 클러스터 데이터를 담는 저장소 (키-값)
kube-scheduler
- 노드가 배정되지 않은 새로 생성된 포드(Pod)를 감지하고, 실행할 노드를 선택한다.
kube-controller-manager
- 컨트롤러 프로세스를 실행하는 컴포넌트 (노드, 잡, 엔드포인트, 서비스어카운트, 토큰 컨트롤러)
cloud-controller-manager
- 클라우드별 컨트롤 로직을 포함한다.
- 클러스터를 클라우드 공급자의 API에 연결하고, 클라우드와 상호 작용하는 컴포넌트를 생성한다.
kubelet
- 클러스터의 각 노드에서 실행되는 에이전트로, 포드에서 컨테이너가 동작하도록 관리한다.
kube-proxy
- 각 노드에서 실행되는 네트워크 프록시로, 네트워크 규칙을 관리하여 내부와 외부 포드의 통신이 가능하게 한다.
참고 :
https://www.redhat.com/ko/topics/containers/what-is-kubernetes#%EA%B0%9C%EB%85%90
https://kubernetes.io/ko/docs/concepts/overview/