라우팅
라우팅 (Routing)
Cilium의 데이터패스는 트래픽을 어떻게 전달할지에 따라 여러 라우팅 모드를 지원해요. 설정이 없으면 자동으로 동작하는 Encapsulation(터널링) 모드와, 네트워크의 라우팅 능력을 활용하는 Native-Routing 모드, 그리고 AWS ENI·Google Cloud 전용 데이터패스를 이 글에서 살펴볼게요.
출처: Routing
본문
Encapsulation
구성이 제공되지 않으면 Cilium은 이 모드로 자동 실행됩니다. 기반 네트워킹 인프라에 대한 요구사항이 가장 적은 모드이기 때문이에요.
이 모드에서 모든 클러스터 노드는 UDP 기반 캡슐화 프로토콜인 VXLAN 또는 Geneve를 사용해 터널 메시를 형성합니다. Cilium 노드 사이의 모든 트래픽은 캡슐화됩니다.
네트워크에 대한 요구사항
Encapsulation은 일반적인 노드 간 연결에 의존합니다. 즉 Cilium 노드가 이미 서로 도달할 수 있다면 모든 라우팅 요구사항이 이미 충족된 것입니다.
기반 네트워크와 방화벽은 캡슐화된 패킷을 허용해야 합니다:
| Encapsulation Mode | Port Range / Protocol |
|---|---|
| VXLAN (Default) | 8472/UDP |
| Geneve | 6081/UDP |
모델의 장점
- 단순함: 클러스터 노드를 연결하는 네트워크는 PodCIDR을 알 필요가 없습니다. 클러스터 노드는 여러 라우팅 또는 링크 계층 도메인을 만들 수 있어요. 클러스터 노드가 IP/UDP로 서로 도달할 수 있는 한 기반 네트워크의 토폴로지는 무관합니다.
- 주소 공간: 기반 네트워킹 제한에 의존하지 않기 때문에 사용 가능한 주소 공간이 잠재적으로 훨씬 크며, PodCIDR 크기를 적절히 구성하면 노드당 원하는 수의 Pod를 실행할 수 있어요.
- 자동 구성: Kubernetes 같은 오케스트레이션 시스템과 함께 실행할 때, 할당 접두사 노드를 포함한 클러스터의 모든 노드 목록이 각 에이전트에 자동으로 제공됩니다. 클러스터에 합류하는 새 노드는 자동으로 메시에 통합됩니다.
- 아이덴티티 컨텍스트: 캡슐화 프로토콜은 네트워크 패킷과 함께 메타데이터를 전달할 수 있습니다. Cilium은 네트워크 패킷과 함께 메타데이터를 전달할 수 있는 이 능력을 사용해 소스 보안 아이덴티티 같은 메타데이터를 전송합니다. 아이덴티티 전송은 원격 노드에서 아이덴티티 조회를 한 번 피하도록 설계된 최적화입니다.
모델의 단점
- MTU 오버헤드: 캡슐화 헤더를 추가하기 때문에 페이로드에 사용 가능한 유효 MTU가 네이티브 라우팅보다 낮습니다(VXLAN의 경우 네트워크 패킷당 50 바이트). 이는 특정 네트워크 연결의 최대 처리량을 낮춥니다. 점보 프레임을 활성화하면(1500 바이트마다 50 바이트 오버헤드 vs 9000 바이트마다 50 바이트 오버헤드) 크게 완화할 수 있어요.
구성
다음 옵션으로 캡슐화를 구성할 수 있어요:
tunnel-protocol: 캡슐화 프로토콜을vxlan또는geneve로 설정합니다. 기본값은vxlan예요.underlay-protocol: 언더레이의 IP 패밀리를 설정합니다. 기본값은auto로, Cilium은 데몬 구성을 기반으로 적절한 언더레이 프로토콜을 자동 선택하며 IPv4와 IPv6가 모두 활성화된 경우 IPv4를 우선합니다. 기반 네트워크가 해당 프로토콜을 지원해야 해요.tunnel-port: 캡슐화 프로토콜의 포트를 설정합니다.vxlan의 기본값은8472,geneve의 기본값은6081입니다.
Native-Routing
네이티브 라우팅 데이터패스는 routing-mode: native 로 활성화되며 네이티브 패킷 전달 모드를 켭니다. 네이티브 패킷 전달 모드는 캡슐화를 수행하는 대신 Cilium이 실행되는 네트워크의 라우팅 능력을 활용합니다.
네이티브 라우팅 모드에서 Cilium은 다른 로컬 엔드포인트로 주소가 지정되지 않은 모든 패킷을 Linux 커널의 라우팅 서브시스템에 위임합니다. 이는 패킷이 마치 로컬 프로세스가 발신한 것처럼 라우팅된다는 뜻이에요. 결과적으로 클러스터 노드를 연결하는 네트워크는 PodCIDR을 라우팅할 수 있어야 합니다.
Cilium은 네이티브 라우팅을 구성할 때 Linux 커널에서 IP 포워딩을 자동으로 활성화합니다.
네트워크에 대한 요구사항
네이티브 라우팅 모드를 실행하려면 Cilium이 실행되는 호스트를 연결하는 네트워크가 Pod나 다른 작업 부하에 주어진 주소를 사용해 IP 트래픽을 포워딩할 수 있어야 합니다.
노드의 Linux 커널은 Cilium을 실행하는 모든 노드의 Pod 또는 다른 작업 부하의 패킷을 어떻게 포워딩할지 알고 있어야 합니다. 이는 두 가지 방법으로 달성할 수 있어요:
- 노드 자체는 모든 Pod IP를 라우팅하는 방법을 모르지만, 네트워크에 다른 모든 Pod에 도달하는 방법을 아는 라우터가 존재합니다. 이 시나리오에서 Linux 노드는 기본 경로가 그런 라우터를 가리키도록 구성됩니다. 이 모델은 클라우드 제공자 네트워크 통합에 사용됩니다. 자세한 내용은 Google Cloud, AWS ENI, Azure IPAM을 참고하세요.
- 각 개별 노드는 다른 모든 노드의 모든 Pod IP를 인식하고 이를 나타내는 경로를 Linux 커널 라우팅 테이블에 삽입합니다. 모든 노드가 단일 L2 네트워크를 공유한다면
auto-direct-node-routes: true옵션을 활성화해 처리할 수 있어요. 그렇지 않으면 경로를 배포할 BGP 데몬 같은 추가 시스템 구성 요소를 실행해야 합니다. kube-router 프로젝트로 이를 달성하는 방법은 Kube-Router로 BGP 실행하기 (deprecated) 가이드를 참고하세요.
구성
네이티브 라우팅 모드로 데이터패스를 실행하려면 다음 구성 옵션을 설정해야 합니다:
routing-mode: native: 네이티브 라우팅 모드를 활성화합니다.ipv4-native-routing-cidr: x.x.x.x/y: 네이티브 라우팅이 수행될 수 있는 CIDR을 설정합니다.
네이티브 라우팅 모드로 데이터패스를 실행할 때 다음 구성 옵션은 선택 사항입니다:
direct-routing-skip-unreachable: BGP 데몬이 실행 중이고 클러스터 네트워크에 여러 네이티브 서브넷이 있으면,auto-direct-node-routes와 함께direct-routing-skip-unreachable: true를 추가해 트래픽이 항상 BGP 라우터로 라우팅될 필요 없이 각 영역에서 각 노드에 L2 연결을 줄 수 있어요.
AWS ENI
AWS ENI 데이터패스는 Cilium을 --ipam=eni 옵션으로 실행할 때 활성화됩니다. AWS 환경에서 Cilium을 실행할 때 유용한 특수 목적 데이터패스예요.
모델의 장점
- Pod는 AWS VPC에서 직접 라우팅 가능한 ENI IP를 할당받습니다. 이는 VPC 내에서 Pod 트래픽 통신을 단순화하고 SNAT의 필요성을 피합니다.
- Pod IP에는 보안 그룹이 할당됩니다. Pod용 보안 그룹은 노드별로 구성되므로 노드 풀을 만들고 다른 Pod에 다른 보안 그룹 할당을 줄 수 있어요. 자세한 내용은 AWS ENI 섹션을 참고하세요.
모델의 단점
- 인스턴스당 ENI IP 수는 제한됩니다. 제한은 EC2 인스턴스 유형에 따라 다르며, 매우 작은 인스턴스 유형에서 더 많은 수의 Pod를 실행하려 할 때 문제가 될 수 있어요.
- ENI 및 ENI IP 할당은 속도 제한이 적용되는 EC2 API와의 상호 작용이 필요합니다. 이는 주로 operator 설계를 통해 완화되며, 자세한 내용은 AWS ENI 섹션을 참고하세요.
아키텍처
Ingress
트래픽은 인스턴스에 연결된 ENI 중 하나에서 수신되며, 노드에서는 ethN 인터페이스로 표시됩니다.
모든 로컬 Pod IP에 대한 트래픽이 기본 라우팅 테이블로 처리되도록 IP 라우팅 규칙이 보장합니다:
20: from all to 192.168.105.44 lookup main
기본 라우팅 테이블은 Pod에 연결된 veth 쌍으로 트래픽을 안내하는 정확한 일치 경로를 포함합니다:
192.168.105.44 dev lxc5a4def8d96c5
lxc5a4def8d96c5 를 통과하는 모든 트래픽은 Pod로 들어가는 도중 네트워크 정책을 적용하고, 서비스 역방향 로드 밸런싱을 제공하며, 가시성을 확보하기 위해 Cilium의 eBPF 프로그램의 적용을 받습니다.
Egress
Pod의 네트워크 네임스페이스는 Pod 내부에서 eth0 , 호스트 네임스페이스에서 lxcXXXXXX 라는 이름의 veth 쌍을 통해 노드의 라우터 IP를 가리키는 기본 경로를 포함합니다. 라우터 IP는 ENI 공간에서 할당되므로 Path MTU 목적으로 라우터 IP에서 ICMP 오류를 보낼 수 있어요.
veth 쌍을 통과한 후 Linux 라우팅 계층에 도달하기 전에 모든 트래픽은 네트워크 정책을 적용하고, 로드 밸런싱을 구현하며, 네트워킹 기능을 제공하는 Cilium의 eBPF 프로그램의 적용을 받습니다.
개별 엔드포인트의 트래픽이 엔드포인트 IP가 할당된 ENI 특유의 라우팅 테이블을 사용하도록 IP 라우팅 규칙이 보장합니다:
30: from 192.168.105.44 to 192.168.0.0/16 lookup 92
ENI 특유의 라우팅 테이블은 ENI 인터페이스를 통해 VPC의 라우터로 리다이렉트하는 기본 경로를 포함합니다:
default via 192.168.0.1 dev eth2
192.168.0.1 dev eth2
구성
AWS ENI 데이터패스는 다음 옵션을 설정해 활성화됩니다:
ipam: eni
enable-endpoint-routes: "true"
auto-create-cilium-node-resource: "true"
egress-masquerade-interfaces: eth+
ipam: eni는 ENI 특유의 IPAM 백엔드를 활성화하고 데이터패스에 ENI IP가 사용될 것임을 알립니다.enable-endpoint-routes: "true"는cilium_host인터페이스를 거쳐 라우팅할 필요 없이 ENI veth 쌍으로 직접 라우팅을 활성화합니다.auto-create-cilium-node-resource: "true"는 필요한 모든 ENI 매개변수로CiliumNode사용자 지정 리소스를 자동 생성합니다. 비활성화하고 수동으로 사용자 지정 리소스를 제공할 수도 있어요.egress-masquerade-interfaces: eth+는 마스커레이드의 적용 대상이 되는 모든 인터페이스의 인터페이스 셀렉터입니다.enable-ipv4-masquerade: "false"로 마스커레이드를 완전히 비활성화할 수 있어요.
ENI IPAM 특유의 매개변수 구성 방법은 AWS ENI 섹션을 참고하세요.
Google Cloud
Google Kubernetes Engine (GKE) 또는 자체 관리 방식으로 Cilium을 Google Cloud에서 실행할 때, Google Cloud의 네트워킹 계층을 Native-Routing 구성으로 실행되는 Cilium과 함께 활용할 수 있습니다. 이는 추가 캡슐화 없이 네이티브 네트워킹 성능을 제공하면서도 정책 적용, DSR을 사용한 로드 밸런싱, 효율적인 NodePort/ExternalIP/HostPort 구현, 광범위한 가시성 기능 같은 많은 추가 Cilium 기능의 이점을 누립니다.
- 주소 지정: Cilium은 특정 Kubernetes 노드에 할당된 PodCIDR에서 Pod에 IP를 할당합니다. Alias IP 범위를 사용하면 이 IP들은 추가 캡슐화나 경로 배포 없이 Google Cloud 네트워크에서 네이티브로 라우팅 가능합니다.
- 마스커레이딩:
ipv4-native-routing-cidr안에 머무르지 않는 모든 트래픽은 공개적으로 라우팅 가능하도록 노드의 IP 주소로 마스커레이드됩니다. - 로드 밸런싱: ClusterIP 로드 밸런싱은 모든 GKE 버전에서 eBPF를 사용해 수행됩니다.
- 정책 적용 & 가시성: 모든 NetworkPolicy 적용과 가시성은 eBPF를 사용해 제공됩니다.
구성
GKE에서 데이터패스를 실행하려면 다음 구성 옵션을 설정해야 합니다:
gke.enabled: true: Google Kubernetes Engine (GKE) 데이터패스를 활성화합니다.true로 설정하면 다음 옵션이 활성화됩니다:ipam: kubernetes: Kubernetes Host Scope IPAM 활성화routing-mode: native: 네이티브 라우팅 모드 활성화enable-endpoint-routes: true: 노드에서 엔드포인트별 라우팅 활성화 (로컬 노드 경로 자동 비활성화)ipv4-native-routing-cidr: x.x.x.x/y: 네이티브 라우팅이 지원되는 CIDR 설정
Google Kubernetes Engine (GKE)에 Cilium을 설치하는 방법은 Cilium Quick Installation 시작 가이드를 참고하세요.