쿠버네티스
쿠버네티스는 컨테이너 관리자로, 컨테이너 운영을 자동화하는 도구이다. 컨테이너화 된 애플리케이션의 배포, 스케일링, 관리를 간편하게 만들어주는 컨테이너 오케스트레이션 도구이다.
컨테이너 오케스트레이션
에는 쿠버네티스 뿐만 아니라 도커 스웜, 아파치 메소스 등이 존재한다.
- 다양한 컨테이너 오케스트레이션 종류가 존재하지만, 쿠버네티스가 클라우드 컴퓨팅 환경에서 컨테이너 기반 인프라의 사실상의 표준이 되었다.
쿠버네티스를 이해하려면 먼저 컨테이너 오케스트레이션의 개념을 알아야 한다.
컨테이너 오케스트레이션
컨테이너 오케스트레이션은 "컨테이너화 된 애플리케이션에 대한 자동화된 설정, 관리 및 제어 체계"라고 할 수 있다.
- 클라우드 컴퓨팅 환경에 마이크로서비스 아키텍쳐를 구축할 때 컨테이너 기술을 사용한다.
- 대규모의 서비스 환경에서 사용하는 수많은(수백, 수천개 단위의) 컨테이너를 하나씩 직접 관리하는 것은 불가능에 가깝다고 볼 수 있다.
컨테이너 오케스트레이션이 해결하는 것
수많은 컨테이너를 관리해야 하는 상황에서 해결해야 하는 핵심 이슈 4가지가 존재한다.
배포 관리
- 어떤 컨테이너를 어느 호스트에 배치해 구동할 것인가
- 호스트의 한정된 리소스에 맞춰 최적의 스케줄링을 어떻게 구현할 것인가
- 배포 상태를 어떻게 유지 관리할 것인가
제어 및 모니터링
- 컨테이너들의 상태를 어떻게 추적하고 관리할 것인가
스케일링
- 수시로 변하는 서비스 운영 상황과 트래픽 규모에 어떻게 대응할 것인가
네트워킹
- 인스턴스와 컨테이너를 어떻게 상호 연결할 것인가
- 컨테이너 오케스트레이션은 이 4가지 핵심 이슈를 해결하기 위해 등장하였다.
- 컨테이너 오케스트레이션은 클라우드 컴퓨팅 환경에서 대규모의 컨테이너들을 안정적으로 운영할 수 있도록 대규모 컨테이너 관리를 자동화한다.
컨테이너 오케스트레이션은 수많은 컨테이너를 협조적으로 연동하기 위한 통합 시스템이며, 컨테이너를 다루기 위한 API와 명령행 도구를 제공한다.
쿠버네티스로 할 수 있는 것
- 도커 호스트 관리
- 서버 리소스를 고려한 컨테이너 배치
- 스케일링
- 여러 컨테이너 그룹에 대한 로드밸런싱
- 헬스 체크
- ...
쿠버네티스 클러스터
쿠버네티스의 클러스터는 컨테이너 형태의 애플리케이션을 호스팅하는 물리/가상 환경의 노드들로 이루어진 집합을 말한다.
- 쿠버네티스를 배포하면
클러스터
가 생성된다.
- 쿠버네티스 클러스터는
노드
로 구성되며, 노드
는 컨테이너화된 애플리케이션을 실행한다.
노드(node)
는 클러스터의 관리 대상으로 등록된 도커 호스트를 말한다.
노드(node)
에는 도커 컨테이너가 배치된다.
- 워커 노드(worker node)는
파드(또는 팟, 포드 pod)
를 호스팅한다.
파드(pod)
는 클러스터에서 실행 중인 컨테이너들의 집합을 말한다.
마스터 노드
쿠버네티스 클러스터 전체를 관리하는 서버를 마스터 노드
라고 한다. 마스터 노드는 클러스터 내부 요소들을 제어하는 컨트롤 플레인(Control Plane) 역할을 수행한다.
- 쿠버네티스 클러스터에는 적어도 하나 이상의 마스터 노드가 존재해야 한다.
- 관리자는 마스터 노드를 통해 클러스터 전체를 제어한다.
컨트롤 플레인의 구성 요소
쿠버네티스 클러스터의 컨트롤 플레인은 API 서버
, 스케줄러
, 컨트롤러 매니저
, etcd
로 구성된다.
이미지 출처: Kubernetes Components
API 서버(kube-apiserver)
- API 서버는 쿠버네티스 API를 제공하는 control plane의 구성 요소이다.
- API 서버는 인스턴스들을 수평 확장(스케일 아웃)하도록 설계되었다.
- API 서버를 통해 모든 명령과 통신을 처리한다.
- 모든 기능은 REST API로 제공된다.
스케줄러(kube-scheduler)
- 할당된 노드가 없는 파드(pod)를 감시하고 실행할 노드를 선택하는 control plane의 구성 요소이다.
- pod나 서비스들을 적절한 노드에 저장하도록 정리하는 역할을 한다.
- 리소스들을 어떻게 할당할지를 결정하는 것이다.
컨트롤러 매니저(kube-controller-manager)
- 컨트롤러 프로세스를 실행하는 control plane의 구성 요소이다.
- Replica controller, Service controller, Volumne controller, Node controller를 생성하고 각 노드에 배포해 관리한다.
etcd
- 클러스터의 데이터베이스 역할을 한다.
- 모든 클러스터 데이터를 키-값 형태로 저장하는 백업 저장소로 사용된다.
- 빠른 응답과 신뢰성 등의 장점이 있다.
노드의 구성 요소
노드의 구성 요소는 노드에서 파드와 컨테이너를 구동시키고 관리하기 위해 필요한 요소들을 의미한다. 워커 노드 뿐만 아니라 마스터 노드에도 노드의 구성 요소가 존재한다.
노드는 Kubelet
, kube-proxy
, cAdvisor
, 컨테이너 런타임 엔진
으로 구성된다.
Kublet
- 각 노드에서 파드에 있는 컨테이너들이 정상 실행되도록 조율하는 에이전트이다.
- 마스터 노드의 스케줄러가 파드를 노드에 할당하면,
kublet
이 파드와 컨테이너를 배치한다.
- 마스터 노드의 API 서버와 통신하며 노드가 실행할 명령을 받아 실행시킨다.
- 파드와 컨테이너의 상태를 주기적으로 체크하여 API 서버에 전달하기도 한다.
kube-proxy
- 각 노드에서 실행되는 네트워크 프록시를 말한다.
- 노드의 네트워크 규칙에 따라 클러스터 내부 또는 외부에서 발생하는 네트워크 세션과 파드가 네트워크 커뮤니케이션할 수 있도록 해준다.
- 로드밸런싱을 수행해 노드로 들어오는 트래픽을 적절한 컨테이너로 라우팅한다.
- 노드와 마스터 노드 사이의 네트워크 통신을 관리한다.
cAdvisor
- 각 노드에서 실행되는 모니터링 에이전트를 말한다.
- 노드 안에 있는 컨테이너들의 상태와 성능 정보를 수집하여 마스터 노드에 전달한다.
컨테이너 런타임 엔진
- 컨테이너 이미지를 가져오고 구동시키는 엔진이다.
- 컨테이너를 실행하는 역할을 담당한다.
참고