일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- docker
- 도커 이미지
- swift 클로저
- os
- 인프라
- 클라우드
- linux
- AWS
- boj
- 리눅스
- 도커
- 도커 명령어
- 프로세스
- centOS
- 네트워크
- C++
- Python
- 도커 컨테이너
- 쿠버네티스
- 데브옵스
- NGINX
- 컨테이너
- devops
- 운영체제
- Swift
- kubernetes
- k8s
- centOS7
- ios
- 부스트코스
- Today
- Total
귀염둥이의 메모
[K8s] 쿠버네티스 아키텍처 (Kubernetes Architecture), 구성 요소 본문
[K8s] 쿠버네티스 아키텍처 (Kubernetes Architecture), 구성 요소
겸둥이xz 2021. 10. 8. 18:26Master Node = Control-Plane
- 클러스터를 관리하는 역할을 한다
- etcd, kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy, docker 등이 실행된다
- 고가용성을 위해서 3대 이상으로 운영하기도 한다
Worker Node = Node
- 실제 컨테이너를 실행시키는 작업을 한다
- kubelet, kube-proxy, docker 등이 실행된다
Master Node와 Worker Node의 통신
쿠버네티스의 모든 통신의 중심에는 apiserver가 있다. apiserver를 통해서 다른 프로세스들이 서로 필요한 정보를 주고받는다.
etcd에 대한 접근은 apiserver만 가능하다.
마스터 서버를 보면 kubelet이 마스터에 있는 docker를 관리한다. docker내에 컨테이너로 kube-scheduler, controller-manager, api-server, proxy가 작동한다. 이 프로세스들은 hyperkube라는 하나의 바이너리 파일로 컴파일되어 있고, 실행할 때 각각 다른 옵션을 부여함으로써 각각의 역할을 한다. etcd가 컨테이너가 아닌 프로세스로 빠져있는 이유는 서버 프로세스로 실행해도 구성이 가능하다는 것을 보여주기 위함이다.
노드 역시 kubelet으로 docker를 관리한다. kubelet은 마스터의 kube-apiserver와 통신하면서 파드의 생성, 관리, 삭제를 담당한다. 노드의 kube-proxy는 마스터와는 다르게 컨테이너가 아니라 서버 프로세스로 실행되고 있는데, 사실 컨테이너로도 실행할 수 있다.
마스터용 컴포넌트
- etcd
- 고가용성을 제공하는 key-value 저장소
- 쿠버네티스에서 필요한 모든 데이터를 저장하는 실직적인 데이터베이스
- etcd 자체를 클러스터링 하고 여러 개 마스터 서버에 분산해서 실행해 데이터의 안정성을 보장하도록 구성한다
- 안정적인 운영을 위해 주기적으로 etcd 데이터를 백업하는게 좋음
- kube-apiserver
- 클러스터의 API를 사용할 수 있도록 하는 컴포넌트
- 클러스터로 들어온 요청이 유효한지 검증하는 역할을 한다
- 쿠버네티스는 MSA 구조로 되어있고, 여러 개의 분리된 프로세스로 구성되어 있기 때문에
- 쿠버네티스에 보내는 모든 요청은 apiserver를 이용해서 다른 컴포넌트로 전달
- kube-scheduler
- 클러스터 안에서 자원 할당이 가능한 최적의 노드를 선택해서 새로운 파드를 실행한다
- 하드웨어 요구사항, Affinity/Anti-affinity 만족 여부, 특정 데이터가 있는 노드에 할당 등이 가능
- kube-controller-manager
- 컨트롤러 각각을 실행하는 컴포넌트이다 (컨트롤러는 파드들을 관리하는 역할)
- 새로운 컨트롤러를 사용할 때는 컨트롤러에 해당하는 구조체를 만든다 (Go 언어)
- 구조체를 controller-manager가 관리하는 큐에 넣어서 실행하는 방식으로 동작
- cloud-controller-manager
- 컨트롤러들을 클라우드 서비스와 연결해 관리하는 컴포넌트
- 관련 컴포넌트 소스 코드는 각 클라우드 서비스에서 직접 관리한다
- Node Controller : 클라우드 서비스 안에서 노드를 관리하는데 사용
- Route Controller : 클라우드 서비스 안의 네트워크 라우팅을 관리
- Service Controller : 클라우드 서비스에서 제공하는 로드밸런서를 생성, 갱신, 삭제
- Volume Controller : 클라우드 서비스에서 생성한 볼륨을 노드에 연결하거나 마운트
노드 컴포넌트
- kubelet
- 모든 노드(마스터, 워커)에서 실행되는 에이전트
- 파드 컨테이너들의 실행을 직접 관리
- PodSpec 설정을 전달받아서 컨테이너를 실행하고, HealthCheck를 진행함
- kube-proxy
- 쿠버네티스는 클러스터 내부에 별도의 가상 네트워크를 설정하고 관리
- kube-proxy는 이런 가상 네트워크의 동작을 관리하는 컴포넌트
- 호스트의 네트워크 규칙을 관리하거나 연결을 전달할 수 있음
애드온(Addons)
클러스터 안에서 필요한 기능을 실행하는 파드이다. 네임스페이스는 kube-system이며 애드온으로 사용하는 파들은 디플로이먼트, 레플리케이션 컨트롤러 등으로 관리한다.
네트워킹 애드온
클러스터 안에 가상 네트워크를 구성해 사용할 때 kube-proxy 이외에 네트워킹 애드온을 사용한다. 퍼블릭 클라우드 서비스에서 제공하는 쿠버네티스를 사용한다면 별도의 네트워킹 애드온이 제공되기 때문에 신경쓰지 않아도 된다. 만약 쿠버네티스를 직접 서버에 구성한다면 네트워킹 애드온을 설치해서 사용해야 한다.
DNS 애드온
클러스터 안에서 동작하는 DNS 서버이다. 쿠버네티스 서비스에 DNS 레코드를 제공하고, 쿠버네티스 안에 실행된 컨테이너들은 자동으로 DNS 서버에 등록된다. kube-dns와 CoreDNS가 대표적이다.
대시보드 애드온
웹 UI로 쿠버네티스를 사용할 수 있다. 쿠버네티스에서 제공하는 대시보드 애드온으로 클러스터 현황이나 파드 상태를 한눈에 쉽게 파악할 수 있다.
컨테이너 자원 모니터링
클러스터 안에서 실행 중인 컨테이너의 상태를 모니터링하는 애드온이다. CPU 및 메모리 사용량 같은 데이터들을 시계열 형식으로 저장해서 볼 수 있다. kubelet 안에 포함된 cAdvisor라는 컨테이너 모니터링 도구를 사용한다.
클러스터 로깅
클러스터 안에 개별 컨테이너의 로그와 쿠버네티스 구성 요소의 로그들을 중앙화한 로그 수집 시스템에 모아서 보는 애드온이다.
각 노드에 로그를 수집하는 파드를 실행해서 로그 중앙 저장 파드로 로그를 수집한다.
References
https://arisu1000.tistory.com/27828?category=787056
'Infra & Devops > Kubernetes' 카테고리의 다른 글
[K8s] 쿠버네티스 레이블(Label), 어노테이션(Annotation) (0) | 2021.10.09 |
---|---|
[K8s] 서비스(Service)와 인그레스(Ingress) (0) | 2021.10.08 |
[K8s] kube-proxy (0) | 2021.10.07 |
[K8s] 파드(Pod) 구성 패턴 (0) | 2021.10.05 |
[K8s] 컨테이너 프로브(Probe), 컨테이너 진단 (0) | 2021.10.05 |