Skip to main content

쿠버네티스 아키텍처

쿠버네티스 클러스터는 MSA(Micro Service Architecture) 구조에서 컨테이너 배포와 서비스 장애 복구와 같은 컨테이너 기반 서비스 운영에 필요한 대부분의 기능을 지원한다.  쿠버네티스 클러스터는 기본적으로 마스터워커 노드 형태로 구성된다. 마스터 노드는 물론 Control Plane(Orchestra)의 역할, 쉽게 말하면 제어판과 비슷한 역할, 그리고 워커 노드에서는 실제 워크로드가 실행 된다.


마스터 노드

마스터 노드에는 "Kubernetes Control Plane"을 구성하는 다양한 핵심 구성 요소가 있고, 관리적 작업에만 사용된다. 마스터 노드는 전체 클러스터를 관리하며, 워커노드에 예약된 작업을 할당하고 시스템의 상태를 관리한다. 본질적으로 쿠버네티스 클러스터의 뇌라고 생각하면 된다. 쿠버네티스 마스터 노드의 중요한 구성요소는 아래와 같다: 

  1. API Server:- 클러스터 내부 리소스를 제어하는 API를 제공하는 서버를 의미한다. 쿠버네티스의 리소스 정보를 관리하기 위한 프론트엔드 REST API. 각 컴포턴트로 부터 리소스 정보를 받아 데이터스토어(etcd)에 저장하는 역할을 갖고 있다. 다른 컴포넌트는 API Server를 통해 이 etcd 정보에 액세스한다. 개발자 혹은 시스템 관리자가 이 Server에 액세스하려면 kubectl 명령을 사용한다. 또 애플리케이션 안에서 API Server를 호출할 수도 있다.

  2. Scheduler:-  쿠버네티스 리소스에 대한 리소스 요청을 예약하는 역할을 한다. 스케줄러는 노드에 할당되어 있지 않은 Pod에 대해 쿠버네티스 클러스터의 상태를 확인하고 빈 공간을 갖고 있는 노드를 찾아 Pod를 실행 시킨다. 클러스터를 구성하는 워커 노드의 상태를 검토하여 리소스 할당이 필요한 리소스 요청을 처리할 최적의 노드를 선택 한다.

  3. Controller-manager:-  쿠버네티스 클러스터의 컴포넌트들의 상태를 모니터링 하고 본래 되어야 할 상태를 유지하는 백엔드 컴포넌트. 정의 파일에서 정의한 것과 실제 노드나 컨테이너에서 작동하고 있는 상태를 모아서 관리 한다.

  4.  etcd(데이터스토어):- 쿠버네티스 클러스터의 구성 데이터를 저장하기 위해 사용되는 분산 키-값 저장소다. 노드 상태 및 서비스 상태와 같은 쿠버네티스 클러스터의 상태를 저장하는 데 사용된다. Key-Value형으로 관리하며 어떤 Pod를 어떻게 배치할지와 같은 정보를 갖고 있어서 API Server가 이를 참조한다. 이 데이터스토어는 마스터 서버에서 분리 시킬 수도 있다.

워커 노드

이전에는 '미니언' 이라고 불렸으며, 워커 노드는 쿠버네티스 클러스터의 애플리케이션 및 워크로드를 실행한다. 컨테이너를 실행하고 컨테이너 런타임 환경을 처리하는 역할을 한다. 워커 노드의 핵심 구성 요소는 아래와 같다:

  1. Kubelet:- 쿠버네티스의 주요 구성 요소로, 워커 노드에서 API 서버와 통신하여 쿠버네티스 클러스터에 노드를 등록한다. 파드의 라이프 사이클을 관리하고 노드 및 파드의 상태를 모니터링한다.

  2. Kube-proxy:- 모든 워커 노드에서 실행되며 각 노드에 대한 네트워크 규칙을 생성 및 관리하는 네트워크 프록시 역할을 한다. K8s 프라이빗 네트워크 내에서 적절한 서비스 또는 응용 프로그램으로 요청을 전달하는 reverse 프록시와 같은 역할을 수행 한다.

  3. Container runtime:- 모든 워커 노드에서 실행되며 컨테이너를 실행하고 관리하는 역할을 한다 (예: Docker).

    5yen6r9v6opaq3cxldof.jpg


