본문 바로가기

K8S

쿠버네티스(Kubernetes) 아키텍처

728x90

■ 쿠버네티스 아키텍처

  • 쿠버네티스 아키텍처는 클러스터 전반의 서비스 검색 (Service Discovery)을 제공하기 위한 오픈소스 플랫폼

  • 워커 노드(Worker): 애플리케이션의 구성요소인 파드(Pod, 클러스터에서 실행중인 컨테이너의 집합)가 동작 합니다.
  • 컨트롤 플레인(Control-Plane): 워커 노드와 클러스터 내 파드 관리. 클러스터에 관한 전반적인 결정을 수행하고, 이벤트 감지 및 대응을 수행 합니다.
  • 워커노드와 컨트롤 플레인을 클러스터라고 합니다. 

■ 쿠버네티스 컨트롤 플레인 구성요소

  • kube-apiserver: 쿠버네티스 API를 노출하는 컨트롤 플레인 구성요소. REST API로 동작하며 다른 구성요소들과 클러스터의 상태정보를 공유하며 상호작용하는 중앙관리 도구 역할을 수행합니다.
  • etcd: 모든 클러스터 데이터를 담는 쿠버네티스 Backend 저장소이며, 데이터 타입은 Key-Value 방식의 사전 자료형으로 저장합니다. etcd와 통신할 수 있는 요소는 apiserver 뿐이다. 
  • kube-scheduler: 노드가 배정되지 않은 새로운 Pod를 감지하고, 실행할 노드를 선택하는 역할 수행. 스케쥴링 결정을 위해서 고려되는 요소는 리소스에 대한 개별 및 총체적 요구사항, 하드웨어/소프트웨어/정책적 제약, 데이터 지역성, 워크로드 간섭, 데드라인, 어피니티(Affinity) 및 안티-어피니티(Anti-Affinity) 항목을 참조합니다.
  • kube-controller-manager: 클러스터의 상태를 지속적으로 감시하고 필요한 변경을 수행하여 시스템을 원하는 상태로 유지 시키는 역할을 수행합니다. 클러스터의 모든 리소스는 API 객체로 표현되며 매니저는 이러한 API 객체 상태를 감시하여 사전에 정의된 상태를 유지합니다.
  • cloud-controller-manager: 클라우드별 컨트롤 로직을 포함하며, 클라우드 컨트롤러 매니저를 통해 클러스터를 클라우드 공급자의 API에 연결하고, 해당 클라우드 플랫폼과 상호 작용하는 컴포넌트와 클러스터와만 상호 작용하는 컴포넌트를 구분할 수 있습니다.
  • DNS: 쿠버네티스는 리소스의 엔드포인트(Endpoint)를 DNS로 맵핑하고 관리한다. 쿠버네티스에서 생성하는 Pod나 서비스등은 동적으로 생성되는 리소스 이기 때문에 IP를 자동으로 할당하며, 생성된 리소스를 사용하고 관리하기 위해 쿠버네티스에서는 내부 DNS서버를 사용 합니다. 

 
■ 쿠버네티스 노드 구성요소

  • kubelet: 클러스터 노드에서 실행되는 에이전트. kubelet은 Pod에서 컨테이너가 확실하게 동작하도록 관리하는 역할을 수행하며, 쿠버네티스를 통하지 않고 생성된 컨테이너는 관리하지 않습니다.
  • kube-proxy: 노드로 들어오거는 네트워크 트래픽을 적절한 컨테이너로 라우팅하고, 로드밸런싱등 노드로 들어오고 나가는 네트워크 트래픽을 프록시하고, 노드와 마스터간의 네트워크 통신 및 네트워크 규칙을 유지 관리하는 역할을 수행합니다. 
  • 컨테이너 런타임: 컨테이너 실행을 담당하는 소프트웨어 입니다. 쿠버네티스에서 사용가능한 컨테이너 런타임은 "containerd", "CRI-O", "Docker Engine"이 있습니다. 다만 쿠버네티스에서 Dockershim을 제거하였기 때문에 "Docker Engine"을 사용하기 위해서는 별도 설정이 필요 합니다.

 

■ 쿠버네티스 요청 흐름도

  1. 선언형 또는 명령형으로 쿠버네티스 API 서버로 요청 전달.  API 서버는 요청자에 대한 인증, 인가, 승인(컨트롤러 매니저)에 대해 검증 수행.
  2. API 서버 → etcd에 요청한 내용을 Key:Value 형태로 기록. 
  3. API 서버 → Scheduler에 요청하여 명령을 수행할 노드 결정. 수행할 노드를 결정하기 위해 노드에 대한 정보 제공이 필요하며 해당 정보는 etcd에 저장되어 있고 API 서버가 Scheduler에게 노드 정보를 제공함. 
  4. API 서버 →  워커 노드's kubelet에 수행할 명령을 전달함. kubelets은 전달 받은 명령을 수행하기 위해 컨테이너 런타임에 제어 명령 전달. 컨테이너 런타임은 실제 컨테이너 생성을 담당하는 저수준 컨테이너 런타임에게 명령을 전달하고 저수준 컨테이너 런타임은 명령 수행 
  5. kubelet → API 서버에게 명령 수행 과정 및 결과를 전달하고, API 서버는 해당 내용을 etcd에 저장함. 사용자가 수행한 작업에 대한 과정을 조회 할 때 etcd에 저장된 상태 정보 데이터를 사용자에게 전달. 
  6. 컨트롤 플레인과 워커 노드가 통신을 하기 위해 CNI (Container Network Interface)를 통해 네트워크 정보를 교환하며, 이미지에 있는 Calico는 BGP를 이용하여 네트워크 정보를 교환 한다
728x90