IPVS kube-proxy 사용하기
kube-proxy를 IPVS 모드로 운영하면 서비스가 수천 개로 늘어나는 클러스터에서도 일정한 시간 복잡도로 서비스 로드 밸런싱을 할 수 있어요. 이 문서는 IPVS 모드의 개념과 Calico와의 연동 방식, NodePort 범위 동기화 방법을 다뤄요.
출처: 문서
본문
큰 그림
파드 사이에서 트래픽을 로드 밸런싱하기 위해 IPVS kube-proxy 모드를 사용해요.
이런 점이 좋아요
컨테이너 네트워킹 여정의 어느 지점에 계시든, iptables는 잘 serve할 거예요. 하지만 1,000개 이상의 서비스로 확장한다면 kube-proxy IPVS 모드로 얻을 수 있는 성능 개선을 살펴볼 가치가 있어요.
개념
Kubernetes kube-proxy
kube-proxy 프로세스는 각 노드에서 서비스와 관련된 모든 일을 처리해요. 서비스 클러스터 IP와 포트로 들어오는 연결이 그 서비스를 뒷받침하는 파드로 가도록 보장해요. 파드가 여러 개면 kube-proxy가 파드들 사이에서 트래픽을 로드 밸런싱해요.
kube-proxy는 세 가지 모드로 실행돼요: userspace, iptables, ipvs. (userspace는 오래되고 느려서 권장하지 않아요.) iptables와 ipvs 모드의 요약이에요.
| kube-proxy mode | Designed to be... | Linux kernel hooks | Connection processing overhead... |
|---|---|---|---|
| iptables | An efficient firewall | NAT pre-routing using sequential rules | Grows proportional to cluster size |
| ipvs | A load balancer with scheduling options like round-robin, shortest-expected delay, least connections, etc. | Optimized lookup routine | Stays constant, independent of cluster size |
iptables와 ipvs의 성능 차이가 궁금하다면, 답은 결코 단순하지 않아요. iptables(Calico 자체의 iptables 사용 포함)와 ipvs 모드의 비교는 kube-proxy 모드 비교: iptables or IPVS?를 참고하세요.
IPVS 모드와 NodePort 범위
kube-proxy IPVS 모드는 NodePort 서비스와 클러스터 IP를 지원해요. Calico도 클러스터로 트래픽을 라우팅할 때 NodePort를 사용하며, 기본 Kubernetes NodePort 범위(30000:32767)도 같아요. Kubernetes에서 기본 NodePort 범위를 바꾼다면, ipvs 커버리지를 유지하려면 Calico에서도 바꿔야 해요.
iptables: mark 비트를 언제 바꾸나
IPVS 모드에서 트래픽을 감시하기 위해, Calico는 각 로컬 Calico 엔드포인트의 ID를 저장하려고 추가 iptables mark 비트를 사용해요. IPVS를 켠 상태에서 호스트당 1,022개 이상의 파드를 실행할 계획이라면, Calico FelixConfiguration의 IptablesMarkMask 파라미터로 mark 비트 크기를 조정해야 할 수 있어요.
Calico는 ipvs 모드를 자동 감지해요
Calico가 kube-proxy가 IPVS 모드로 실행되는 걸 감지하면(설치 중이든 이후든), IPVS 지원이 자동으로 활성화돼요. 감지는 calico-node가 시작될 때 일어나요. 그래서 실행 중인 클러스터에서 kube-proxy의 모드를 바꾸면 calico-node 인스턴스를 재시작해야 해요.
시작하기 전에...
필수
- kube-proxy가 IPVS 모드로 설정되어 있어요
- ipvs 모드의 서비스는 type이 NodePort예요
방법
앞서 말했듯이, IPVS 모드를 사용하기 위해 Calico 쪽에서 할 일은 없어요; 켜져 있으면 모드가 자동 감지돼요. 하지만 기본 Kubernetes NodePort 범위가 바뀌었다면, 다음 안내에 따라 Calico nodeport 범위를 업데이트해서 동기화를 유지하세요. 감지는 calico-node가 시작될 때 일어나요. 그래서 실행 중인 클러스터에서 kube-proxy의 모드를 바꾸면 calico-node 인스턴스를 재시작해야 해요.
Calico 기본 nodeport 범위 바꾸기
FelixConfiguration 리소스에서, Calico의 기본 node port 범위 설정 파라미터(KubeNodePortRange)를 Kubernetes의 새 기본 범위에 맞게 바꾸세요. 도움이 필요하면 FelixConfiguration을 참고하세요.
더 알아보기 (Learn more)
IPVS 모드에서는 Calico가 자동으로 감지·연동되니 기본 설정으로도 대부분 잘 동작해요. NodePort 범위를 바꿀 때만 Kubernetes와 Calico 양쪽을 같이 업데이트하면 돼요. 호스트당 파드 수가 1,022를 넘는다면 IptablesMarkMask를 점검하세요.