K8s
kube-proxy
Tech Crunchy
2025. 4. 20. 01:33
728x90
개요
kube-proxy는 클러스터의 각 노드에 실행되는 네트워크 프록시로, K8s의 Service 개념을 실제로 구현하는 핵심 컴포넌트입니다. 클러스터 내부 및 외부에서 포드로의 네트워크 트래픽을 관리하고, 서비스 IP와 실제 포드 IP 간 라우팅을 담당합니다.
- 네트워크 트래픽 프록시 및 로드밸런싱: kube-proxy는 Service로 유입되는 네트워크 요청을 실제 동작 중인 여러 포드로 분산시켜 전달합니다.
- 네트워크 규칙 관리: 각 노드에서 네트워크 규칙을 동적으로 생성 및 관리합니다.
- Service와 Endpoint 동기화: API Server로부터 Endpoint(포드 IP) 정보를 받아, 변경사항이 생길 때마다 노드의 네트워크 규칙을 실시간으로 갱신합니다.
kube-proxy는 동작 방식으로는 세 가지가 있습니다.
- userspace: kube-proxy가 직접 프록시 서버 프로세스를 실행하여 트래픽을 받아 파드로 전달
- iptables: 리눅스 iptables를 활용해 네트워크 규칙을 관리. 트래픽은 커널 레벨에서 직접 포드로 전달됨
- IPVS: 리눅스 IPVS(가상 서버)를 이용해 트래픽을 관리. 해시 테이블 기반으로 빠르고 다양한 로드밸런싱을 지원
userspace
클라이언트에서 서비스의 클러스터 IP를 통해 요청을 하면 iptables를 거쳐 kube-proxy가 요청을 받습니다. 그리고 서비스의 클러스터 IP는 연결되어야 하는 적절한 포드로 연결합니다. 포드에 요청은 라운드 로빈 방식을 사용합니다.
iptables (기본)
kube-proxy가 iptables를 관리하는 역할을 합니다. 기본값은 iptables 모드이지만, 최근 성능과 확장성 때문에 IPVS 모드도 많이 사용됩니다.
클라이언트의 요청은 iptables를 거쳐 포드에 직접 전달됩니다. 이 때문에 userspace 보다 처리 성능이 좋습니다.
IPVS
IPVS(IP Virtual Server)는 리눅스 커널에 있는 L4 로드밸런싱입니다. 리눅스 커널 내 네트워크 관련 프레임워크인 넷필터에 포함되어 있습니다.
커널 스페이스에서 동작하고 데이터 구조를 해시 테이블로 저장하기 때문에 iptables 보다 성능적으로 우월합니다. 또한 더 많은 로드밸런싱 알고리즘을 제공합니다.
- rr(round robin): 프로세스 사이에 우선순위를 두지 않고 시간 단위로 CPU를 할당
- lc(least connection): 접속 개수가 가장 적은 서버를 선택
- dh(destination hashing): 목적지 IP 주소로 해시값을 계산해 분산할 실제 서버를 선택
- sh(source hashing): 출발지 IP 주소로 해시값을 계산해 분산할 실제 서버를 선택
- sed(shortest expected delay): 응답 속도가 가장 빠른 서버를 선택
- nq(never queue): sed와 비슷하지만 활성 접속 개수가 0인 서버를 가장 먼저 선택
728x90