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가 계속해서 파드를 감시하며 파드의 개수를 보장해준다.
'Kubernetes' 카테고리의 다른 글
5-3. Init container (0) | 2022.02.07 |
---|---|
5-2. livenessProbe를 이용해 Self-healing Pod 만들기 (0) | 2022.02.06 |
Deployment를 이용해 Container 실행하기 (0) | 2022.02.05 |
kubeconfig에 대해서 알아보자 (0) | 2022.02.05 |
[ERROR] kubelet.service: Unit entered failed state. (0) | 2022.02.04 |