kube-proxy
kube-proxy는 쿠버네티스에서 서비스를 만들었을 떄 클러스터 IP나 노드 포트로 접근할 수 있게 만들어 실제 조작을 하는 컴포넌트입니다. 쿠버네티스 클러스터의 노드마다 실행되면서 클러스터 내부 IP로 연결하려는 요청을 적절한 파드로 전달합니다.
kube-proxy가 네트워크 관리하는 방법은 userspace, iptables, IPVS가 있습니다. 초기에는 userspace가 기본 관리 모드였고 현재(2021년 6월)에는 iptables가 기본 관리 모드입니다.
앞으로는 iptables에서 IPVS로 기본 관리 모드가 바뀔 것으로 예상합니다.
클라이언트에서 서비스의 클러스터 IP를 통해 어떤 요청을 하면 iptables을 거쳐서 kube-proxy가 요청을 받습니다. 그리고 서비스의 클러스터 IP는 연결되어야 하는 적절한 파드로 연결해줍니다.
userspace 모드와 다른 점은 kube-proxy가 iptables를 관리하는 역할만 한다는 것입니다. 직접 클라이언트에서 트래픽을 받지 않습니다.
클라이언트에서 오는 모든 요청은 iptables을 거쳐서 파드로 직접 전달됩니다. 그래서 userspace 모드보다 요청 처리 성능이 좋습니다. userspace 모드에서는 파드 하나로 연결 요청이 실패하면 자동으로 다른 파드에 연결을 재시도합니다.
하지만 iptables 모드에서는 파드 하나로의 연결 요청이 실패하면 재시도하지 않고 그냥 요청이 실패합니다. 컨테이너 readnessProbe가 설정되었고 그에 때란 헬스 체크가 정상적으로 되어야 연결 요청이 이루어집니다.
IP Virtual Server 모드는 리눅스 커널에 있는 L4 로드밸런싱 기술입니다. 리눅스 커널 안 네트워크 관련 프레임워크인 넷필터에 포함되어 있습니다. 따라서 IPVS 커널 모듈이 노드에 설치되어야 합니다.
IPVS 모드는 커널 공간에서 동작하고 데이터 구조를 해시 테이블로 저장하기 때문에 iptables 모드보다 빠르고 좋은 성능을 냅니다. 또한 더 많은 로드밸런싱 알고리즘이 있어서 이를 이용할 수 있습니다.
참고
https://rtfm.co.ua/en/kubernetes-service-load-balancing-kube-proxy-and-iptables/