Kubernetes

4. kubernetes architecture

chaenii 2022. 2. 6. 00:29

kubernetes cluster는 크게 두 종류의 서버로 구성한다.

 

1️⃣ master (control plane): 클러스터를 관리하는 서버

2️⃣ node: 실제 컨테이너를 실행시키는 서버

 

master는 보통 고가용성을 만족하고자 서버 3대 정도 구성해서 운영한다. 평소 실제 클러스터를 관리하는 리더 마스터는 1대고 나머지는 대기한다. 리더 마스터에 장애가 발생하면 자연스럽게 2대 중 1대가 리더 역할을 한다.


master와 노드의 구성과 통신 구조

1️⃣  master 

마스터를 보면 kubelet이 마스터에 있는 도커를 관리한다.

각 컴포넌트의 중심은 kube-apiserver이다. kube-apiserver를 거쳐 다른 컴포넌트가 서로 필요한 정보를 주고 받으며, etcd에는 kube-apiserver만 접근할 수 있다.

kube-scheduler, kube-controller-manager, kube-apiserver, kube-proxy는 컨테이너로 실행한다.

 

2️⃣  node

노드도 마스터와 마찬가지로 kubelet이 도커를 관리한다.

kubelet은 마스터의 kube-apiserver와 통신하면서 파드의 생성, 관리, 삭제를 담당한다.


master component

etcd - key-value 저장소

kubernetes에서 필요한 모든 데이터를 저장하는 데이터베이스 역할을 한다.

 

kube-apiserver

kubernetes cluster의 API를 사용할 수 있도록 하는 컴포넌트이다.

클러스터로 온 요청이 유효한지 검증한다. 예를 들어 kubectl 명령어로 파드 정보 조회를 요청받으면, 해당 자원을 대상으로 요청을 실행할 권한이 있는지 검사하고 권한이 있다면 파드 정보를 조회해 보여준다.

쿠버네티스에 보내는 모든 요청은 kube-apiserver를 이용해 다른 컴포넌트로 전달한다. 

 

kube-scheduler

현재 클러스터 안에서 자원 할당이 가능한 노드 중 알맞은 노드를 선택해서 새롭게 만든 파드를 실행한다. 

파드 할당의 조건에는 하드웨어 요구 사항, 함께 있어야 하는 파드들을 같은 노드에 실행하는 affinity등이 있다.

 

kube-controller-manager

파드들을 관리해주는 컴포넌트이다.

파드를 배포할 때 설정해둔 개수에 맞춰 파드를 실행시켜준다. 


node component

kubelet

kubelet은 클러스터 안 모든 노드에서 실행하는 에이전트이다.

파드 컨테이너들의 실행을 직접 관리한다.

kubelet은 PodSpec이라는 조건이 담긴 설정을 전달받아서 컨테이너를 실행하고 컨테이너가 정상적으로 실행되는지 헬스체크를 진행한다. 

 

kube-proxy 

쿠버네티스는 클러스터 안에서 별도의 가상 네트워크를 설정하고 관리하는데, kube-proxy가 이러한 가상 네트워크의 동작을 관리한다.

 

container runtime

container runtime은 실제로 컨테이너를 실행시킨다. docker, containerd, runc와 같은 런타임이 있다.

 


전체적인 흐름 정리

 

사용자가 kubectl create  명령어를 이용해 파드 생성을 요청했을 때 각 컴포넌트들이 동작하는 흐름을 전체적으로 정리해보았다. nginx 파드를 생성한다고 가정한다.

 

$ kubectl create -f nginx.yaml

 

1. API 

요청에 대한 문법, 권한이 합당한지 확인

etcd에 있는 정보 확인

 

* etcd는 노드들의 상태를 저장하고 있다.

   각 노드의 kubelet에는 cAdvisor를 포함하고 있는데, cAdvisor는 컨테이너 모니터링 툴이다.

   kubelet가 cAdvisor를 통해 노드의 정보를 수집해 master에 전달해준다.

 

2-1. API -> Scheduler

Scheduler에게 etcd 정보 전달

 

2-2. Scheduler -> API

etcd 정보를 바탕으로 파드를 배포할 노드를 선정한 후 결과 전달 (node1이라고 가정)

 

3. API -> node1의 kubelet에 접속

kubelet에게 nginx 웹서버를 실행해달라고 요청한다.

 

4. kubelet -> docker

docker 명령어로 docker에게 nginx 웹서버를 실행해달라고 요청한다.

 

5. docker 

docker hub에서 해당 이미지가 있는지 확인하고 이미지를 pull해서 컨테이너 생성

 

* controller가 계속해서 파드를 감시하며 파드의 개수를 보장해준다.

 

반응형