[Kubernetes] # 쿠버네티스 주요 컴포넌트

empty·2021년 1월 14일
1

Kubernetes

목록 보기
3/7

쿠버네티스는 근본적으로 클러스터를 관리하기 때문에 여러가지의 컴포넌트를 관리하게 된다. 컴포넌트는 크게 아래의 3가지로 구분하게 된다.

  1. Master용 컴포넌트
  2. Node용 컴포넌트
  3. Addon용 컴포넌트

Master Node


마스터용 컴포넌트는 쿠버네티스 클러스터 전체를 관리하게 된다. 구성요소로는

  • etcd
  • kube-apiserver
  • kube-scheduler
  • kube-controller-manager
  • cloud-controller-manager

등이 마스터용 컴포넌트의 요소이다.

1️⃣ etcd

쿠버네티스의 DB 역할

etcd는 CoreOS에서 개발한 고가용성을 제공하는 Key-Value 저장소이다. 분산 시스템에서 서로의 상태를 공유 및 확인하여 HA클러스터링을 제공하는 Raft알고리즘을 구현하였다.

etcd는 서버 하나당 프로세스 1개만 사용할 수 있다. 보통 etcd 자체를 클러스터링 한 후 여러 개 마스터 서버에 분산해서 실행하여 데이터의 안정성을 보장하도록 구성한다.

프로덕션 환경의 쿠버네티스에서 데이터의 안정성을 위해서는 etcd의 데이터를 백업하는 것은 필수!!이다.

2️⃣ kube-apiserver

쿠버네티스 모든 컴포넌트들의 API 통신역할

kube-apiserver는 쿠버네티스 클러스터의 API를 사용할 수 있도록 하는 컴포넌트이다.

쿠버네티스는 MSA(MicroService Architecture : 마이크로서비스 아키텍쳐) 이므로 서로 분리된 여러 컴포넌트들이 존재하는데 쿠버네티스에서 보내는 모든 요청은 kube-apiserver를 이용해서 다른 컴포넌트로 전달하게된다.

또한 수평적으로 확장할 수 있도록 설계되어서 서버 여러대에 여러개의 kube-apiserver를 실행해 사용할 수 있다.

3️⃣ kube-scheduler

쿠버네티스에서 Pod를 알맞은 노드에 스케줄링하는 역할

kube-scheduler는 현재 클러스터 안에서 자원 할당이 가능한 노드 중 알맞은 노드를 선택하여 새롭게 만든 파드를 실행한다. 파드를 실행할 대표적인 조건으로는 Affinity, Anti-Affinity 등이 있는데 이러한 조건들에 맞추어 알맞은 노드에 배치해주는게 kube-schedluer이다.

4️⃣ kube-controller-manager

쿠버네티스에서 컨트롤러를 관리하는 컴포넌트

쿠버네티스에서는 파드들을 관리하는 컨트롤러가 존재한다. 이 컨트롤러 각각은 논리적으로 개별 프로세스이지만 복잡도를 줄이려고 모든 컨트롤러를 바이너리 파일 하나로 컴파일하여 단일 프로세스로 실행된다.

kube-controller-manager는 이러한 컨트롤러를 실행하는 컴포넌트이다. 컨트롤러는 kube-controller-manager의 큐에 구조체형태로 동작하게 된다.

5️⃣ cloud-controller-manager

Managed Kubernetes의 프로바이더와 연동되는 서비스들을 관리한다.

cloud-controller-manager는 쿠버네티스의 컨트롤러들을 클라우드 서비스와 연결하여 관리하는 컴포넌트이다. 보통 아래의 네 가지 컨트롤러 컴포넌트를 관리한다.

  • Node Controller

    : 클라우드 서비스 안에서 노드를 관리하는 데 사용한다.

  • Route Controller

    : 클라우드 서비스 안에서 네트워크 라우팅을 관리하는 데 사용한다.

  • Service Controller

    : 클라우드 서비스에서 제공하는 로드밸런서를 생성, 갱신, 삭제하는 데 사용한다.

  • Volume Controller

    : 클라우드 서비스에서 생성한 볼륨을 노드에 연결하거나 마운트하는 등에 사용한다.

