안녕하세요 대학생 웹 개발 인턴을 진행중인 프론트엔드 개발자 garden입니다:)
이번 포스팅에서는 쿠버네티스에 대해 알아보겠습니다.
사전적 정의는 쿠버네티스는 컨테이너를 오케스트레이션 하는 도구입니다. 도커는 컨테이너를 다루는 도구이고, 쿠버네티스는 도커를 다루는 도구일까요?
저는 이번에 쿠버네티스, 오케스트레이션이라는 단어가 익숙하지 않아서 더 공부해보고자 용어를 정리해보았습니다.
먼저 컨테이너는 pc에 프로그램을 설치할 때 필요한 모든 환경까지 포함하여 독립적으로 프로그램을 실행할 수 있도록 도와주는 기술입니다. 여기서 컨테이너를 사용할 때 필요한 도구가 컨테이너 런타임입니다. 컨테이너를 다운받거나 공유하는 도구입니다. 여기서 가장 유명한 것이 도커입니다.
쿠버네티스는 컨테이너 런타임을 통해 컨테이너를 다루는 도구를 의미합니다. 이 친구는 여러 서버에 컨테이너를 분산해서 배치하거나, 문제가 생긴 컨테이너를 교체하거나, 컨테이너가 사용할 비밀번호나 환경 설정을 관리하고 주입해주는 일 등입니다. 이것을 컨테이너 오케스트레이션이라고 합니다. 즉 쿠버네티스는 컨테이너를 다루는 도구입니다.
쿠버네티스의 역할은 컨테이너를 분산하고 배치, 구동 환경까지 관리해주는 도구이고, 도커는 컨테이너를 다루는 도구(컨테이너 런타임) 중 하나입니다.
아하 이제 쿠버네티스의 역할과 개념을 알아보았으니 쿠버네티스의 클러스터에 대한 개념을 알아보겠습니다.
먼저 쿠버네티스를 배포하면 클러스터를 얻습니다. 쿠버네티스를 실행중이라는 것은 클러스터를 실행하고 있다는 말과 같습니다. 이 쿠버네티스 클러스터는 컨테이너화 된 애플리케이션을 실행하는 노드의 집합입니다.
모든 클러스터는 최소 한 개 이상의 마스터 노드와 워커 노드를 가지고 있습니다.
쿠버네티스 클러스터는 크게 컨트롤 플래인과 노드라고 하는 2가지 영역으로 구성되어있습니다 .
- 컨트롤 플레인(마스터 노드): 제어 영역이라고 할 수 있습니다.
- 노드(워커 노드) : 애플리케이션 컨테이너를 실행하는 역할을 합니다.
- etcd: 쿠버네티스 클러스터의 모든 데이터를 담고 있는 key-value의 저장소이다. 데이터베이스 역할을 한다.
- kube-apiserver: 쿠버네티스 클러스터의 허브로서 클라이언트와 etcd에 저장된 데이터 사이의 상호작용을 중재한다.
- kube-scheduler: 노드에 할당되지 않은 파드를 감지하고, 해당 파드를 실행할 가장 적합한 노드를 결정하여 해당 노드에 할당한다.
- kube-conroller-manager: 클러스터 내에서 다양한 컨트롤러를 실행하는 역할이다. Node Controller, Replication Controller 등등
자 이제 여기서 kubectl 커맨드는 kube apiserver와 커뮤니케이션한느 뇽도라고 할 수 있다.
이 전체적인 마스터 노드의 흐름을 정리해보자면, 흔히 클라이언트 > 백엔드 서버 > 데이터 서버의 역할을 한느 방식으로 마스터 노드가 돌아간다고 볼 수 있다. 클라이언트의 요청을 처리하는 api 서버가 있고, 그 api가 클러스터의 상태 데이터를 저장하는 데 활용하는 데이터베이스가 존재한다. 스케줄러와 컨트롤매니저가 클라이언트, 큐브 api 서버가 백엔드, etcd가 데이터 서버에 해당된다고 볼 수 있다.
scheduler:
Api 서버와 통신하는 컴포넌트로써, 각각의 노드(워커 노드)의 자원(cpu, memory, gpu 등) 사용 상태를 관리한다. 동시에 아직 노드가 배정되지 않은 새로 생성된 pod를 감지하고 새로운 워크로드를 띄우는 역할을 한다. 이 때, 클러스터내 자원할당이 가능한 노드중 알맞은 노드를 선택하여 해당 노드에 워크로드를 배포하는(== pod를 띄우는) 역할을 한다.
여러 컨트롤러 프로세스를 관리한다. (이전에는 컨트롤러로가 각각 다 나누어져 있었는데, 하나로 통합되면서 매니저라는 이름이 붙은 것)
크게 두가지 매니저로 나뉘는데, Kube 컨트롤러 매니저와 Cloud 컨트롤러 매니저이다.
Cloud 컨트롤러 매니저는 대표적인 클라우드 provider들(aws, gcp, azure 등)과 통신한다. 각각의 클라우드 환경에 맞춘 컨트롤러가 배정되어, provider들의 종속적인 기능들을 클러스터에서 수행하는 역할을 한다.
kube 컨트롤러 매니저도 여러 컨트롤러로 이루어져있다. Api 서버에는 다양한 api 리소스들(pod, deployment, service, secret 등)이 있고 각각의 리소스들을 관리하는 컨트롤러가 배정된다. 이들은 Api 서버를 주기적으로 찌르면서 현재 클러스터 상태와, etcd에 저장된 리소스의 상태를 비교한다. 만약 etcd 리소스 상태에 변화가 있다면 이를 현재 클러스터 리소스에 반영함으로써 동기화 시켜준다. 이러한 변화를 감지하고 동기화시키는 반복된 과정을 reconcile 이라고 부른다.