ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 3.1
    STUDY/Docker 2023. 4. 25. 17:31

    쿠버네티스의 구성 요소 간 통신

     

    마스터 노드

    • kubectl : 쿠버네티스 클러스터에 명령을 내리는 역할로, API 서버와 주로 통신을 한다.
    • API 서버 : 쿠버네티스 클러스터의 중심 역할을 하는 통로로, 주로 상태 값을 저장하는 etcd와 통신한다.
    • etcd : 구성 요소들의 상태 값이 모두 저장되는 곳으로, etcd 외의 다른 구성 요소는 상태 값을 관리하지 않는다. 따라서 etcd의 정보만 백업돼 있으면 장애 상황에서 쿠버네티스 클러스터는 복구가 가능하다. 또한 etcd는 분산 저장이 가능한 key-value 저장소이므로, 복제해 여러 곳에 저장해 두면 하나의 etcd에서 장애가 발생하더라도 시스템의 가용성을 확보할 수 있다.
    • 컨트롤러 매니저 : 쿠버네티스 클러스터의 오브젝트 상태를 관리한다.
      • 노드 컨트롤러 - 상태 체크와 복구
      • 레플리카셋 컨트롤러 - 레플리카셋에 요청받은 파드 개수대로 파드를 생성
      • 엔드포인트 컨트롤러 - 서비스와 파드를 연결
    • 스케줄러 : 노드의 상태와 자원, 레이블, 요구 조건 등을 고려해 파드를 어떤 워커 노드에 생성할 것인지를 결정하고 할당한다. 파드를 조건에 맞는 워커 노드에 지정하고, 파드가 워커 노드에 할당되는 일정을 관리하는 역할을 담당한다.

     

    워커 노드

    • kubelet : 파드의 생성과 상태 관리 및 복구 등을 담당하는 구성 요소로, 파드의 구성 내용(PodSpec)을 받아서 컨테이너 런타임으로 전달하고, 파드 안의 컨테이너들이 정상적으로 작동하는지 모니터링한다.
    • 컨테이너 런타임(CRI, Container Runtime Interface) : 파드를 이루는 컨테이너의 실행을 담당한다. 파드 안에서 다양한 종류의 컨테이너가 문제 없이 작동하게 만드는 표준 인터페이스이다.
    • 파드(Pod) : 한 개 이상의 컨테이너로 단일 목적의 일을 하기 위해서 모인 단위이다. 

     

    사용자가 배포된 파드에 접속할 때

    파드가 배포된 이후 사용자 입장에서 배포된 파드에 접속하는 과정

    1. 쿠버네티스 클러스터는 파드가 위치한 노드에 kube-proxy(파드의 통신을 담당)를 통해 파드가 통신할 수 있는 네트워크를 설정한다. 이때 실제 통신은 br_netfilter와 iptables로 관리한다.
    2. 이미 배포된 파드에 접속하고 필요한 내용을 전달받는다. 이때 대부분 사용자는 파드가 어느 워커 노드에 위치하는지 신경쓰지 않아도 된다.

     

    파드의 생명주기로 쿠버네티스 구성 요소 살펴보기

    쿠버네티스의 가장 큰 장점은 쿠버네티스의 구성 요소마다 하는 일이 명확하게 구분돼 각자의 역할만 충실하게 수행하면 클러스터 시스템이 안정적으로 운영된다는 점이다. 파드가 배포되는 과정을 통해 쿠버네티스의 구성 요소들이 어떤 역할을 담당하는지 알아보자.

     

    먼저 파드의 생명주기(생성, 수정, 삭제되는 과정)를 확인해보면, 

    파드의 생명주기

    1. kubectl을 통해 API 서버에 파드 생성을 요청한다,
    2. (업데이트가 있을 때마다 매번) API 서버에 전달된 내용이 있으면 API 서버는 etcd에 전달된 내용을 모두 기록해 클러스터의 상태 값을 최신으로 유지한다. 따라서 각 요소가 상태를 업데이트할 때마다 모두 API 서버를 통해 etcd에 기록된다.
    3. API 서버에 파드 생성이 요청된 것을 컨트롤러 매니저가 인지하면 컨트롤러 매니저는 파드를 생성하고, 이 상태를 API 서버에 전달한다.(어떤 워커 노드에 파드를 적용할지는 결정되지 않은 상태로 파드만 생성)
    4. API 서버에 파드가 생성됐다는 정보를 스케줄러가 인지한다. 스케줄러는 생성된 파드를 어떤 워커 노드에 적용할지 조건을 고려해 결정하고 해당 워커 노드에 파드를 띄우도록 요청한다.
    5. API 서버에 전달된 정보대로 지정한 워커 노드에 파드가 속해 있는지 스케줄러가 kubelet으로 확인한다.
    6. kubelet에서 컨테이너 런타임으로 파드 생성을 요청한다,
    7. 파드가 생성된다.
    8. 파드가 사용 가능한 상태가 된다.

     

    쿠버네티스는 작업을 순서대로 진행하는 워크플로(workflow, 작업 절차) 구조가 아니라 선언적인 시스템 구조를  가지고 있다. 즉, 각 요소가 추구하는 상태를 선언하면 현재 상태와 맞는지 점검하고 그것에 맞추려고 노력하는 구조로 돼 있는 것이다.

     

    따라서 추구하는 상태를 API 서버에 선언하면 다른 요소들이 API 서버에 와서 현재 상태와 비교하고 그에 맞게 상태를 변경하려고 한다. 여기서 API는 현재 상태 값을 가지고 있는데, 이곳을 보존해야 해서 etcd가 필요하다.

     

    다만, 워커 노드는 워크플로 구조에 따라 설계되어있다. 쿠버네티스가 kubelet과 컨테이너 런타임을 통해 파드를 새로 생성하고 제거해야 하는 구조여서 선언적인 방식으로 구조화하기에는 어려움이 있기 때문이다. 또한 명령이 절차적으로 전달되는 방식은 시스템의 성능을 높이는 데 효율적이다. 하지만 마스터 노드는 이미 생성된 파드들을 유기적으로 연결하므로 쿠버네티스 클러스터를 안정적으로 유지하려면 선언적인 시스템이 더 낫다.

     

    쿠버네티스의 상태 유지 방법

     

    쿠버네티스는 굉장히 잘 설계된 시스템 구조를 가지고 있어서 구조적으로 이해하기 쉽고 문제가 생기면 이를 쉽게 파악하고 조치할 수 있다.

     


    파드(Pod)란?

    쿠버네티스 애플리케이션의 기본 실행 단위로, 쿠버네티스 객체 모델 중 만들고 배포할 수 있는 가장 작고 간단한 단위이다. 애플리케이션 컨테이너, 저장소 리소스, 특정 네트워크 IP, 컨테이너가 동작하기 위한 옵션들을 캡슐화 한다. 파드는 하나 이상의 컨테이너를 포함하며, 컨테이너를 개별적으로 배포하기 보다 컨테이너들의 그룹인 파드를 배포하며 운영한다.

     

    특징

    • 기본적으로 하나의 파드에는 하나 이상의 컨테이너가 포함된다. 필요에 따라 하나의 파드에 여러 컨테이너를 포함시킬 수 있다.
    • 파드는 노드 IP와 별개로 고유 IP를 할당받으며, 파드 안의 컨테이너들은 그 IP를 공유한다.
    • 파드 자체는 일반적으로 1개의 IP만 가진다.
    • 파드 안의 컨테이너들은 동일한 볼륨과 연결이 가능하다.
    • 파드는 클러스터에서 배포의 최소 단위이고, 특정 네임스페이스안에서 실행된다.
    • 파드는 기본적으로 반영속적이다.

     

    동일한 역할을 하는 파드라도 환경에 따라 각각 다른 노드에 위치할 수 있고, 특정 노드가 죽을 경우 해당 노드의 파드들은 다른 노드로 옮겨지기도 하며, 필요에 따라 파드 숫자의 구성도 수시로 달라질 수 있다. 쿠버네티스에서의 파드는 무언가가 구동 중인 상태를 유지하기 위해 동원되는 일회성 자원이며, 필요에 따라 언제든 삭제될 수 있다,

     

    쿠버네티스 클러스터에서 운영되는 대다수의 파드는 오직 하나의 컨테이너만을 포함하고 있는 단일 컨테이너 파드이다. 하지만 2개 이상의 서로 다른 컨테이너를 포함하는 파드도 있는데, 이를 멀티 컨테이너 파드라고 한다. 함께 붙어있어야 하며 같은 생명주기를 공유하는 컨테이너들이 존재할 경우 이들을 묶어 하나의 파드로 운영할 수 있다.

     

    멀티 컨테이너 파드의 특징

    • 파드의 상태에 따라 함께 구동되고 함께 정지된다. 즉, 같은 생명주기를 공유한다.
    • 하나의 파드 안에서 서로 간편하게 통신이 가능하다.
    • 파드가 가진 스토리지(볼륨)을 함께 공유한다.

     

    쿠버네티스는 직접 컨테이너를 실행하지 않고, 파드를 실행하면서 파드 속의 각 컨테이너가 동일한 리소스 및 로컬 네트워크를 공유하게 한다. 컨테이너를 그룹화하면서 실제로는 어느정도 분리된 상태더라도 마치 동일한 물리 하드웨어를 공유하는 것처럼 컨테이너끼리 서로 통신할 수 있게 된다.

     

    컨테이너를 파드로 구성하는 것이 바로 쿠버네티스의 기능 중 하나인 복제의 토대가 된다. 컨테이너를 모아 파드를 만들면 쿠버네티스는 복제 컨트롤러를 사용하여 필요에 따라 애플리케이션을 스케일할 수 있다.

     

     

     

     

     

    참고

    https://seongjin.me/kubernetes-pods/

    https://akasai.space/kubernetes/about_pod/

     

     

Designed by Tistory.