Web/Kubernetes

쿠버네티스 아키텍처 (구성/설계)

tose33 2024. 1. 5. 12:42

출처

https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%9E%85%EB%AC%B8

 

초보를 위한 쿠버네티스 안내서 강의 - 인프런

쿠버네티스를 1도 모르는 입문자, 초보자를 위한 쿠버네티스 안내서 입니다. 초보자도 이해하기 쉬운 내용과 흐름으로 구성했어요., 데브옵스(DevOps) 입문자라면 주목! 쿠버네티스의 첫발을 함

www.inflearn.com

 

 

원하는 상태

 

  • 쿠버네티스는 모든걸 원하는 상태로 관리한다
  • 개발자가 원하는 상태를 정의하고, 쿠버네티스는 상태체크,차이점발견,조치의 과정을 반복하면서 계속해서 원하는 상태로 만든다

 

쿠버네티스 구조

 

  • 쿠버네티스는 마스터와 노드로 구성되어 있다
  • 모든 명령은 마스터의 api 서버를 호출하고 노드는 마스터와 통신하면서 필요한 작업을 수행한다
  • 즉 사용자는 노드에 직접 명령하지 않고 마스터에게 원하는 상태를 알려주면 마스터가 원하는 상태가 되는데 필요한 작업들을 수행한다 

마스터

etcd

  • 모든 상태와 데이터를 저장한다
  • 분산 시스템으로 안전성 높임 (고가용성)
  • key-val 형태로 데이터 저장
  • 현재 상태, 원하는 상태 등 중요한 데이터가 저장되기 때문에 백업 필수 

 

API 서버

  • 상태를 바꾸거나 조회
  • etcd 와 유일하게 통신하는 모듈 
    • 다른 모듈들이 etcd와 소통해야 하면 직접 소통하지 않고, API 서버와 소통하고 API 서버가 etcd와 소통한다 
  • 인터페이스는 REST API 형태로 제공 
  • 권한 체크해 권한 없을 경우 요청 차단 
  • 수평 확장 가능 하도록 디자인됨 

 

Scheduler

  • 새로 생성된 Pod을 감지하고 Pod에 요청이 오면 어떤 노드에 실행할지 결정
  • 노드에 라벨을 붙이고 특정 라벨이 붙은 노드에 배포,요청을 할수 있다 

 

Controller

  • 끊임 없이 상태 체크하고 원하는 상태 유지 
  • 논리적으로 다양한 컨트롤러가 존재  
  • 단일 프로세스로 실행

 

조회 흐름

컨트롤러는 상태를 체크하고 원하는 상태를 유지한다.

컨트롤러가 원하는 상태를 유지하기 위해 API 서버, etcd 와 어떻게 소통하는지 흐름을 알아보자 

 

  1. Controller는 etcd와 직접 소통하지 않고 API 서버에게 요청한다
  2. API 서버는 컨트롤러의 권한을 확인한다
  3. 권한이 있다면 etcd에서 정보를 조회한다 
  4. etcd는 원하는 상태가 변경되었다면 API 서버에게 알려주고, API 서버는 controller 에게 알린다
  5. 컨트롤러는 현재 상태와 원하는 상태가 바뀌었다면 조치를 취하기 위해 API 서버에게 요청한다 (리소스 변경) 
  6. API 서버는 컨트롤러가 리소스 변경 권한이 있는지 확인하고, 권한 있다면 etcd의 리소스 변경한다 

 


노드

Kubelet

  • Pod을 실행 중지하고 상태를 체크 
  • CRI (Container Runtime Interface, 대표적으로 도커) 를 Pod로 감싸서 사용
  • 각 노드에서 실행 

Proxy

  • 네트워크 프록시(중간에서 요청 응답 전달)와 부하 분산 역할 
  • 성능상의 이슈로 프록시가 따로 존재하는것 아닌 iptable 또는 IPVS 사용해서 설정만 관리 

 


Pod 생성 흐름 

 

  1. Pod 추가 요청이 API 서버에 도달한다
  2. API 서버는 etcd에 Pod-생성요청 을 기록한다 
  3. 컨트롤러는 계속해서 상태를 체크하고 원하는 상태를 유지하는 역할을 하는데, 이때 Pod-생성요청 즉 원하는 상태의 변경을 감지한다
  4. 원하는 상태의 변경을 감지한 컨트롤러는 API 서버에 Pod-할당 요청을 보낸다
  5. API 서버는 etcd에 Pod-할당요청을 기록한다 
  6. 스케줄러는 Pod-할당요청을 감지하고, 적절한 노드에 Pod를 할당한다 
  7. API 서버는 Pod-노드할당/미실행 을 etcd 에 기록한다 
  8. Kubelete는 자신이 관리하는 노드의 Pod 중 미실행인 Pod을 확인하고 실행한다 
  9. API 서버는 Pod-노드할당/실행중 을 etcd에 기록한다 

 

보면 각 컴포넌트들은 무조건 API 서버에게 보고하는 형태이고, API 서버는 각 컴포넌트 들을 대신해서 etcd 에 상태를 기록한다.

etcd의 상태변화를 보면 다음과 같다.

 

  1. Pod-생성요청 
  2. Pod-할당요청
  3. Pod-노드할당/미실행
  4. Pod-실행중 

 

쿠버네티스의 각 컴포넌트들은 계속해서 자기 임무를 각자 수행한다.

 

예를들어 컨트롤러는 계속해서 원하는 상태의 변경을 감지하고 있다가 원하는 상태의 변경을 감지하면 API 서버에게 원하는 상태를 달성하기 위해 필요한 요청을 한다.