DevOps/Kubernetes
[Kubernetes] Architecture
최블랙
2022. 1. 11. 17:14
Desired State
Desired State는 쿠버네티스의 가장 중요한 핵심이다. 쿠버네티스는 원하는 상태를 계속 체크하고 차이점이 있다면 자동으로 조치를 한다. 여기서 원하는 상태(Desired State)는 관리자가 바라는 환경을 의미하고, 좀 더 구체적으로 몇 개의 웹 서버를 구동시킬 것인지, 몇번 포트로 서비스할 것인지 등에 대한 정보를 말한다.
Desired State를 설정하는 방법
쿠버네티스에서는 YAML 또는 JSON 파일을 사용해 원하는 상태(Desired State)에 대해 명시적으로 설정할 수 있다. 쿠버네티스는 작성 파일에 정의된 사양(spec)에 따라 컨테이너의 라이프사이클을 관리한다.
Architecture
쿠버네티스의 아키텍처는 크게 마스터 노드(Master Node)와 워커 노드(Worker Node)로 나눌 수 있다.
- 마스터 노드: 전체 쿠버네티스 시스템을 관리하고 통제하는 Control plane 역할
- 워커 노드: 컨테이너화된 애플리케이션을 실행하는 시스템으로 서비스 실행, 모니터링 제공
Master Node(마스터 노드)
etcd
- 모든 상태와 데이터 저장
- 분산 시스템으로 구성하여 안정성을 높임 → 고가용성
- 가볍고 빠르면서 정확하게 설계 → 일관성
- Key(directory)-Value 형태로 데이터 저장
- TTL(time-to-live), watch 같은 부가 기능 제공
- 굉장히 중요한 데이터이기 때문에 백업 필수
API Server
- 상태를 바꾸거나 조회하는 역할
- etcd와 유일하게 통신하는 모듈
- 다른 컴포넌트들은 etcd의 정보를 갱신, 조회하기 위해 API 서버와 통신함
- REST API 형태로 제공
- 권한을 체크하여 적절한 권한이 없을 경우 요청 차단
- 관리자 요청(e.g., kubectl)뿐만 아니라 다양한 내부 모듈(e.g., 컨트롤러)과 통신
- API 서버의 로드가 굉장히 많기 때문에 수평으로 확장되도록 디자인
Scheduler
- 새로 생성된 Pod을 탐지하고 생성된 Pod이 있을 때 어떤 노드에 할당할지 결정함
- 노드의 현재 상태 및 Pod의 요구사항을 체크
- 노드에 라벨 부여 e.g., a-zone, b-zone, gpu-enabled 등
Controller
- 논리적으로 다양한 컨트롤러가 존재함
- 복제 컨트롤러(Relica Set 확인), 엔드포인트 컨트롤러(로드밸런싱 체크) 등
- 끊임없이 상태를 체크하고 원하는 상태(Desired State)를 유지
- 복잡성을 낮추고 관리의 편의성을 위해 단일 프로세스로 실행
조회 흐름
- 컨트롤러는 컨트롤러가 체크하고 있는 상태를 조회하기 위해 API 서버에 조회 요청한다.
- API 서버는 컨트롤러가 해당하는 정보를 조회할 수 있는지 권한을 체크한다.
- 권한이 있다면, etcd에 정보를 조회하고 컨트롤러에게 알려준다.
갱신 흐름
- 컨트롤러가 계속해서 상태를 체크하고 원하는 상태(Desired State)가 변경되었을 경우 원하는 상태로 리소스를 변경한다.
- 리소스 변경 결과를 API 서버에게 전달한다.
- API 서버는 컨트롤러가 정보를 갱신할 수 있는지 권한을 체크한다.
- 권한이 있다면, etcd에 정보를 갱신한다.
Worker Node(워커 노드)
워커 노드의 Proxy와 Kubelet 또한 마스터 노드와 통신하기 위해 API 서버에게 요청한다.
Kublet
- 각 노드에서 실행
- Pod의 실행/중지/상태 체크 담당
Proxy
- 애플리케이션 구성 요소 간 네트워크 트래픽 분산 및 프록시 담당
쿠버네티스 흐름
- 관리자가 API 서버에 Pod 생성을 요청한다.
- API 서버는 etcd에 Pod 생성 요청 정보를 추가한다.
- 컨트롤러는 새로운 Pod 생성 요청이 있는지 계속 확인한다.
- Pod 생성 요청이 있으면, API 서버에 Pod 할당을 요청한다.
- API 서버는 etcd에 Pod 할당 요청으로 상태를 바꾼다.
- 스케쥴러는 새로운 Pod 할당 요청이 있는지 계속 확인한다.
- Pod 할당 요청이 있으면, 특정 노드에 해당 Pod을 할당하고 API 서버에게 상태를 전달한다.
- API 서버는 etcd에 노드 할당/미실행으로 상태를 바꾼다.
- Kublet은 내 노드에 할당된 Pod 중에 미실행 Pod을 계속해서 확인한다.
- 미실행 Pod이 있으면, Pod을 생성하고 API 서버에게 상태를 전달한다.
- API 서버는 etcd에 노드 할당/실행중으로 상태를 바꾼다.
Reference
https://www.youtube.com/watch?v=SNA1sSNlmy0&list=PLIUCBpK1dpsNf1m-2kiosmfn2nXfljQgb&index=6