Kubernetes/K8s
[K8s] 가상 IP 및 서비스 프록시
lumination
2025. 6. 18. 18:04
https://kubernetes.io/ko/docs/reference/networking/virtual-ips/
쿠버네티스 클러스터의 모든 노드는 kube-proxy를 실행한다(kube-proxy를 대체하는 구성요소를 직접 배포한 경우가 아니라면).
kube-proxy는 ExternalName 외의 type의 서비스를 위한 가상 IP 메커니즘의 구현을 담당한다.
항상 발생하는 질문은, 왜 쿠버네티스가 인바운드 트래픽을 백엔드로 전달하기 위해 프록시에 의존하는가 하는 점이다.
다른 접근법이 있는가?
예를 들어, 여러 A 값 (또는 IPv6의 경우 AAAA)을 가진 DNS 레코드를 구성하고,
라운드-로빈 이름 확인 방식을 취할 수 있는가?
There are a few reasons for using proxying for Services:
레코드 TTL을 고려하지 않고, 만료된 이름 검색 결과를 캐싱하는 DNS 구현에 대한 오래된 역사가 있다.
일부 앱은 DNS 검색을 한 번만 수행하고 결과를 무기한으로 캐시한다.
앱과 라이브러리가 적절히 재-확인을 했다고 하더라도, DNS 레코드의 TTL이 낮거나 0이면 DNS에 부하가 높아 관리하기가 어려워질 수 있다.
우선 알아두어야 할 것은, kube-proxy를 구동할 때, 커널 수준의 규칙이 수정(예를 들어, iptables 규칙이 생성될 수 있음)될 수 있고,
이는 때로는 리부트 전까지 정리되지 않을 수도 있다.
그래서, kube-proxy는 컴퓨터에서 저수준의, 특권을 가진(privileged) 네트워킹 프록시 서비스가 구동됨으로써
발생하는 결과를 이해하고 있는 관리자에 의해서만 구동되어야 한다.
비록 kube-proxy 실행 파일이 cleanup 기능을 지원하기는 하지만,
이 기능은 공식적인 기능이 아니기 때문에 구현된 그대로만 사용할 수 있다.
예를 들어, 3개의 레플리카로 실행되는 스테이트리스 이미지-처리 백엔드를 생각해보자.
이러한 레플리카는 대체 가능하다.
즉, 프론트엔드는 그것들이 사용하는 백엔드를 신경쓰지 않는다.
백엔드 세트를 구성하는 실제 파드는 변경될 수 있지만, 프론트엔드 클라이언트는 이를 인식할 필요가 없으며,
백엔드 세트 자체를 추적해야 할 필요도 없다.
kube-proxy는 Kubernetes 클러스터의 서비스(Service) 네트워킹을 담당하는 핵심 컴포넌트입니다. 간단히 말하면, 클러스터 내부에서 "서비스 IP"로 접근한 트래픽을 실제 파드로 연결해주는 역할을 합니다.
📌 kube-proxy의 주요 역할
1. 클러스터 내부 트래픽 라우팅
Kubernetes에서 Service를 만들면, 가상의 클러스터 IP가 생깁니다.
→ 이 IP로 요청이 들어오면 kube-proxy가 실제 파드(Pod)로 포워딩해 줍니다.
예:
curl http://my-service:80
→ kube-proxy가 파드들 중 하나로 연결
2. 로드밸런싱
Service에 연결된 파드가 여러 개일 경우,
→ kube-proxy가 round-robin 방식 등으로 트래픽을 분산합니다.
📌 왜 모든 노드마다 kube-proxy가 필요한가?
모든 워커 노드에는 파드가 실행될 수 있고,
각 노드에서 로컬로 동작하는 kube-proxy가 있어야:
- 해당 노드로 들어온 트래픽을
- 그 노드에 있는 파드로 연결하거나,
- 필요시 다른 노드의 파드로 리다이렉트 할 수 있습니다.
즉, 네트워크 경로를 현지에서 바로 처리해야 빠르고 효율적이기 때문에
노드마다 kube-proxy가 필수입니다.
🔧 작동 방식 (모드에 따라 다름)
- iptables 모드 (기본)
→ kube-proxy가 iptables 룰을 만들어서 트래픽 흐름을 제어
→ 성능 좋고 안정적 - IPVS 모드
→ 커널 레벨의 로드밸런서인 IPVS를 사용
→ 대규모 환경에서 성능 우수
요약
항목 | 설명 |
역할 | 서비스 IP → 실제 파드로 연결 (트래픽 라우팅) |
필요 이유 | 모든 노드에서 네트워크 처리를 해야 하므로 |
작동 방식 | iptables or IPVS를 통해 네트워크 제어 |
특징 | 로드밸런싱, NAT, 클러스터 서비스 지원 |
궁금하면 실제 iptables -t nat -L -n 해보면
KUBE-SERVICES 같은 chain이 보일 거야.
이게 kube-proxy가 만든 거야.