Kubernetes

[Kubernetes] 쿠버네티스 구성 & Pod 과정

운덩하는 개발자 2023. 12. 7.
반응형

 

Kubernetes란?
컨테이너 오케스트레이션 도구로, 여러 컨테이너들의 생성과 생명주기를 관리하는 운영 프로그램이다.

 

쿠버네티스 컴포넌트

https://kubernetes.io/ko/docs/concepts/overview/components/



컨트롤 플레인(Control Plane)


 쿠버네티스 클러스터의 중앙 제어 및 관리를 담당하는 구성 요소들의 집합이다.
각 컴포넌트는 클러스터의 상태를 유지하고 파드의 생명주기를 관리하는 역할을 수행하며, 모든 프로세스의 중심은 API 서버를 중심으로 처리되며, 아래와 같이 구성되어 있다.

  • 쿠버네티스 API 서버
  • 컨트롤러 매니저 
  • 스케줄러
  • etcd

 

1. 쿠버네티스 API 서버 (kube-apiserver)

일종의 '문'이라고 생각하면 쉽다.
쿠버네티스 클러스터와의 모든 상호작용을 처리하는 '중심'점이며, 모든 요청을 검증하고 권한을 확인한다.
예를 들어, 사용자가 새로운 파드를 배포하고자 할 때, API 서버는 이 요청을 받아, 유효성 검사를 하고, 필요한 권한이 있는지 확인한 후 처리한다.

쿠버네티스 API 서버에서 유효성 검사란?

요청된 작업이 쿠버네티스 시스템 내에서 실행될 수 있는지를 결정하는 중요한 단계다
더 자세하게 말하자면

 

모든 쿠버네티스 리소스 및 객체에 대한 상호 작용을 처리한다.

  • 클러스터 상태 변경 및 사용자 명령 처리
  • 요청을 검증하고 권한을 확인
  • 유효한 경우 클러스터 상태를 업데이트하거나 리소스 반환



2. 컨트롤러 매니저 (kube-controller-manager)

클러스터 내의 다양한 컨트롤러를 실행하여 클러스터 상태를 관리하고 제어합니다.

  • 클러스터 상태를 감시하고 원하는 상태로 유지하기 위해 루프를 실행
  • 레플리케이션 컨트롤러, 엔드포인트 컨트롤러 등이 클러스터 상태를 관리하고 필요에 따라 파드를 생성 또는 제거



3. 스케줄러 (kube-scheduler)

새로운 파드를 클러스터 내의 노드에 배치하는 역할을 수행합니다.

  • 새로운 파드를 배치하기 위해 API 서버에서 미배치 파드 목록을 가져옵니다.
  • 각 노드의 상태와 리소스를 고려하여 새로운 파드를 적합한 노드에 할당합니다.
  • 파드가 할당되면 API 서버에 업데이트를 반영합니다.



4. etcd (분산 저장소)

클러스터의 모든 구성 요소가 공유하는 분산 키-값 저장소로, 클러스터의 상태와 설정 정보를 보관합니다.

  • 클러스터 상태 및 구성을 저장하고 조회하여 구성 요소 간에 일관성을 유지합니다.
  • API 서버, 컨트롤러 매니저 등이 etcd에 접근하여 클러스터의 현재 상태를 확인하고 업데이트합니다.




노드 컴포넌트 (Node Components)

  1. kubelet (쿠버네티스 에이전트)
    • 각 노드에서 실행되는 에이전트로, 마스터로부터 할당된 파드의 상태를 유지하고 노드 상태를 보고합니다.



  2. kube-proxy (쿠버네티스 프록시)
    • 파드 간 통신을 관리하고 로드 밸런싱을 수행합니다. 서비스에 대한 네트워크 규칙을 설정하여 외부와의 통신을 지원합니다.



  3. Container Runtime (컨테이너 런타임)
    • 컨테이너를 실행하는 데 사용되는 소프트웨어입니다. Docker, containerd, CRI-O 등이 일반적으로 사용됩니다.




기본적인 파드(Pod) 프로세스

모든 동작 과정은 API-Server를 중심으로 일어난다, APi Server를 조금 더 크게 그릴걸,,

  1. 파드 생성 (매니페스트 파일 작성)

    • 사용자는 파드를 생성하고자 하는 목적에 맞는 매니페스트 파일(YAML 또는 JSON 형식)을 작성합니다.
    • 매니페스트 파일에는 파드의 구성, 컨테이너 이미지, 환경 변수, 포트 등이 정의됩니다.



  2. API 서버로 매니페스트 파일 전달

    • 작성한 매니페스트 파일을 kubectl을 사용하여 쿠버네티스 클러스터의 API 서버에 제출합니다.
    • bashCopy code kubectl apply -f mypod.yaml



  3. API 서버에서 매니페스트 처리

    • API 서버는 제출된 매니페스트를 받아들이고 유효성을 검사합니다.
    • 매니페스트의 정보를 etcd라 불리는 분산 저장소에 저장하여 클러스터 상태를 업데이트합니다.



  4. Unscheduled Pod 이벤트 발생

    • API 서버에서는 새로운 파드가 생성되었지만 아직 스케줄링되지 않았다는 이벤트를 생성합니다.



  5. Unscheduled Pod 이벤트 감지

    • 컨트롤러 매니저는 이벤트를 감지하고 처리합니다.



  6. 노드 탐색

    • 스케줄러는 현재 클러스터 내의 모든 노드를 고려하여 어느 노드에 파드를 배치할지 결정합니다.



  7. 탐색한 노드를 전달

    • 스케줄러는 결정된 노드 정보를 API 서버에 전달합니다.



  8. 기록

    • API 서버는 etcd에 새로운 파드의 할당 정보를 업데이트하여 클러스터의 상태를 반영합니다.



  9. 노드에서 파드 생성 및 실행

    • 할당된 노드에서 Kubelet은 API 서버로부터 할당된 파드의 명세를 가져옵니다.
    • Kubelet은 컨테이너 런타임(CRI)을 통해 파드에 정의된 컨테이너를 시작하고 관리합니다.



  10. 컨테이너 실행

    • 각 노드의 컨테이너 런타임은 파드에 정의된 컨테이너 이미지를 다운로드하고 컨테이너를 실행합니다.



  11. 상태 감시 및 업데이트

    • Kubelet은 주기적으로 파드의 상태를 감시하고 이를 API 서버에 보고합니다.
    • API 서버는 파드의 상태를 업데이트하고, 필요에 따라 이벤트를 생성하여 클러스터 이벤트를 기록합니다.

 

혹시나 잘못 된 부분이 있다면 알려주세요..!


Reference

https://kubernetes.io/ko/docs/concepts/overview/components/

https://velog.io/@squarebird/Kubernetes-Kubernetes-%EA%B5%AC%EC%A1%B0

https://malwareanalysis.tistory.com/512

 

반응형

댓글