탕구리's 블로그

[Kubernetes] #2 쿠버네티스 구성 본문

devOps

[Kubernetes] #2 쿠버네티스 구성

탕구리당 2020. 1. 12. 22:15
반응형

지난 포스팅에는 쿠버네티스가 무엇이고 어떤 기능을 할 수 있는지 간략하게 알아보았습니다.

이번 포스팅에는 쿠버네티스가 가지고 있는 기능이 어떻게 작동되고, 어떤 모습으로 시스템이 구성되어 있는지 알아 보려합니다.

 

쿠버네티스의 전체적인 구성은 아래와 같습니다.

 

 

크게 3가지(마스터 컴포넌트, 노드컴포넌트, 애드온)로 구성되어 있습니다.

클러스터를 구성하기 위해서는 최소 1개의 마스터노드 최소1개의 워커 노드를 구성해야 합니다.

워커 노드는 실제로 작업을 진행하기 위한 파드(pods)를 호스트하며, 마스터 노드는 워커 노드와 클러스터 내 파드를 관리하며

다수의 마스터 노드는 장애극복(fail over)과 고가용성의 클러스터에서 사용한다.

 

Master Component

마스터 컴포넌트는 클러스터에 관한 전반적인 결정을 수행한다. 마스터 컴포넌트는 클러스터 내 어떠한 머신에서든 동작이 가능하지만 일반적으로 구성 스크립트의 머신에 마스터 컴포넌트를 구동한다.

마스터 컴포넌트는 kube-apisever, etcd, kube-schduler, kube-controller-manager, cloud-controller-manager로 구성된다.

 

kube-apiserver

쿠버네티스는 MSA(마이크로서비스 아키텍쳐, Micro Service Architecture) 구조로 되어 있습니다.

그래서 각 프로세스 간에 요청을 전달을 매개체가 필요합니다. 그 역할을 Kube-apiserver에서 합니다.

또한, 요청에 대한 유효성 검증을 진행합니다. 수평적 스케일링을 위해 설계 되었습니다.

 

etcd

모든 클러스터 데이터를 담는 쿠버네티스 뒷단의 저장소(key-value)입니다.

쿠버네티스 클러스터에서 etcd를 뒷단의 저장소로 사용한다면, 데이터 백업은 필수입니다.

하나의 etcd만 구동하여 사용하기도 하지만 데이터의 안정성을 위해 여러 클러스터에 분산하여 etcd를 구성하는 것이 일반적인 구성입니다.

 

kube-scheduler

노드가 배정되지 않은 새로운 파드를 감지하고 현재 클러스터내에서 자원할당이 가능한 노드들 중에서

알맞은 노드를 선택하여 그곳에 포드를 띄우는 역할을 합니다.

즉, 포드가 실행되기 위해 가지는 여러 조건들을 고려해여 노드를 배치하는 역할을 합니다.

예를들어, 하드웨어 및 소프트웨어 요구사항, 어피니티/안티어피니티 조건, 특정 데이터가 있는지 여부 등 다양한 설정을 할 수 있습니다.

 

kube-controller-manager

쿠버네티스는 여러개의 컨트롤러들이 포드를 관리하는 방식으로 구동합니다. 각 컨트롤러들은 개별 프로세스 이지만, 복잡성을 낮추기 위해 모두 단일 바이너리로 컴파일 되고 단일 프로세스 내에서 실행합니다. 또한, kube-controller-manager는 컨트롤러들을 실행하는 역할을 합니다. 클러스터 내에서 새로운 컨트롤러가 사용될때는 그 컨트롤러에 해당하는 구조체가 만들어진 다음 kube-controller-manager가 

관리하는 큐에 넣어서 실행하는 방식으로 작동합니다.

 

1. node-controller : 노드가 다운되었을때 notification과 failover에 대한 책임을 갖습니다.

2. replication-controller : 시스템의 모든 레플리케이션 오브젝트에 대해 알맞은 수의 pod를 유지하도록 관리합니다.

3. endpoint-controller : 엔드포인트 오브젝트를 채웁니다.(서비스와 pod를 연결합니다.)

4. service account & token-controller : 새로운 네임스페이스에 대한 기본 계정과 API 접근 토큰 생성

 

cloud-controller-manager 

1. 노드 컨트롤러 : 클라우드 서비스 내에서 노드를 관리

2. 라우트 컨트롤러 : 클라우드 인프라내에서 네트워크 라우팅을 관리

3. 서비스 컨트롤러 : 클라우드 서비스에서 제공하는 로드 밸러서를 생성/갱신/삭제

4. 볼륨 컨트롤러 : 클라우드 서비스에서 볼륨을 생성해서 노드에 붙이고 마운트해서 볼륨을 관리하는데 사용

 

Node Component

노드 컴포넌트는 모든 노드에서 실행되면서, 각 노드에서 포드를 실행 및 관리하고, 쿠버네티스 실행 환경을 관리합니다.

노드 컴포넌트는 kubelet, kube-proxy, container-runtime 등이 있습니다.

 

kubelet

클러스내의 모든 노드에서 실행되는 에이전트 입니다. 포드내의 컨테이너들이 실행되는것을 관리합니다.

kubelet은 PodSpecs라는 설정을 받아서 조건에 맞게 컨테이너를 싱행하고 상태체크를 진행합니다.

동일 노드내에 존재하는 컨테이너라도 쿠버네티스에 의해 생성된 컨테이너만 관리합니다.

 

kube-proxy

클러스터 내부에 별도의 가상 네트워크를 설정하고 관리합니다.

 

kube-proxy는 노드의 네트워크 규칙을 유지 관리하며, 네트워크 규칙이 내부 네트워크 세션이나

클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 해준다.

 

kube-proxy는 운영 체제에서 가용한 패킷 필터링 계층이 있는 경우, 이를 사용하며

그렇지 않으면  트래픽 자체를 포워딩 한다.

 

container-runtime

컨테이너 실행을 담당하는 소프트웨어이다.

컨테이너 환경의 예를 들어 도커를 소개하였지만, 쿠버네티스 런타임은 도커 외에도 containered, cri-o, rktlet을 지원한다.

 

애드온

클러스터 기능을 이행하는 pod와 서비스입니다. 쿠버네티스 리소스(데몬셋, 디플로이먼트)를 이용하여 클러스터 기능을 구현합니다.

애드온에 대한 네임스페이스 리소스는 kube-system 네임스페이스에 속합니다.

 

DNS

모든 쿠버네티스 클러스터는 클러스터DNS를 갖추어야 한다. 클러스터 DNS는 구성환경 내 다른 DNSS 서버와 더불어,

쿠버네티스 서비스를 위해 DNS 레코드를 제공해주는 DNS 서버이다.

쿠버네티스에 의해 구동되는 컨테이너는 DNS 검색에서 이 DNS 서버를 자동으로 포함한다.

 

컨테이너 리소스 모니터링

컨테이너 리소스 모리터링은 중앙 데이터베이스 내에 컨테이너들에 대한 포관적인 시계열 메트릭스를 기록하고 그 데이터를 열람할 수 있는 UI를 제공해준다.

 

웹 UI

대시보드는 쿠버네티스 클러스터를 위한 범용의 웹 기반  UI이다. 클러스터에서 동작하는 애플리케이션에 대한 관리와 failover를 할 수 있도록 허용해준다.

 

 

반응형
Comments