클러스터 전체 구조
K8S 클러스터는 크게 두 종류의 서버로 구성됩니다.
클러스터를 관리하는 Control-plane(master) 노드와 실제 컨테이너를 실행시키는 Worker(Node) 노드입니다.
Control-plane에는 etcd, kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy, docker 등의 컴포넌트가 실행됩니다. 각각이 다른 Control-plane, Worker Node에서 별개로 실행되어도 실제 쿠버네티스 클러스터를 운영하는데 이상은 없습니다.
Worker Node에는 kubelet, kube-proxy, docker 등의 컴포넌트가 실행됩니다. 실제 사용하는 컨테이너 대부분은 Worker Node에서 실행됩니다.
다음은 통신이 이뤄지는 구조입니다.
각 컴포넌트 중심에 kube-apiserver가 있습니다. 모든 통신은 kube-apiserver를 통합니다. 특히 etcd에는 kube-apiserver만 접근할 수 있습니다. Control-plane을 보면 kubelet이 Control-plane의 도커를 관리합니다. 도커 안에는 kube-apiserver, kube-scheduler, kube-controller-manager, kube-proxy가 있습니다. 초기에는 관리용 컴포넌트들을 컨테이너가 아닌 프로세스로 실행했는데 최근에는 전부 컨테이너로 실행합니다.
etcd는 컨테이너가 아닌 별도의 프로세스로 설정되어 있습니다. 사실 etcd까지 컨테이너로 설정할 수 있지만 컨테이너가 아닌 서버 프로세스로 실행하도록 구성할 수 있음을 알리려고 그림처럼 소개된 것입니다.
Worker Node 역시 kubelet으로 도커를 관리합니다. kubelet은 Control-plane의 kube-apiserver와 통신하면서 파드의 생성, 관리, 삭제를 담당합니다. Worker Node의 kube-proxy는 Control-plane과는 다르게 컨테이너가 아니라 서버 프로세스로 실행할 수 있습니다. 물론 컨테이너로도 실행이 가능합니다.
주요 컴포넌트
Control-plane에는 etcd, kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy, docker 등의 컴포넌트가 실행됩니다.
Control-plane 컴포넌트
etcd
etcd는 코어 OS에서 개발한 고가용성을 제공하는 key-value 저장소입니다. 분산 시스템에서 노드 사이의 상태를 공유하는 합의 알고리즘 중 하나인 raft 알고리즘을 구현한 것입니다. k8s에서는 필요한 모든 데이터를 저장하는 데 사용하는 데이터베이스로 사용합니다.
etcd는 서버 하나당 프로세스 1개만 사용할 수 있습니다. 보통 etcd 자체를 클러스터링 한 후 여러 개 마스터 서버에 분산해서 실행해 데이터의 안정성을 보장하도록 구성합니다.
kube-apiserver
kube-apiserver는 쿠버네티스 클러스터의 API를 사용할 수 있도록 하는 컴포넌트입니다. 클러스터로 온 요청이 유효한지 검증합니다. 예를 들어 쿠버네티스 API 스펙에 맞춰 클러스터의 특정 네임스페이스에 존재하는 디플로이먼트 목록 조회 요청을 받았다고 하면, 이 요청에 사용된 토큰이 해당 네임스페이스와 자원을 대상으로 요청을 실행할 권한이 있는지 검사하고 목록을 조회하여 전달합니다. 쿠버네티스에 보내는 모든 요청은 kube-apiserver를 이용해서 다른 컴포넌트로 전달합니다.
kube-scheduler
kube-scheduler는 현재 클러스터 안에서 자원 할당이 가능한 노드 중 알맞은 노드를 선택해서 새롭게 만든 파드를 실행합니다. 파드는 처음 실행할 때 여러 가지 조건을 설정하며, kube-scheduler가 조건에 맞는 노드를 찾습니다. 조건에는 하드웨어 요구사항, 함께 있어야 하는 파드들을 같은 노드에 실행하는 어피니티와 파드를 다양한 노드로 분산해서 실행하는 안티 어피니티 만족여부, 특정 데이터가 있는 노드에 할당 등이 있습니다.
kube-controller-manager
컨트롤러 각각을 실행하는 컴포넌트입니다. 쿠버네티스는 Go언어로 개발되었는데, 클러스터 안에서 새로운 컨트롤러를 사용할 때는 컨트롤러에 해당하는 구조체를 만듭니다. 이 구조체를 kube-controller-manager가 관리하는 큐에 넣어서 실행하는 방식으로 동작합니다.
cloud-controller-manager
cloud-controller-manager는 쿠버네티스의 컨트롤러들을 클라우드 서비스와 연결해 관리하는 컴포넌트입니다.
- 노드 컨트롤러 : 클라우드 서비스 안에서 노드를 관리하는 데 사용합니다.
- 라우트 컨트롤러 : 각 클라우드 서비스 안의 네트워크 라우팅을 관리하는데 사용합니다.
- 서비스 컨트롤러 : 각 클라우드 서비스에서 제공하는 로드밸런서를 생성, 갱신, 삭제하는 데 사용합니다.
- 볼륨 컨트롤러 : 클라우드 서비스에서 생성한 볼륨을 노드에 연결하거나 마운트 하는 등에 사용합니다.
Worker Node 컴포넌트
kubelet
kubelet은 클러스터 안 모든 노드에서 실행되는 에이전트입니다. 파드 컨테이너들의 실행을 직접 관리합니다. kubelet은 파드 스펙이라는 조건이 담긴 설정을 전달받아서 컨테이너를 실행하고 컨테이너가 정상적으로 실행되는지 헬스체크를 진행합니다. 단, 노드 안에 있는 컨테이너라도 쿠버네티스가 만들지 않은 컨테이너는 관리하지 않습니다.
kube-proxy
가상 네트워크의 동작을 관리하는 컴포넌트입니다. 호스트의 네트워크 규칙을 관리하거나 연결을 전달할 수도 있습니다.
컨테이너 런타임
컨테이너 런타임은 실제로 컨테이너를 실행시킵니다. 가장 많이 알려진 런타임으로 Docker가 있고 containerd, runc 같은 런타임도 지원합니다. 보통 컨테이너 표준을 정의하는 OCI(open container initiative)의 런타임 규격을 구현한 컨테이너 런타임이라면 쿠버네티스에서 사용할 수 있습니다.
'Books' 카테고리의 다른 글
3. 오브젝트와 컨트롤러 - 1 (0) | 2023.03.29 |
---|---|
1. 쿠버네티스 소개 (0) | 2023.01.29 |