쿠버네티스 오브젝트

쿠버네티스 클러스터 안에는 모든 리소스들을 오브젝트 형태로 관리한다. 컨테이너의 집합 (Pod), 컨테이너 집합을 관리하는 컨트롤러 (ReplicaSet), 사용자 (Service Account) 등등 을 모두 하나의 오브젝트로 사용 할 수 있다. 이 오브젝트들은 YAML 파일을 이용해서 생성 할 수 있다. 이 YAML 파일들을 Manifest(매니페스트) 파일이라고 부른다. 이 파일은 일련의 설정 정보를 포함하고 있으며, 쿠버네티스 클러스터에게 어떤 리소스를 생성하고 구성해야 하는지를 지시한다. 매니페스트 파일의 예시:

# Nginx 컨테이너로 구성된 파드를 직접 생성하는 yaml 파일 예시
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP

쿠버네티스 매니페스트 YAML파일은 일반적으로 apiVersion, kind, metadata, spec 네 가지 항목으로 구성 된다.

  • apiVersion yaml 파일에서 정의한 오브젝트의 API 버전
  • kind 리소스의 종류(kubectl api-resources 명령어의 KIND 항목에서 확인 가능)
  • metadata 리소스의 부가 정보(label, annotation, name 등)
  • spec 리소스를 생성하기 위한 자세한 정보(파드에서 실행될 컨테이너 정보, 도커 이미지 정보, 포트 정보 등)

kubectl apply -f <yaml 파일 이름> 명령어를 통해 쿠버네티스에 파드를 생성할 수 있다.

kubectl은 이러한 매니페스트 파일을 사용하여 쿠버네티스 클러스터를 관리하기 위한 커맨드 라인 도구이다. 개발자나 시스템 관리자는 kubectl을 활용하여 매니페스트 파일을 통해 Kubernetes 클러스터 내의 리소스를 생성, 조회, 수정, 삭제할 수 있다.

kubectl은 다양한 기능과 옵션을 제공한다. 일반적으로 다음과 같은 작업을 수행할 수 있다:

  • 클러스터와의 연결: kubectl을 사용하여 Kubernetes 클러스터와 통신하고, 사용자 인증 및 인가를 설정한다.

  • 리소스 관리: kubectl을 통해 파드, 서비스, 디플로이먼트 등의 리소스를 생성, 조회, 수정, 삭제할 수 있습니다. 또한, 클러스터 내의 다양한 리소스들의 상태를 확인할 수 있다.

  • 로그 및 이벤트 확인: kubectl을 사용하여 파드의 로그를 확인하거나 클러스터의 이벤트를 조회할 수 있다. 이를 통해 애플리케이션의 동작 상태를 추적하고 디버깅할 수 있다.

  • 스케일링 및 롤링 업데이트: kubectl을 사용하여 애플리케이션을 스케일 업/다운하거나, 롤링 업데이트를 수행할 수 있다. 이를 통해 애플리케이션의 확장성과 가용성을 관리할 수 있다.

Pod(파드)

쿠버네티스에서는 애플리케이션을 배포할 수 있는 최소 단위인 파드(Pod)라는 개념을 제공한다. 파드는 하나 이상의 컨테이너를 포함할 수 있으며, 같은 파드 안에 있는 컨테이너는 동일한 호스트에서 실행된다.

image.png

위에서 본 예시 Yaml파일을 적용 해보면:

kubectl apply -f example-pod.yaml
pod/example-pod.yaml created

이렇게 Nginx 파드가 생성 되었다. 확인 결과:

kubectl get pods
NAME		 READY	STATUS	 RESTARTS	AGE
example-pod  1/1	Running	 0			40s

이 Nginx 파드는 사용할 포트를 80으로 지정 했지만, 아직 외부에서 접근 할 수 있도록 노출 되지는 않았다.