[kubernetes] kubernetes 아키텍쳐

728x90

kubrenetes 공식 문서에서 설명하고 있는 아키텍쳐

클러스터는 물리적 혹은 논리적으로 여러개의 리소스를 하나로 묶어서 사용하는 것을 뜻한다.

기본적으로 Docker 는 클러스터라는 기능은 없다. 도커 컨테이너들은 각각 따로 관리된다. 이를 하나로 한꺼번에 관리할 수는 없다.

이런 형태를 stand alone 이라고 부르며, stand alone 형태는 관리하기가 힘들다.

즉, 클러스터는 리소스를 하나로 묶어서 한번에 관리를 하는 것이다.

쿠버네티스 클러스터의 핵심

  • Control Plane
  • Node

Node(구 명칭 worker, Minions)

Control Plane 과 Node 라는 VM 형태로 나눠진다. 즉 역할이 분리되는 것이다.

Node 는 실제 컨테이너를 실행해준다. 즉, Node 안에 도커(podman, CRIO...)가 설치되있어야 한다.

일반적으로 Control Plane 보다 Node 의 갯수가 더 많다.

Control Plane(구 명칭 Master)

Node 를 관리해주는 녀석이다. 그래서 Control Plane 에 장애가 발생하면 Node 를 관리할 수 없다. 그래서 SPoF 를 방지하기 위해 여러 대의 Control Plane 을 띄워둔다. 일반적으로는 3대이상을 Control Plane 으로 띄운다.

Control Plane 을 클러스터링 할 때 절대 짝수개로 두면 안된다.

Control Plane 컴포넌트

kube-apiserver

kube-apiserver 는 쿠버네티스 API를 노출하는 쿠버네티스 컨트롤 플레인 컴포넌트이다.

모든 통신은 kube-apiserver 을 통해 통신이 된다.

쿠버네티스 API 서버의 주요 구현은 kube-apiserver 이다. kube-apiserver는 수평으로 확장되도록 디자인되었다. 즉, 더 많은 인스턴스를 배포해서 확장할 수 있다. 여러 kube-apiserver 인스턴스를 실행하고, 인스턴스간의 트래픽을 균형있게 조절할 수 있다.

kube-controller-manager

쿠버네티스 핵심으로 쿠버네티스 전체를 관리한다.

쿠버네티스는 컨테이너를 관리하지 않는다.

쿠버네티스는 Pod 를 관리하고, Pod 는 컨테이너가 아니다.

컨트롤러는 다음을 포함한다.

  • 노드 컨트롤러: 노드가 다운되었을 때 통지와 대응에 관한 책임을 가진다.
  • 레플리케이션 컨트롤러: 시스템의 모든 레플리케이션 컨트롤러 오브젝트에 대해 알맞은 수의 파드들을 유지시켜 주는 책임을 가진다. (쿠버네티스의 핵심은 컨테이너의 복제이다.)
  • 엔드포인트 컨트롤러: 엔드포인트 오브젝트를 채운다(즉, 서비스==Network(LB) 와 파드를 연결시킨다.)
  • 서비스 어카운트 & 토큰(인증) 컨트롤러: 새로운 네임스페이스에 대한 기본 계정과 API 접근 토큰을 생성한다.

cloud-controller-manager

쿠버네티스가 클라우드에 있을 경우(EKS, AKS, GKE), 클러스터를 클라우드 공급자의 API에 연결하고, 해당 클라우드 플랫폼과 상호 작용하는 컴포넌트와 클러스터와만 상호 작용하는 컴포넌트를 구분할 수 있게 해 준다.

kube-scheduler

노드가 배정되지 않은 새로 생성된 Pod 를 감지하고, 실행할 노드를 선택하는 컨트롤 플레인 컴포넌트이다.

즉, Pod 를 어느 노드에 어떻게 배치할 것인지 설정해준다.

etcd(etc daemon)

모든 클러스터 데이터를 담는 쿠버네티스 뒷단의 key value 스토리지이다.(DB)

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

Node 컴포넌트

kubelet

클러스터의 각 노드에서 실행되는 에이전트이다. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리한다.

kube-apiserver 에 컨테이너를 만들어달라고 요청을 보내면 kubelet 이 파드를 만들고 파드에서 컨테이너가 동작하도록 한다.

kube-proxy

docker proxy 는 네트워크의 정책(iptables 정책)을 관리한다. 예를 들어 포트 포워딩 할 때 이 녀석을 사용한다.

kube-proxy 도 똑같이 네트워크 정책을 담당한다.

쉽게 얘기하자면 kubelet 은 컨테이너를 담당하는 녀석이고, kube-proxy 는 네트워크를 담당하는 녀석이다.

Control Plane 의 컴포넌트들도 모두 컨테이너이기 때문에 해당 컨테이너를 관리하는 kubelet 과 kube-proxy 가 Control Plane 에도 존재한다.

728x90