Worker Node


노드용 컴포넌트는 쿠버네티스 실행환경을 관리한다. 구성요소로는

  • kubelet
  • kube-proxy
  • Container-Runtime

등이 노드용 컴포넌트의 구성요소이다.

1️⃣ kubelet

노드안의 컨테이너를 실행하고 관리한다.

kubelet은 클러스터 안 모든 노드에서 실행되는 에이전트이다. 파드 컨테이너들의 실행을 직접 관리하고 PodSpec 이라는 조건이 담긴 설정을 전달받아 컨테이너를 실행하고 Health Check를 진행한다.

*단, 쿠버네티스가 만들지 않은 컨테이너는 관리하지 않는다.

2️⃣ kube-proxy

쿠버네티스 클러스터의 가상 네트워크를 관리

kube-proxy는 클러스터 안에 별도의 가상 네트워크를 설정하고 관리한다. 호스트의 네트워크 규칙을 관리하거나 연결을 전달할 수도 있음.

3️⃣ Container Runtime

실제로 컨테이너를 실행시키는 컴포넌트이다. Docker, containerd, runc 같은 런타임을 지원한다. OCI(Open Container Initiative)의 런타임 규격을 구현한 런타임이라면 쿠버네티스에서 사용할 수 있다.

Add-on


애드온은 클러스터 안에서 필요한 기능을 실행하는 파드이다. 대표적인 애드온으로는 아래와 같다.

  • 네트워킹 애드온
  • DNS 애드온
  • 대시보드 애드온
  • 컨테이너 자원 모니터링
  • 클러스터 로깅

애드온으로 사용하는 파드들은 보통 Deployment나 Replication Controller 등으로 관리한다.

1️⃣ 네트워킹 애드온

쿠버네티스 클러스터 안에 가상 네트워크를 구성해 사용할 때 kube-proxy 이외에 네트워킹 애드온(=네트워크 플러그인)을 사용하게 된다.

클라우드 벤더사의 Managed Kubernetes 서비스를 사용하게 되면 별도의 네트워킹 애드온을 제공해주기 때문에 신경쓰지 않아도 되지만 직접 클러스터를 구성하는 경우에는 각 애드온의 특징이 다르기 때문에 적절한 애드온을 설치해줘야 한다.

대표적인 애드온으로는 flannel, calico, cilium 등이 있다.

2️⃣ DNS 애드온

클러스터 안에서 동작하는 DNS서버이다. 쿠버네티스 안에 실행된 컨테이너들은 자동으로 DNS 서버에 등록이 된다.

기존에는 kube-dns를 사용하였지만 버그가 많아 CoreDNS 라는 DNS 애드온을 사용하기 시작하였고 Version 1.13부터는 CoreDNS가 기본 DNS애드온이 되었다.

3️⃣ 대시보드 애드온

쿠버네티스 클러스터의 상태를 웹 UI로 제공해주는 애드온이다. 클러스터 현황이나 파드의 상태를 한눈에 쉽게 파악할 수 있다.

4️⃣ 컨테이너 자원 모니터링

클러스터 안에서 실행 중인 컨테이너의 상태를 모니터링하는 애드온이다. CPU 및 메모리 사용량 같은 데이터들을 시계열 형식으로 저장해서 볼 수 있다.

각 노드의 kubelet안에 포함되어 있는 cAdvisor라는 모니터링 도구를 사용하여 손쉽게 모니터링 하게 된다.

5️⃣ 클러스터 로깅

컨테이너의 로그들과 쿠버네티스 구성 요소의 로그들을 중앙 로그 수집 시스템에 모아서 보는 애드온이다.

네트워킹 애드온과 마찬가지로 직접 클러스터를 구성할 경우 애드온 사용을 고려해야 한다. 대표적으로 EFK, ELK를 많이 사용한다.

0개의 댓글