Manger Node

Kubernets Manager Node



Kubernets Manager Node


  • Manager Node는 노드는 클러스터에 대한 요청을 수신하고 분배하는 역할을 하는 로드 밸런서 역할을 하는 서버를 의미합니다.

  • 일반적으로 NGINX, HAProxy와 같은 프록시 서버를 사용하며, 여기서는 Nginx로 구성합니다.

  • 해당 노드의 주 역할은 아래와 같습니다.


역할 설명 예시
요청 라우팅 클라이언트의 API 요청을 적절한 서비스나 백엔드 노드로 전달합니다. NGINX가 클라이언트 요청을 받아 특정 서비스로 라우팅합니다. 예를 들어, /api/users 요청은 사용자 서비스로 전달됩니다.
로드 밸런싱 요청을 여러 백엔드 노드에 균등하게 분배하여 성능을 최적화합니다. HAProxy가 두 개의 인스턴스(예: app-1, app-2)로 요청을 분배합니다. 각 인스턴스가 50%의 트래픽을 처리합니다.
SSL 종료 HTTPS 요청을 처리하고 SSL 인증서를 관리하여 보안을 강화합니다. NGINX가 SSL 인증서를 사용하여 클라이언트와의 연결을 암호화합니다. 내부 통신은 HTTP로 유지합니다.
캐싱 정적 콘텐츠를 캐싱하여 반복적인 요청에 대한 응답 속도를 향상시킵니다. NGINX가 자주 요청되는 이미지 파일을 캐싱하여, 사용자가 이미지를 요청할 때마다 백엔드 서버에 요청하지 않습니다.
트래픽 관리 요청의 수를 제한하거나 특정 요청을 차단하여 트래픽을 관리합니다. HAProxy가 특정 IP에서의 요청 수를 제한하여 DDoS 공격을 방어합니다. 예를 들어, 100초당 10회 요청으로 제한할 수 있습니다.
상태 검사 백엔드 서비스의 상태를 주기적으로 확인하여, 실패한 서비스에 요청을 보내지 않도록 합니다. HAProxy가 app-1 인스턴스의 상태를 확인하고, 문제가 발생한 경우 해당 인스턴스에 요청을 보내지 않도록 합니다.

  • 간단하게 기존에 사용하던 Docker engine을 사용하지 않고 ContainerD를 사용 하게된 이유를 정리하자면
    1. 쿠버네티스는 여러 컨테이너 런타임과 통신할 수 있도록 하는 CRI라는 표준 인터페이스를 설계함.

    2. Docker engine은 CRI 인터페이스가 생기기전 존재한 기술로 CRI 인터페이스와 맞지 않았음.

    3. 이를 해결하기 위해 dockershim이라는 어댑터 컴포넌트를 개발하였음.

    4. 이 쉼의 존재는 kubelet 자체에 많은 불필요한 복잡성을 도입했고, 일부 통합은 이 쉼 때문에 Docker에 대해 일관성 없게 구현되었으며, 이로 인해 유지 관리 부담이 증가하게 됨.

image.png
  1. 이처럼 벤더 특정 코드(특정 제품인 Docker에 종속적인 코드)를 유지 관리하는 것은 쿠버네티스의 오픈 소스 철학에 부합하지 않았고, 2022년 4월 v1.24에서 완전한 제거를 발표하였음.



Kubernets Manager Node Install



# nginx를 설치합니다.
$ apt -y install nginx libnginx-mod-stream


# nginx에 프록시를 세팅합니다.
$ vi /etc/nginx/nginx.conf

stream {
    upstream k8s-api {
        server 7.7.7.100:6443; # contolplan IP
    }
    server {
        listen 6443;
        proxy_pass k8s-api;
    }
}

# Nginx의 default 웹을 비활성화합니다.
$ unlink /etc/nginx/sites-enabled/default
$ systemctl restart nginx


# kubectl 레포지터리를 등록하고 설치합니다.
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
$ echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
$ apt update
$ apt -y install kubectl


# (option) kubectl alias k
$ apt -y install bash-completion
$ source /usr/share/bash-completion/bash_completion
$ kubectl completion bash | tee /etc/bash_completion.d/kubectl > /dev/null
$ echo 'alias k=kubectl' >>~/.bashrc
$ echo 'complete -o default -F __start_kubectl k' >>~/.bashrc
$ exec bash

RSS Feed