이번 글에서는 쿠버네티스의 개념과 이를 구성하는 주요 요소들에 대해 정리해보려 한다.
도커 같은 컨테이너 기술이 개별 어플리케이션을 격리하고 실행하는 데 초점을 맞췄다면, 쿠버네티스는 이러한 컨테이너들을 수십, 수천 개 단위로 안정적이고 일관되게 관리할 수 있도록 해주는 시스템이다. 이는 구글에서 2014년에 오픈소스로 공개하였다.
쿠버네티스는 하나의 독립 실행 환경을 '클러스터'라는 단위로 구성한다. 클러스터는 크게 컨트롤 플레인 노드와 워커 노드로 나뉜다.
컨트롤 플레인은 클러스터의 상태를 관리하고 조정하는 두뇌 역할을 한다. 주요 구성 요소는 다음과 같다.
API 서버 (kube-apiserver)
kubectl
명령어, 다른 내부 컴포넌트, 외부 시스템 등에서 오는 요청을 받아 처리하며, RESTful API 인터페이스 제공한다.etcd
스케줄러 (kube-scheduler)
컨트롤러 매니저 (kube-controller-manager)
실제 어플리케이션 Pod를 실행하는 워커 노드이다. 주요 구성 요소는 다음과 같다.
Kubelet
Kube-proxy
컨테이너 런타임
Pod
쿠버네티스에서는 CNI(Container Network Interface) 표준(Calico, Fannel 등)을 사용해 파드 간, 노드 간의 네트워크 통신을 구성한다. 이로 인해 모든 파드가 고유한 IP를 가지며, IP 충돌 없이 다른 노드에 위치한 파드와 통신 가능하다.
즉, 쿠버네티스는 파드를 만들 때, CNI 플러그인에 파드에 대한 IP 주소 할당과 파드 간 통신 라우팅 구성을 요청한다.
1. kubectl
-> API 서버
사용자가 kubectl apply -f pod.yaml
같은 명령어로 파드를 생성하면, 이 요청은 쿠버네티스 API 서버에 전달됨.
2. API 서버 -> etcd
API 서버는 요청을 처리한 후, 클러스터의 상태 값을 최신으로 유지하기 위해서 etcd에 해당 정보를 기록한다.
3. 컨트롤러 매니저의 감지
API 서버를 모니터링하고 있던 컨트롤러 매니저가 새로운 파드가 생성됐다는 정보를 감지하고, 관련 컨트롤러를 통해 리소스를 조정한다.
예를 들어 레플리카셋이 관리하는 파드라면, 레플리카셋 컨트롤러가 작동.
4. 스케줄러의 감지 및 결정
파드가 스케줄링되지 않은 상태로 생성되면, 스케줄러가 API 서버를 통해 이를 감지한다. 생성된 파드를 어떤 워커 노드에 적용할지 조건을 고려해 결정하고, 해당 워커 노드에 파드를 띄우도록 요청한다.
5. 스케줄러 -> API 서버에 노드 정보 반영
스케줄러는 선택된 노드 정보를 API 서버에 다시 저장한다.
6. Kubelet -> 컨테이너 생성 요청
할당된 워커 노드의 Kubelet이 주기적으로 API 서버에서 자신에게 할당된 파드 정보를 조회하고, 파드를 생성해야 함을 인지. 이후, 런타임을 통해 파드 안의 컨테이너를 실행한다.
쿠버네티스 오브젝트는 쿠버네티스에서 생성하고 관리하는 리소스를 의미한다. 즉, 쿠버네티스 API를 통해 생성되는 모든 리소스는 오브젝트이다. 정말 다양한 오브젝트가 있는데 대략 5개의 카테고리로 나눌 수 있다.
1. 워크로드
"어떤 컨테이너를 어떻게 실행할 것인가"를 정의하는 오브젝트
2. 네트워크
"파드들이 서로 또는 외부와 어떻게 통신할 것인가"를 정의
3. 스토리지
"컨테이너에서 사용하는 저장 공간"을 정의
4. 구성
"어플리케이션에 전달되는 설정이나 비밀 정보" 정의
5. 정책
"보안과 자원 제한"을 위한 오브젝트
이번 글에서는 쿠버네티스 핵심 구성 요소와 주요 오브젝트에 대해 간단히 알아보았다. 다음 글에서는 쿠버네티스의 네트워크 구성과 볼륨에 대해 중점적으로 다뤄볼 예정이다.