Kube-Proxy와 CNI: 쿠버네티스 네트워킹의 핵심
Source: Dev.to
Overview
Kubernetes 네트워킹은 간단해 보입니다: 각 Pod는 고유한 IP 주소를 받고, Service는 자동으로 트래픽을 적절한 Pod로 라우팅합니다. 이 단순함은 두 핵심 구성 요소에 의해 구현됩니다:
- Container Network Interface (CNI)
- kube-proxy
이 두 요소가 IP 할당, 네트워크 인터페이스 설정, 라우팅, 그리고 클러스터 전반에 걸친 서비스 로드밸런싱을 담당합니다.
kube-proxy
kube-proxy는 Service IP와 포트를 실제 Pod 엔드포인트로 변환하여 Service가 동작하도록 합니다.
- Service IP 안정성 – kube-proxy는 Service IP가 기본 Pod가 일시적이라도 안정적인 엔드포인트로 유지되도록 보장합니다.
- 라우팅 규칙 생성 – Service 또는 그 엔드포인트가 생성될 때, kube-proxy는 노드에 iptables 또는 IPVS 규칙을 설치해 Service IP에서 해당 Pod로 트래픽을 전달합니다.
- 동적 업데이트 – Service를 지원하는 Pod가 추가되거나 제거되면, kube-proxy는 커널 규칙을 업데이트하여 서비스 가용성을 유지합니다.
- 로드 분산 – 커널 네트워킹(iptables 또는 IPVS)을 활용해 kube-proxy는 들어오는 트래픽을 Service를 구현하는 여러 Pod에 분산시킵니다.
- kube-proxy가 없을 경우 – Service IP는 존재하지만 Pod로 트래픽을 전달하지 못합니다; kube-proxy가 Service IP와 포트를 실제 Pod 엔드포인트에 연결합니다.
Container Network Interface (CNI)
CNI 플러그인은 Pod 수준의 네트워킹을 담당하여 Pod가 노드 내부 및 노드 간에 통신할 수 있게 합니다.
- IP 할당 – 각 Pod는 클러스터 IP 풀에서 고유한 IP 주소를 받습니다.
- 인터페이스 생성 – CNI는 Pod를 위해 veth 페어를 만들고, 한쪽 끝을 Pod의 네트워크 네임스페이스에, 다른 쪽 끝을 호스트에 배치합니다.
- 라우팅 구성 – CNI는 라우팅 규칙을 설정해 Pod가 다른 노드에 있는 Pod와 통신할 수 있도록 하며, 일반적으로 호스트 라우팅 테이블이나 오버레이 네트워크를 구성합니다.
- 네트워크 격리 – 네임스페이스와 인터페이스를 관리함으로써 CNI는 Pod 간 격리를 보장하면서도 필요에 따라 통신할 수 있게 합니다.
이 두 구성 요소—Service 라우팅을 담당하는 kube-proxy와 Pod 네트워킹을 담당하는 CNI—가 Kubernetes 네트워킹의 핵심을 이루며, 전체 클러스터에 걸친 원활한 통신을 가능하게 합니다.