네모네모새

Kubernetes 구조 본문

Kubernetes

Kubernetes 구조

네모새 2022. 3. 29. 21:30

Kubernetes 구조

쿠버네티스는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리해주는 시스템입니다.

클러스터

쿠버네티스 환경에서 가장 큰 구조는 클러스터입니다.

쿠버네티스 백서에서는 클러스터를 아래와 같이 정의하고 있습니다.

클러스터란 컨테이너화된 애플리케이션을 실행하는 노드라고 하는 워커 머신의 집합. 모든 클러스터는 최소 한 개의 워커 노드를 가진다.

쿠버네티스는 Master Node(Control Plane)와 Worker Node로 이루어져 있으며, 각 노드 내부의 다양한 컴포넌트를 통해 동작합니다.

쿠버네티스의 아키텍쳐는 위의 구성도를 참고해주세요.

쿠버네티스 클러스터는 API 서버, etcd, 스케쥴러, 컨트롤러 등의 컴포넌트가 설치된 마스터 노드와, kubelet과 kube-proxy, 컨테이너 런타임이 설치된 워커노드로 구성됩니다.

거기에 추가적으로 마스터 노드의 API 서버와 통신하며 클러스터에 명령을 내릴 서버가 구성되어야 하는데, 마스터 노드 내부에 구성할 수도 있고 로컬 PC에 구성할 수도 있습니다.

호스트 컴퓨터(로컬 PC)

쿠버네티스 관리자는 kubectl을 이용해서 쿠버네티스 클러스터에 명령을 내릴 수 있습니다.
kubectl은 KUBECONFIG 환경변수를 참조해 명령을 내릴 클러스터의 정보를 인식합니다.
KUBEONFIG 환경변수가 정의되어 있지 않다면 $HOME/.kube/config 파일을 참고합니다.

마스터노드는 단일로 구성할 수 있지만 백업을 위해 여러대의 서버를 마스터노드로 구성할 수 있으며, 다중 구성 시 항상 홀수개로 구성되어야 합니다.

마스터노드

마스터노드의 핵심 컴포넌트는 API Server, etcd, Scheduler, Controller로 구성되어 있습니다.
구성도상에 있는 Cloud Controller는 AWS, Azure, GCP와 같은 Public Cloud의 서버, 스토리지, 로드밸런서 등의 자원을 쿠버네티스가 사용할 수 있도록 돕습니다.

쿠버네티스는 선언적인(declarative) 구조를 가지고 있습니다.
각 요소가 추구하는 상태(desired status)를 선언하면 현재 상태(current status)와 비교하여 맞는지 점검하고, 추구하는 상태에 맞추려고 노력하는 방식으로 설계되어 있습니다.

이렇게 API 서버를 통해 선언한 추구하는 상태값들을 저장하는 장소가 etcd입니다.

API Server

  • 쿠버네티스 클러스터의 중심 역할을 하는 통로
  • k8s api를 사용하도록 요청을 받고 요청이 유효한지 검사
  • kubectl이 설치된 로컬 머신에서 kubectl 명령어 수행시 문법, 권한 검사
  • API와 etcd는 거의 한 몸으로 움직이게 설계됨

etcd

  • key-value 타입 저장소
  • 구성 요소들의 상태 값이 모두 저장되는 곳
  • etcd 외에 다른 구성 요소들은 상태값을 관리하지 않으므로 etcd를 잘 백업해두면 장애가 발생해도 etcd를 통해 쿠버네티스 클러스터 복구 가능
  • 분산 저장이 가능함, 복제해 여러 곳에 두면 하나의 etcd가 장애가 나도 시스템 가용성 확보

Scheduler

  • Pod를 실행할 노드 선택

Controller

  • Pod를 관찰하여 선언한 개수를 보장

Addon Component

  • Core DNS
  • CNI
  • Dashboard
  • ELK, EFK, Datadog 등 로깅 컴포넌트

워커노드

워커노드는 실제 컨테이너들이 배포되는 서버들입니다.
관리자는 Pod를 배포할 때 어떤 워커노드에 Pod를 배포할지 선택할 수도 있지만,
일반적으로는 스케쥴러에 의해 배포 대상 워커노드가 선택됩니다.

워커노드의 핵심 컴포넌트들은 kubelet, kube-proxy, 컨테이너 런타임이 있습니다.

kubelet

  • 모든 노드에서 실행되는 k8s 에이전트
  • 데몬 형태로 동작
  • c-Advisor 모니터링 툴이 들어있음
  • 워커노드에서 동작중인 kubelet이 정지되면 컨테이너 런타임에 요청을 보내는 역할을 수행해주는 컴포넌트가 정지되었으므로 pod 생성, 삭제 등이 해당 노드에서 정상적으로 수행되지 않음

kube-proxy

  • k8s의 network 동작을 관리
  • iptables rule을 구성
  • kube-proxy 서비스가 중단된 경우 네트워킹이 제대로 이루어지지 않음
  • Cluster IP를 통해 WEB 등 서비스 요청시 오류 발생

컨테이너 런타임

  • 컨테이너를 실행하는 엔진
  • docker, containerd, runc 등
Comments