metal LB 는 베어메탈(bare metal, 운영 체제가 설치되지 않은 하드웨어)로 구성된 쿠버네티스에서도 로드밸런서를 사용할 수 있게 고안된 프로젝트입니다.
MetalLB는 BareMetalLoadBalancer 약자!
서비스(로드 밸런서)의 'External IP' 전파를 위해서 표준 프로토콜인 ARP(IPv4)/NDP(IPv6), BGP 를 사용합니다.
데몬셋으로 speaker 파드를 생성하여 'External IP'를 전파합니다.
MetalLB 컨트롤러는 작동 방식(Protocol, 프로토콜)을 정의하고 EXTERNAL-IP를 부여해 관리합니다. MetalLB 스피커(speaker)는 정해진 작동 방식(L2/ARP, L3/BGP)에 따라 경로를 만들 수 있도록 네트워크 정보를 광고하고 수집해 각 파드의 경로를 제공합니다. 이때 L2는 스피커 중에서 리더를 선출해 경로 제공을 총괄하게 합니다.
점선으로 표시된 부분이 MetalLB 스피커에서 자동으로 관리해주는 부분입니다.
L2 모드 (ARP 프로토콜 사용 - mac 주소 인식 )
Speaker 파드 중 1개가 리더로 선출되고, 리더는 ARP(GARP, Gratuitous APR)를 이용하여 서비스 External IP 광고합니다.
위 그림과 같이 iptables 분산룰을 이용하여 Traffic을 전달합니다.
여기서 iptables 분산 룰은 후에 찾아보기로 했습니다..너무 길어질듯해서..
2) bgp 모드 (동적 라우팅 프로토콜) - L3 - 라우팅
• 일반적으로 서버상단에는 L3 스위치가 구성되며, Speaker와 BGP Neighbor를 맺으며, 서비스 External IP를 32bit로 광고합니다.
클라이언트에서 서비스의 클러스터 IP를 통해 어떤 요청을 하면 iptables를 거쳐서 kube-proxy가 요청을 받습니다. 그리고 서비스의 클러스터 IP는 연결되어야 하는 적절한 파드로 연결해줍니다. 이 때 요청을 파드들에게 나눠줄 때는라운드 로빈(round robin) 방식을 사용합니다.
userspace 모드와 다른 점은 kube-proxy가 iptables를 관리하는 역할만 한다는 것입니다. 직접 클라이언트에서 트래픽을 받지 않습니다. 클라이언트에서 오는 모든 요청은 iptables를 거쳐서 파드로 직접 전달됩니다.그래서 userspace 모드 보다 요청 처리 서능이 좋습니다.userspace 모드에서는 파드 하나로의 연결 요청이 실패하면 kube-proxy가 자동으로 다른 파드에 연결을 재시도합니다. 하지만 iptables 모드에서는 파드 하나로의 연결 요청이 실패하면 재시도하지 않고 그냥 요청이 실패합니다.컨테이너에 readinessProbe가 설정되었고 그에 따른 헬스 체크가 정상적으로 되어야 연결 요청이 이루어집니다.
ipvs 모드 :
IPVS(IP Virtual Server) 모드IPVS(IP Virtual Server) 모드는 리눅스 커널에 있는 L4 로드밸런싱 기술입니다. 리눅스 커널 안 네트워크 관련 프레임워크인넷필터(Netfilter)에 포함되어 있습니다. 따라서 IPVS 커널 모듈이 노드에 설치되어야 합니다. ipvs는 커널스페이스에서 작동하고 데이터 구조를 해시테이블로 저장해서 가지고 있기 때문에 iptables보다 빠르고 좋은 성능을 냅니다. 그리고 ipvs는 더 많은 로드밸런싱 알고리즘을 가지고 있어서 이걸 이용할 수 있습니다. rr(round-robin), lc(least connection), dh(destination hashing), sh(source hashing), sed(shortest expected delay), nq(never queue)등의 다양한 로드밸런싱 알고리즘을 제공해 줍니다.
외부에서 접속 -> NodePort -> speaker 파드 -> controller 파드 -> NodePort -> 실제 서비스 -> 파드
쿠버네티스 클러스터를 제어하기 위해서는 마스터 노드인 호스트에 접속하여 큐브컨트롤으로 명령어를 실행해야합니다. 그러나, 반드시 쿠버네티스 클러스터 제어를 위해서 마스터 노드에서 수행할 필요는 없습니다. 그 이유는 큐브컨트롤(kubectl) 이 쿠버네티스 클러스터 접근을 위해서 클러스터 접근 구성 파일(kubeconfig) 을 참조해서 클러스터에 접근하기 때문입니다.
쿠버네티스 클러스터의 마스터 노드가 아닌 로컬 컴퓨터(외부 호스트) 에서 큐브컨트롤을 사용하여 쿠버네티스 클러스터에 명령어를 실행하기 위해서 클러스터 접근 구성 파일을 정의하고 쿠버네티스
여러 사용자들이 파일을 공유하는데 유용하게 사용됩니다. 예를 들어, 여러 명의 사용자가 한 프로젝트에 참여하고 있는 경우, (흔히 NFS 공유라고 알려진) NFS 파일 시스템의 공유 디렉토리를 사용하여 마운트된 /myproject 디렉토리 안에 프로젝트에 사용되는 파일을 저장하여 함께 사용 가능합니다.