DevBoi

1. k8s 상세 구조 본문

Infra/[K8S & Docker]

1. k8s 상세 구조

HiSmith 2022. 8. 26. 14:17
반응형

grafana로 admin을 보고

helm으로 업데이트하고

kubectl로 명령어를 치고...

 

우선 K8S에 대한 구조를 익혀보자

 

 

 

 

우선 이런 구조이다.

어떤 서버에 용량이 여유가있어서, 새로운 컨테이너를 배포하려고하면 어떤 서버에 넣어야할까?

사람이 직접 골라서 하지않는다. Master서버에서 어떤 서버에 여유가있어서 이 컨테이너가 어떤 서버에 들어갈 수 있는지를 골라서 해준다.

 

1) etcd

모든 상태와 데이터를 저장하고

분산 시스템으로 구성하여 안전성을 높인다.

가볍고 빠르면서 정확하게 설계가 디고, key-value 형태로 데이터를 저장한다.

TTL, watch같은 부가 기능을 제공하기도 한다.

모든 상태를 저장하기 때문에 백업은 필수이다.

대부분 두 대정도 돌아간다.

 

2) Scheduler

컨테이너가 신규로 투입될때 어떤 서버에 넣으면 좋을지를 골라주는

어떤 서버에 얼만큼 자원의 여유가 있는지를 체크해서 신규로 투입되는 컨테이너에 대한 선별 작업을 진행해주는 친구이다.

Pod을 어떤 노드에서 작동 시킬지를 제어하기 위한 컴포넌트이다.

즉 여유있는 노드에 Pod을 수행시키는 작업을 한다.

새로 생성된 pod을 감지하고, 어떤 노드에 실행할지 선택하는 역할을 한다.

 

3) Controller

클러스터의 상태를 감시하고 본래 유지되어야 하는 상태를 유지해주는 백엔드 컴포넌트이다.

정의 파일에서 정의 한 것과 실제노드나 컨테이너에서 작동하고있는 상태를 모아서 관리해준다.

다양한 컨트롤러가 존재한다.

복제 컨트롤러

노드 컨트롤러

엔드포인트 컨트롤러 등...

끊임없이 상태를 체크하고 원하는 상태를 유지하는 역할을 한다.

복잡성을 낮추기 위해 하나의 프로세스로 실행한다.

 

 

4) Api server

상태를 바꾸거나 상태를 조회한다.

etcd와 유일하게 통신하는 모듈

다른 컴포넌트는 api server에게 물어보고, 이 서버가 etcd와 통신해서 응답한다.

권한체크를 하여, 권한없으면 차단한다.

관리자 요청 뿐 아니라 다양한 내부모듈과 통신한다.

수평으로 확장되도록 디자인 되었다. 즉 요청이 많기 때문에 스케일 아웃으로 확장가능하도록 디자인 되어있다.

 

 

Master 상세 - 조회 흐름

1. Controller에서 API server로 조회를 요청

2. API server가 권한 체크, etcd를 조회해서 상태를 가져다가 controller에 던져준다.

3. Controller는 현재상태와 원하는 상태가 변경다르다면, 현재상태를 변경하고 이 결과를 Api server에 응답한다.

4. Api server는 정보변경 권한 체크 후, etcd 에 정보를 변경해준다.

 

아래는 간단하게 전체적인 구조이다.

 

 

이제 Master와 Node의 구조를 보자

node에는 크게 두가지 모듈이 떠있다. Proxy, Kubelet 이 떠있다.

이 노드도 결국 Api server와만 통신한다.

 

<Kubelet>

Kubelet이 이 pod과 직접 통신한다.

Kubelet은 각 노드 마다 존재하고

이 kubelet이 결국 노드마다 pod을 실행/중지하는 역할을 한다.

CRI라고 컨테이너 인터페이스가 존재한다. (ex.docker 등등)

 

<Proxy>

네트워크 프록시와 부하 분산 역할을 한다.

성능상의 이유로 별도의 프록시 프로그램 대신 iptables와 같이 설정 정보만 가지고있다.

 

 

자 이제 전반적인 구조는 아래와 같다.

 

Pod 요청과정을 한번더 정리해보자

 

1. 관리자가 Pod생성을 요청한다.

2. Api server가 이 요청을 받고 etcd 에 pod 생성 요청이라는 것을 저장한다.

3. Controller가 새 pod 확인요청 계속, pod 생성 요청 확인 발견!

4. 실제 pod 할당 요청을 controller -> api server로 전송, 이 요청정보를 etcd에 저장

5. scheduler가 pod 할당 요청이 있는지를 확인, 특정 노드에 pod 할당 요청

6. api server 가 pod 노드 할당, but 실행되지않은 pod을 etcd에 저장

7. kubelet이 미실행 pod 있는지 확인하고 있다가, 미 실행 된게 있으면 실행하고 다시 이 정보를 api server를 통해 etcd에 저장

8. etcd에는 특정 pod이 어떤노드에서 할당되었고, 실행중인지에 대한 정보가 저장되어있다.

 

 

Addons

CNI,DNS,DashBoard를 합쳐서 제공해준다.

이는 참고만 하자

반응형

'Infra > [K8S & Docker]' 카테고리의 다른 글

[k8s] Pod 생성 및 실습  (0) 2022.08.27
[k8s] 기본 명령어 공부  (0) 2022.08.27
[k8s]Mac에서 데모 준비  (0) 2022.08.27
3.k8s 데모 구현준비  (0) 2022.08.26
2. k8s 오브젝트 분석  (0) 2022.08.26