02.쿠버네티스 기본 개념

리얼브로·2023년 4월 4일
0

쿠버네티스

목록 보기
3/3

2.1 쿠버네티스 아키텍처

2.1.1 쿠버네티스 구조

쿠버네티스는 쿠버네티스 클러스터, 마스터 노드, 워커 노드 , 컨테이너 런타임, 영구 스토리지 등으로 구성되어

있으며, 각 구성 요소의 역할은 다음과 같다.

  • 쿠버네티스 클러스터

    쿠버네티스의 여러 리소스를 관리하기 위한 집합체 이다.

    마스터 노드와 워커 노드를 이용해 하나의 쿠버네티스 클러스터를 구성할 수 있다.

  • 마스터 노드

    쿠버네티스 클러스터 전체를 관리하는 시스템으로, 컨트롤 플레인(control plane) 이라고도 한다.

  • 워커 노드

    마스터 노드에 의해 명령을 받아 파드를 생성하고 서비스한다고 해서 컴퓨팅 머신(computing machine)

    이라고도 한다.

  • 컨테이너 런타임

    컨테이너 런타임은 파드를 실행하는 엔진이다. 대표적으로 도커가 있으며, 그 밖에도 컨테이너디, 크라이오

    등이 런타임 엔진으로 많이 사용되고 있다.

  • 영구 스토리지

    파드는 기본적으로 휘발성이다. 워커 노드에 떠 있는 파드가 삭제되면 파드 안의 모든 데이터도 즉시 삭제된다.

    따라서 데이터베이스 같은 중요한 데이터는 파드 외부에 있는 영구 스토리지(워커 노드의 D 드라이브나 데이터

    저장 용도의 전용 스토리지 등)에 저장해 두어야 한다. 그리고 CSI(Container Storage Interface)로 외부 스

    토리지를 파드에 연결할 수 있다.

또한 쿠버네티스는 퍼블릭 클라우드, 가상화 서버(가상화 툴을 이용해 쿠버네티스 설치) 및 데스크톱에 직접 설치할 수

있다.

2.1.2 쿠버네티스 컴포넌트

컨트롤 플레인 이라고 하는 마스터 노드에는 클러스터를 유지하고 제어하기 위한 다양한 컴포넌트가 있다.

워커 노드에는 애플리케이션을 실행하기 위한 컴포넌트들이 있다.

파드를 배포할 때 사용하는 kubectl create -f deployment.yaml 명령어를 이용해서 각각의 컴포넌트를 알아보자.

yaml 파일이란?

쿠버네티스는 새로운 파드를 배포할 때 yaml 파일을 작성해 실행하고 관리한다.

쿠버네티스에서는 이러한 yaml 파일들을 매니페스트(manifest)라고 한다. 즉, 쿠버네티스 오브젝트를

생성하는 데 필요한 메타 정보(스펙)를 yaml(혹은 JSON 형식도 가능) 파일로 만들어 관리한다.

API서버(application programming interface)

API 서버(kube-apiserver)는 쿠버네티스 클러스터의 API를 사용할 수 있게 해주는 프로세스로, 클러스터로

요청이 들어왔을 때 그 요청이 유효한지 검증한다.

  1. 가장 먼저 사용자를 인증하낟. 클러스터에 접속할 권한이 있는 사용자인지를 검증한다.

  2. 사용자가 보낸 명령어(kubectl create -f deployment.yaml)를 검증한다. 명령어가 문법에 맞게 작성되었는지

    철자가 맞는지 등을 검증한다.

  3. 사용자의 요청에 따라 파드를 생성한다. 이때 중요한 것은 API 서버가 워커 노드에 파드를 생성하도록 요청했지만

    아직 생성은 안 되었다는 점이다.

etcd

API 서버는 파드를 만든다는 사실을 etcd에 알리고 사용자에게 파드가 생성되었음을 알린다. 이처럼 etcd는 클러스터의

상태를 저장한다. 클러스터에 필요한 정보, 파드와 같은 리소스들의 상태 정보가 담겨 있는 곳이 etcd 다.

키-값(key-value) 형태로 저장된다. 사용자에게 파드가 생성되었음을 알렸지만, 내부적으로는 여전히 파드가 생성되지

않았다.

스케줄러

스케줄러(kube-scheduler)는 파드를 위치시킬 적당한 워커 노드를 확인하고 API 서버에 이 사실을 알린다.

이후 API 서버는 etcd에 해당 정보(어떤 워커 노드에 파드가 생성될지에 대한 정보)를 저장한다.

이처럼 스케줄러는 파드를 어떤 노드에 할당해야 할지를 결정하는데, 워커 노드의 리소스 사용량(CPU나 메모리 등의 사용량)

을 참조해 결정한다.

kubelet

API 서버는 파드가 생성될 워커 노드에 있는 kubelet에 파드의 생성 정보를 전달한다.

이후 kubelet은 해당 정보를 이용해 파드를 생성한다. 이제서야 비로소 파드가 생성된 것이다.

kubelet은 클러스터의 각 노드에서 실행되는 에이전트로, 파드에서 컨테이너의 동작(생성 및 운영)을 관리한다.

파드를 생성했다면 kubelet은 다시 API 서버에 생성된 파드의 정보를 전달하고 API 서버는 다시 etcd를 업데이트한다.

최종적으로 어떤 워커 노드에 어떤 파드가 생성되었는지 etcd에 저장하게 되는 것이다.

컨트롤러 매니저

컨트롤러 매니저에는 kube-controller-manager와 cloud-controller-manager 두 가지 유형이 있다.

kube-controller-manager는 다양한 컴포넌트의 상태를 지속적으로 모니터링하는 동시에 실행 상태를 유지하는 역할을

한다. 예를 들어 컨트롤러 매니저가 특정 워커 노드와 통신이 불가능하다고 판단되면 해당 노드에 할당된 파드를 제거하고

다른 워커 노드에서 파드를 생성해 서비스가 계속 되도록 한다.

cloud-controller-manager 는 EKS, AKS 같은 퍼블릭 클라우드에서 제공하는 쿠버네티스와 연동되는 서비스들을 관리한다.

프록시

프록시(kube-proxy)는 클러스터의 모든 노드에서 실행되는 네트워크의 프록시다.

프록시는 노드에 대한 네트워크의 규칙을 관리하기 때문에 클러스터 내부와 외부에 대한 통신을 담당한다.

컨테이너 런타임

컨테이너 런타임은 컨테이너 실행을 담당한다. 다양한 종류의 런타임을 지원하는데, 많이 사용하는 도커(쿠버네티스 1.20 버전

부터 도커는 지원중단)부터 컨테이너디, 크라이오 등이 있다.

0개의 댓글