쿠버네티스의 구성 요소의 유기적인 연결 관계를 표현하면 다음과 같다.
하나의 쿠버네티스 생태계를 쿠버네티스 클러스터라고 한다.
파드를 배포하는 순서에 따라서 요소들의 역할을 알아보자
마스터 노드
: 클러스터의 '두뇌' 역할을 담당한다.
- kubectl
쿠버네티스 클러스터에 명령을 내리는 커맨드라인 도구이다.
docker를 사용하기 위해서 모든 명령어가 docker ... 로 시작하는데, 쿠버네티스도 마찬가지로 클러스터에 명령을 내리기 위해서는 kubectl .. 이 명령의 시작이 된다.
일반적으로 개발자는 API 서버와 주로 통신하므로 API가 서버가 위치한 마스터 노드에 구성된다.
자주 쳐야하는 명령어지만 타이핑이 까다로워서 alias kbc='kubectl'로 설정하면 편하다. - API 서버
쿠버네티스 클러스터의 중심 역할을 하는 통로이다.
주로 상태 값을 저장하는 etcd와 통신하지만, 다른 요소들 또한 API 서버를 중심에 두고 통신하기 때문에 API 서버의 역할이 매우 중요하다.
매우 중요한 역할이지만 우리가 아는 일반적인 RESTAPI서버와 동일하게 구성되었다.
개발자가 kubectl 커맨드라인을 이용해서 API 서버에 명령을 보내면 API서버는 적절한 위치로 명령을 보내준다. - etcd
구성 요소들의 상태 값이 모두 저장되는 곳이다.
서비스들이 위치한 서버의 IP 주소 및 port 번호 등이 저장된다. etcd 외의 다른 구성 요소는 상태 값은 관리하지 않는다.
그래서 etcd의 정보만 백업되어 있다면 긴급 장애 상황에서도 쿠버네티스 클러스터는 복구할 수 있다.
추가로, etcd는 분산 저장이 가능한 key-value 저장소이므로, 복제해서 여러 곳에 저장해 두면 하나의 etcd에서 장애가 나더라도 시스템의 가용성을 확보할 수 있다.
etcd의 어원 : etc디렉토리와 distribute의 합성어.(구성 정보를 퍼뜨려서 저장하겠다는 뜻이다.) - 컨트롤러 매니저(c-m)
쿠버네티스 클러스터의 오브젝트 상태를 관리한다.
노드 컨트롤러, 클라우드 컨트롤러, 엔드포인트 컨트롤러, 레플리케이션 컨트롤러 등을 포함한다.
예를 들어 특정 워커 노드가 통신 불능이 된 경우, 상태 체크와 복구 작업은 컨트롤러 매니저에 속한 노드 컨트롤러에서 이루어 진다. 서비스와 파드를 연결하는 역할은 엔드포인트 컨트롤러가 수행한다.
이처럼 다양한 상태 값을 관리하는 주체들이 컨트롤러 매니저에 소속되어 각자의 역할을 수행한다. - 스케줄러
노드의 상태와 자원, 레이블, 요구 조건 등을 고려해 파드를 어떤 워커 노드에 생성할 것인지를 결정하고 할당한다.
파드를 조건에 맞는 워커 노드에 지정하고, 파드가 워커 노드에 할당되는 일정을 관리하는 역할을 담당한다.
워커 노드
- kubelet
파드의 구성 내용(PodSpec)을 받아서 컨테이너 런타임으로 전달하고, 파드 안의 컨테이너들이 정상적으로 작동하는지 모니터링한다. - 컨테이너 런타임(Container Runtime Interface, CRI)
파드를 이루는 컨테이너의 실행을 담당한다.
파드 안에서 다양한 종류의 컨테이너가 문제 없이 작동하게 만드는 표준 인터페이스이다.
주로 docker가 사용된다. - 파드
한 개 이상의 컨테이너로 단일 목적의 일을 하기 위해서 모인 단위이다.
즉, 웹 서버 역할을 할 수도 있고 로그나 데이터를 분석할 수도 있다.
순서 x
- 네트워크 플러그인
쿠버네티스 클러스터의 통신을 위해서 네트워크 플러그인을 선택하고 구성해야한다.
컨테이너의 네트워크 안정성과 확장성을 보장하기 위해 개발되었다. - CoreDNS
클라우드 네이티브 컴퓨팅 재단에서 보증하는 프로젝트이다.
클러스터에서 도메인 이름을 이용해 통신하는데 사용한다.
파드가 배포된 이후 개발자 입장에서 배포된 파드에 접속하는 과정이다.
- kube-proxy
쿠버네티스 클러스터는 파드가 위치한 서버(노드)에 kube-proxy를 통해 파드가 통신할 수 있는 네트워크를 설정해준다. kube-proxy에 설정된 통신 관리 방법(ex. br_netfilter, iptables)을 사용해 네트워크를 설정해준다.
설정된 네트워크를 통해서 파드에 접속할 수 있다. - 파드
이미 배포된 파드에 접속하고 필요한 내용을 전달받는다.
대부분 개발자는 파드가 어느 서버에 위치하는지 신경 쓰지 않아도 된다.
'DevOps > Kubernetes' 카테고리의 다른 글
[kubernetes] #3 쿠버네티스 아키텍처 (0) | 2022.02.27 |
---|---|
[Kubernetes] #2 핵심 쿠버네티스 컴포넌트 (0) | 2022.02.27 |
[Kubernetes] #1 쿠버네티스란? (0) | 2022.02.26 |
[K8S] 쿠버네티스 파드의 생명주기 (0) | 2022.01.18 |
[K8S] 컨테이너 이해하기 (0) | 2022.01.09 |