Multi Node/Architecture Cluster

쿠버네티스 클러스터

  • 쿠버네티스는 다중 아키텍처 플랫폼으로, 하나의 클러스터 안에 여러 아키텍처 노드, 여러 운영체제로 구동되는 노드가 포함될 수 있다.

컨트롤플레인 구조

  • 쿠버네티스의 노드들 중 클러스터 관리 기능을 담당하는 노드를 컨트롤플레인이라고 부르며, 그 외 노드는 클러스터가 수행하는 작업을 실제 담당하게 된다.

  • 컨트롤플레인에서는 API 서버 외에 DNS 서버 및 코어 시스템 컨트롤러가 동작한다.

    • API 서버 : 클러스터 관리를 위한 서버로, kubectl, kubernetes API에서 사용된다. HTTPS 기반의 REST API 엔드포인트로 구현된다. kube-apiserver 파드에서 실행되며 필요에 따라 스케일링된다.

    • 스케줄러 : 파드 생성 요청이 들어오면 파드를 실행할 노드를 선택한다. kube-scheduler 파드에서 실행되며, 플러그인 컴포넌트이기 때문에 커스텀 스케줄러를 사용할 수 있다.

    • 컨트롤러 매니저 : 외부에 드러나지 않는 코어 컨트롤러를 구동한다. kube-controller-manager 파드에서 실행되며 노드 상태를 감시하고 서비스 엔드포인트를 관리한다.

    • etcd : 쿠버네티스의 데이터 저장소로 클러스터와 관련된 데이터가 저장된다. 분산 key-value 데이터베이스이므로 클러스터 내에 여러 복제본이 존재한다.

  • AKS 와 같은 클라우드 매니지드 쿠버네티스 환경에서는 컨트롤플레인을 직접 관리하지 않아도 된다.

  • 컨트롤플레인을 여러 대 둘 수 있으며 일부 노드가 다운되면 나머지 컨트롤플레인 노드끼리 투표해 새로운 컨트롤플레인 노드를 뽑는다.

노드의 구조

  • 노드는 파드를 생성하고 파드 컨테이너를 유지하며 파드를 쿠버네티스 네트워크에 연결시킨다.

  • 노드에서는 다음과 같은 구성 요소가 존재한다.

    • kubelet은 호스트의 백그라운드 프로세스로 구동되어 파드 생성 요청을 전달받고 파드의 생애 주기를 관리한다. 노드의 상태를 컨트롤플레인 API 서버에 전달하기도 한다.

    • kube-proxy는 노드 내 파드끼리 통신 혹은 다른 노드끼리 통신할 때 트래픽 라우팅을 담당한다. 파드 하나를 가진 데몬셋 형태로 구동되어 각 노드마다 트래픽을 관리한다.

    • 컨테이너 런타임은 kubelet의 지시를 받아 파드 컨테이너를 관리한다. 도커, containerd, CRI-O가 사용된다.

클러스터 구축

  • 쿠버네티스 클러스터 구축은 대부분 kubeadm을 통해 처리한다.

  • 다음 명령을 통해 장비를 컨트롤플레인 노드로 만들 수 있다.

    • 컨트롤플레인 노드에는 DNS, 컨트롤러 관리자, API 서버가 동작한다.

kubeadm init --pod-network-cidr="10.244.0.0/16" --service-cidr="10.96.0.0/12"
mkdir ~/.kube
sudo cp /etc/kubernetes/admin.conf ~/.kube/config
sudo chmod +r ~/.kube/config
  • 파드 네트워크는 플러그인 모델이기 때문에 kubectl apply 명령으로 직접 배치해주어야 한다.

  • kubeadm join 명령과 함께 컨트롤플레인의 IP 주소, 토큰, 인증서 해시 등을 입력해 현재 장비를 클러스터 노드로 등록할 수 있다.

    • 노드에는 kubelet이 쿠버네티스와 별개로 백그라운드 프로세스로 동작하며, 네트워크 프록시와 네트워크 플러그인이 파드 형태로 동작한다.

kubeadm join <control plain ip addr> --token <join token> --discovery-token-ca-cert-hash <hash>

하이브리드 애플리케이션

  • 컨테이너에 띄워질 이미지가 윈도우용 이미지라면 컨테이너가 실행중인 호스트 컴퓨터의 아키텍쳐도 윈도우여야 한다.

  • 컨테이너는 자신을 실행중인 호스트 컴퓨터의 커널을 사용하기 때문이다.

  • 쿠버네티스 클러스터에서 서로 다른 아키텍처의 애플리케이션을 실행하려면 각 아키텍처에 맞는 노드가 있어야한다.

  • 다음과 같은 클러스터처럼 ARM CPU 리눅스, AMD CPU 리눅스, 윈도우 노드들을 갖도록 구성할 수 있다.

  • 컨트롤플레인은 리눅스 전용이지만 kubelet, kube-proxy는 크로스 플랫폼을 지원한다.

Last updated