Web/Kubernetes
쿠버네티스 아키텍처 (구성/설계)
tose33
2024. 1. 5. 12:42
출처
https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%9E%85%EB%AC%B8
초보를 위한 쿠버네티스 안내서 강의 - 인프런
쿠버네티스를 1도 모르는 입문자, 초보자를 위한 쿠버네티스 안내서 입니다. 초보자도 이해하기 쉬운 내용과 흐름으로 구성했어요., 데브옵스(DevOps) 입문자라면 주목! 쿠버네티스의 첫발을 함
www.inflearn.com
원하는 상태
- 쿠버네티스는 모든걸 원하는 상태로 관리한다
- 개발자가 원하는 상태를 정의하고, 쿠버네티스는 상태체크,차이점발견,조치의 과정을 반복하면서 계속해서 원하는 상태로 만든다
쿠버네티스 구조
- 쿠버네티스는 마스터와 노드로 구성되어 있다
- 모든 명령은 마스터의 api 서버를 호출하고 노드는 마스터와 통신하면서 필요한 작업을 수행한다
- 즉 사용자는 노드에 직접 명령하지 않고 마스터에게 원하는 상태를 알려주면 마스터가 원하는 상태가 되는데 필요한 작업들을 수행한다
마스터
etcd
- 모든 상태와 데이터를 저장한다
- 분산 시스템으로 안전성 높임 (고가용성)
- key-val 형태로 데이터 저장
- 현재 상태, 원하는 상태 등 중요한 데이터가 저장되기 때문에 백업 필수
API 서버
- 상태를 바꾸거나 조회
- etcd 와 유일하게 통신하는 모듈
- 다른 모듈들이 etcd와 소통해야 하면 직접 소통하지 않고, API 서버와 소통하고 API 서버가 etcd와 소통한다
- 인터페이스는 REST API 형태로 제공
- 권한 체크해 권한 없을 경우 요청 차단
- 수평 확장 가능 하도록 디자인됨
Scheduler
- 새로 생성된 Pod을 감지하고 Pod에 요청이 오면 어떤 노드에 실행할지 결정
- 노드에 라벨을 붙이고 특정 라벨이 붙은 노드에 배포,요청을 할수 있다
Controller
- 끊임 없이 상태 체크하고 원하는 상태 유지
- 논리적으로 다양한 컨트롤러가 존재
- 단일 프로세스로 실행
조회 흐름
컨트롤러는 상태를 체크하고 원하는 상태를 유지한다.
컨트롤러가 원하는 상태를 유지하기 위해 API 서버, etcd 와 어떻게 소통하는지 흐름을 알아보자
- Controller는 etcd와 직접 소통하지 않고 API 서버에게 요청한다
- API 서버는 컨트롤러의 권한을 확인한다
- 권한이 있다면 etcd에서 정보를 조회한다
- etcd는 원하는 상태가 변경되었다면 API 서버에게 알려주고, API 서버는 controller 에게 알린다
- 컨트롤러는 현재 상태와 원하는 상태가 바뀌었다면 조치를 취하기 위해 API 서버에게 요청한다 (리소스 변경)
- API 서버는 컨트롤러가 리소스 변경 권한이 있는지 확인하고, 권한 있다면 etcd의 리소스 변경한다
노드
Kubelet
- Pod을 실행 중지하고 상태를 체크
- CRI (Container Runtime Interface, 대표적으로 도커) 를 Pod로 감싸서 사용
- 각 노드에서 실행
Proxy
- 네트워크 프록시(중간에서 요청 응답 전달)와 부하 분산 역할
- 성능상의 이슈로 프록시가 따로 존재하는것 아닌 iptable 또는 IPVS 사용해서 설정만 관리
Pod 생성 흐름
- Pod 추가 요청이 API 서버에 도달한다
- API 서버는 etcd에 Pod-생성요청 을 기록한다
- 컨트롤러는 계속해서 상태를 체크하고 원하는 상태를 유지하는 역할을 하는데, 이때 Pod-생성요청 즉 원하는 상태의 변경을 감지한다
- 원하는 상태의 변경을 감지한 컨트롤러는 API 서버에 Pod-할당 요청을 보낸다
- API 서버는 etcd에 Pod-할당요청을 기록한다
- 스케줄러는 Pod-할당요청을 감지하고, 적절한 노드에 Pod를 할당한다
- API 서버는 Pod-노드할당/미실행 을 etcd 에 기록한다
- Kubelete는 자신이 관리하는 노드의 Pod 중 미실행인 Pod을 확인하고 실행한다
- API 서버는 Pod-노드할당/실행중 을 etcd에 기록한다
보면 각 컴포넌트들은 무조건 API 서버에게 보고하는 형태이고, API 서버는 각 컴포넌트 들을 대신해서 etcd 에 상태를 기록한다.
etcd의 상태변화를 보면 다음과 같다.
- Pod-생성요청
- Pod-할당요청
- Pod-노드할당/미실행
- Pod-실행중
쿠버네티스의 각 컴포넌트들은 계속해서 자기 임무를 각자 수행한다.
예를들어 컨트롤러는 계속해서 원하는 상태의 변경을 감지하고 있다가 원하는 상태의 변경을 감지하면 API 서버에게 원하는 상태를 달성하기 위해 필요한 요청을 한다.