본문 바로가기
Kubernetes/활용

kube-proxy 부하분산 설정의 이해

by lumination 2024. 2. 23.

모든 쿠버네티스 서비스는 기본 설정으로 부하분산을 지원한다.

 

쿠버네티스의 모든 노드에서 실행 중인 kube-proxy 파드는 노드 내에서 실행 중인 모든 파드의 네트워크 트래픽을 처리한다.

 

kube-proxy는 쿠버네티스 서비스와 연동해서 파드의 모든 인그레스(Ingress), 이그레스(egress) 통신을 처리한다.

 

kube-proxy는 기본 설정으로 IPVS(IP Virtual Server) 모드로 동작한다.

kube-proxy 모드 관련 설정은 kube-proxy 설정 파일인 컨피그맵에서 확인 가능하다.


kubectl describe cm -n kube-system kube-proxy

...
mode: ipvs
...

그림1. kube-proxy의 부하분산 아키텍처

 

#파드의 수량을 5개로

k scale deployment nginx-hello --replicas 5

 

 

kube-proxy IPVS모드에서 내부적으로 처리하는 라우팅 규칙 조회 ipvsadm 명령어

# 클러스터 노드 접속 후 명령어 호출 Cluster-IP 기입

sudo ipvsadm -Ln | grep -A5 -E '{cluster-ip}'

 

# 동일하게  노트포트 30080포트에 대해 라우팅 테이블을 확인

sudo ipvsadm -Ln | grep -A5 30080

 

 

 

노드포트 몇 가지 한계

1. 웹서비스에서 사용하는 80, 443 등 well-known 포트의 사용이 불가능하다는 것 (30000 ~32767 포트 중 하나를 사용 가능)

2. 노드의 ip 중 하나를 지정해야 하므로 서비스 안정성 및 부하분산 문제가 있다는 것
    (현업에서는 별도의 물리 L4 스위치를 사용해 부하분산 기능을 사용하기도 함. 물리 L4 스위치의 vip에 할당하는 Real IP에
     전체 클러스터 노드의 IP를 각각 등록함)

 

3. 노드 ip 주소가 변경되면 외부 접속용 ip 주소도 함께 변경해야 하는 문제가 있음

 => 이를 해결할 수 있는 LB 타입 서비스가 있음


그림1출처: https://rtfm.co.ua/en/kubernetes-service-load-balancing-kube-proxy-and-iptables/