쉽게 배우는 쿠버네티스 - 02

K8s Master

전체 클러스터의 관리를 책임지는 컨트롤 플레인으로, 모든 노드와 파드의 상태를 모니터링하고 제어한다. 클러스터에 대한 모든 API 요청을 처리하며, 클러스터의 상태를 일관되게 유지하도록 한다.

  • API Server

    쿠버네티스 클러스터와의 모든 통신을 담당하는 엔드포인트이다. 사용자가 kubectl 명령어를 통해 클러스터에 요청을 보내면, API Server가 이를 처리하여 etcd에 반영하거나, 다른 컨트롤러와 통신하여 작업을 수행하게 한다. 클러스터의 모든 리소스(파드, 서비스, 설정 등)에 대한 CRUD(Create, Read, Update, Delete) 작업을 처리한다.

  • etcd

    분산 키-값 저장소로, 쿠버네티스 클러스터의 모든 상태 정보(파드, 서비스, 컨피그맵 등)를 저장하고 관리한다. 쿠버네티스의 백업 및 복구 시 중요한 역할을 하며, 클러스터의 상태를 지속적으로 동기화하여 여러 마스터 노드 간의 일관성을 유지한다. 고가용성을 보장하기 위해 여러 노드에 걸쳐 복제될 수 있다.

  • Scheduler

    각 파드의 배포 위치(노드)를 결정한다. 스케줄러는 파드의 요구사항(리소스, 노드 선택 기준 등)과 각 노드의 상태(가용 리소스, 부하 등)를 고려하여 최적의 노드를 선택해 파드를 할당한다. 만약 특정 노드에 할당할 수 없는 경우, 다른 노드로 배포하여 클러스터의 효율성을 극대화한다.

  • ControllerManager

    여러 컨트롤러들을 하나로 묶어 관리하는 역할을 한다. 컨트롤러들은 클러스터 상태를 지속적으로 모니터링하고, 사용자가 정의한 상태(desired state)와 실제 상태(actual state) 간의 차이를 감지하여, 이를 일치시키기 위한 작업을 수행한다. 주요 컨트롤러로는 노드 컨트롤러, 레플리케이션 컨트롤러, 엔드포인트 컨트롤러 등이 있다.

컨트롤러 종류

  • 노드 컨트롤러

    클러스터의 모든 노드를 감시하며, 노드가 정상적으로 작동하고 있는지 확인한다. 노드가 장애를 일으키거나 응답하지 않을 때 이를 감지하고, 해당 노드에서 실행 중이던 파드를 다른 노드로 이동시키거나 재시작한다. 이를 통해 클러스터의 가용성과 신뢰성을 높인다.

  • 엔드포인트 컨트롤러

    서비스와 파드를 연결하는 역할을 한다. 서비스가 요청을 받으면, 해당 서비스가 참조하는 파드의 IP 주소 목록을 관리하고, 클러스터 내에서 올바른 파드로 트래픽을 전달하도록 한다. 파드가 추가되거나 삭제될 때마다 엔드포인트 정보를 갱신한다.

  • 레플리케이션 컨트롤러

    클러스터 내에서 특정 수의 파드가 항상 실행 중임을 보장한다. 예를 들어, 사용자가 3개의 파드를 원한다고 정의하면, 실제 실행 중인 파드 수가 3개가 되도록 관리한다. 만약 파드가 삭제되거나 장애가 발생하면 새로운 파드를 생성하여 원하는 수를 유지한다. 레플리카셋이나 디플로이먼트와 함께 사용된다.

쿠버네티스 워커

워커 노드는 클러스터에서 애플리케이션 파드를 실제로 실행하는 노드이다. 각 워커 노드는 여러 파드를 실행할 수 있으며, 마스터 노드로부터 명령을 받아 파드를 관리한다.

  • kubelet

    각 노드에서 실행되며, 노드 내에서 파드와 컨테이너의 상태를 관리한다. API Server로부터 받은 파드 스펙(spec)을 기반으로 컨테이너를 생성하고, 컨테이너가 정상적으로 실행되고 있는지 모니터링한다. 또한, 노드의 상태를 API Server에 보고한다.

  • kube-proxy

    쿠버네티스 서비스 네트워킹을 관리하는 컴포넌트이다. 각 노드에서 실행되며, 클러스터 내 모든 파드 간 통신이 가능하도록 네트워크 규칙을 설정하고 유지한다. iptables 또는 ipvs를 사용하여 로드밸런싱 및 네트워크 프록시 역할을 수행한다. 이를 통해 클러스터 내 서비스 간의 통신이 원활하게 이루어진다.

  • 파드

    쿠버네티스에서 배포 가능한 최소 단위이다. 일반적으로 하나의 파드는 하나의 컨테이너를 포함하지만, 상호 의존적인 여러 컨테이너를 하나의 파드로 묶어 배포할 수도 있다. 파드 내의 컨테이너들은 동일한 네트워크 네임스페이스를 공유하여 localhost로 서로 통신할 수 있다. 파드는 일시적인 존재로, 삭제되거나 장애가 발생하면 새로운 파드가 생성될 수 있다.

컨테이너 레지스트리

컨테이너 이미지를 저장하고 배포할 수 있는 중앙 저장소이다. 개발자는 로컬에서 빌드한 컨테이너 이미지를 레지스트리에 푸시(push)하고, 이를 클러스터에서 사용할 수 있다. 쿠버네티스 클러스터에서는 레지스트리로부터 이미지를 풀(pull)하여 파드를 생성한다. 주요 컨테이너 레지스트리로는 다음과 같은 것들이 있다.

  • Docker Hub

    가장 널리 사용되는 퍼블릭 컨테이너 레지스트리이다. 누구나 이미지를 업로드하고 다운로드할 수 있으며, 퍼블릭 또는 프라이빗 저장소를 제공한다.

  • Google Container Registry (GCR)

    Google Cloud Platform(GCP)에서 제공하는 컨테이너 레지스트리로, GCP 프로젝트와 통합되어 쉽게 컨테이너 이미지를 관리하고 배포할 수 있다.

  • Amazon Elastic Container Registry (ECR)

    AWS에서 제공하는 컨테이너 레지스트리로, IAM 권한 관리와 통합되어 보안성을 높이고, AWS 서비스와의 통합을 통해 손쉽게 이미지를 배포할 수 있다.

Reference

https://www.redhat.com/ko/topics/containers/what-is-kubernetes

https://cloud.google.com/kubernetes-engine?hl=ko

<https://www.openmaru.io/구글과-쿠버네티스/>



© 2022. by taewoo

Powered by taewoo