CCA — 실리움 인증 어소시에이트 · Gateway API·사이드카 없는 메시·BGP · 이론
BGP Control Plane 과 Egress Gateway — 클러스터 바깥과 이어지는 길
한 줄 요약
BGP Control Plane 은 노드의 파드 CIDR 과 서비스 VIP 를 BGP 로 이웃 라우터에 광고해 바깥에서 클러스터 안으로 들어오는 길을 만들고, Egress Gateway 는 특정 파드가 바깥으로 나갈 때 정해진 노드와 IP 를 거치게 합니다. 둘 다 데이터패스를 프로그래밍하지 않으며, 켜는 조건과 광고 범위에 정확한 제약이 있습니다.
왜 이게 필요했나
파드 IP 는 클러스터 안에서만 통합니다. 바깥 라우터는 파드 CIDR 로 가는 경로를 모르니, 파드에 직접 닿으려면 로드밸런서나 NAT 를 거쳐야 했습니다. LoadBalancer 타입 서비스도 마찬가지로 누군가 그 IP 를 라우터에 알려 줘야 합니다. 온프레미스나 BGP 를 쓰는 환경에서는 노드가 직접 BGP 스피커가 되어 경로를 광고하는 것이 가장 단순한 답이고, Cilium 은 그것을 agent 안에 넣었습니다.
반대 방향의 문제도 있습니다. 파드 IP 는 계속 바뀌고 노드 IP 도 바뀌는데, 옛 방화벽은 "이 IP 에서 오는 것만 허용" 으로 동작합니다. 문서는 Egress Gateway 의 용도를 정확히 이 사례로 설명합니다. 특정 네임스페이스의 파드가 옛 인프라로 나갈 때 예측 가능한 IP 로 나가게 하는 것입니다. CCA 의 BGP & External Networking 도메인(6%)은 이 두 기능의 역할과 제약을 묻습니다.
어떻게 동작하나
BGP Control Plane 이 하는 일과 하지 않는 일
문서의 첫 문장이 범위를 정합니다. BGP Control Plane 은 BGP 로 연결된 라우터에 경로를 광고해 파드 네트워크와 서비스를 클러스터 바깥에서 닿게 합니다. 그리고 "데이터패스를 프로그래밍하지 않으므로 클러스터 안의 도달성을 위해 쓰지 말라" 고 명시합니다. 켜는 방법은 bgpControlPlane.enabled=true 이고, agent 가 설정된 주소 계열만 광고합니다. IPv4 만 쓰도록 설정된 agent 는 IPv6 경로를 광고할 수 없습니다.
네 가지 리소스
| 리소스 | 역할 |
| --- | --- |
| CiliumBGPClusterConfig | nodeSelector 로 고른 노드들에 적용할 BGP 인스턴스(localASN)와 피어(peerASN, peerAddress, peerConfigRef) |
| CiliumBGPPeerConfig | 여러 피어가 공유하는 세션 설정 — 타이머, MD5 인증, eBGP multihop, graceful restart, transport, 주소 계열과 광고 선택자 |
| CiliumBGPAdvertisement | 라우팅 테이블에 넣을 프리픽스 종류와 속성(community, localPreference) |
| CiliumBGPNodeConfigOverride | 노드별로 다르게 줄 값 |
apiVersion: cilium.io/v2kind: CiliumBGPClusterConfigmetadata: {name: cilium-bgp}spec: nodeSelector: {matchLabels: {rack: rack0}} bgpInstances: - name: instance-65000 localASN: 65000 peers: - name: peer-65000-tor1 peerASN: 65000 peerAddress: fd00:10:0:0::1 peerConfigRef: {name: cilium-peer}---apiVersion: cilium.io/v2kind: CiliumBGPAdvertisementmetadata: {name: bgp-advertisements, labels: {advertise: bgp}}spec: advertisements: - advertisementType: PodCIDR - advertisementType: Service service: {addresses: [LoadBalancerIP]} selector: {matchExpressions: [{key: bgp, operator: In, values: [blue]}]}PeerConfig 의 families[].advertisements 는 라벨 선택자입니다. 위 예시의 advertise: bgp 라벨이 그 선택자에 맞아야 광고가 실제로 나갑니다. 리소스를 다 만들었는데 아무것도 광고되지 않는다면 이 라벨을 먼저 봅니다.
기본 동작에서 자주 틀리는 것
세 가지를 문서에서 그대로 옮깁니다. 첫째, BGP 인스턴스는 기본으로 수신 포트 없이 뜹니다. 같은 노드에서 Bird 같은 다른 BGP 라우터가 돌 수 있도록 한 설계라서, Cilium 은 연결을 시작만 하고 받지는 않습니다. 받아야 하면 localPort 를 주는데, 179 번은 CAP_NET_BIND_SERVICE 가 필요합니다. 둘째, 타이머 기본값은 connectRetry 120초, hold 90초, keepalive 30초이고, 데이터센터에서는 hold 9초·keepalive 3초처럼 낮추라고 권합니다. 셋째, graceful restart 를 켜면 agent 가 재시작해도 피어가 경로를 바로 거두지 않아 데이터패스가 계속 전달합니다. 기본 RestartTime 은 120초입니다.
무엇을 광고하는가
PodCIDR 광고는 그 노드에 할당된 파드 CIDR 을 광고하지 전체 범위를 광고하지 않습니다. 이것은 Kubernetes 또는 ClusterPool IPAM 에서만 동작하고, MultiPool IPAM 에서는 CiliumPodIPPool 타입으로 풀을 선택자로 골라 광고합니다. 다른 IPAM 에서는 PodCIDR 타입이 아무 효과가 없습니다. 서비스 광고는 service.addresses 에 LoadBalancerIP·ClusterIP·ExternalIP 를 골라 넣으며, VIP 는 정확한 /32 또는 /128 경로로 나갑니다. 같은 VIP 를 여러 노드가 광고하면 상류 라우터가 ECMP 로 부하를 나누는데, 라우터의 ECMP 경로 수 상한을 넘을 수 있으니 네트워크 담당자와 먼저 확인하라는 경고가 붙어 있습니다. 세션 상태는 cilium bgp peers 로 봅니다.
Egress Gateway — 나가는 길을 고정한다
Egress Gateway 는 파드에서 특정 클러스터 외부 CIDR 로 가는 IPv4·IPv6 연결을 지정한 게이트웨이 노드로 보내고, 그 노드의 예측 가능한 IP 로 마스커레이드합니다. 켜려면 egressGateway.enabled=true 와 함께 BPF 마스커레이드와 kube-proxy 대체가 모두 켜져 있어야 합니다. 정책 리소스는 클러스터 범위인 CiliumEgressGatewayPolicy 이고, selectors[].podSelector 로 원본 파드를(네임스페이스는 io.kubernetes.pod.namespace 라벨로), destinationCIDRs 로 목적지를, excludedCIDRs 로 예외를 적습니다. 내부 클러스터 IP(파드·노드·API 서버)는 목적지 범위에 들어 있어도 SNAT 대상에서 제외됩니다.
제약도 명확합니다. 새 파드에는 정책이 적용되기까지 지연이 있어 그동안은 파드 IP 나 노드 IP 로 나갈 수 있고, Cluster Mesh 와 함께 쓸 수 없으며, 아이덴티티 저장을 kvstore 로 둔 모드와 CiliumEndpointSlice 와도 호환되지 않습니다.
현장에서 만나는 모습
BGP 세션이 established 인데 서비스에 닿지 않는 경우, 대개 광고 선택자 라벨이 어긋나 있거나 광고한 VIP 가 ExternalIP 인데 kube-proxy 대체 쪽에서 ExternalIP 지원을 켜지 않은 경우입니다. 문서는 ExternalIP 를 kubeProxyReplacement 와 함께 쓰려면 ExternalIP 지원을 켜라고 따로 적습니다. 반대로 세션 자체가 안 맺히면 MD5 비밀번호를 의심할 만합니다. 잘못된 비밀번호는 명확한 오류가 아니라 dial: i/o timeout 으로만 나타나고, 참조한 시크릿이 없으면 빈 비밀번호로 세션을 시도하며 로그에 오류를 남깁니다.
Egress Gateway 는 켠 직후 "일부 요청이 여전히 노드 IP 로 나간다" 는 보고가 오는데, 새로 뜬 파드에 정책이 붙기까지의 지연이 원인인 경우가 많습니다. 방화벽 쪽에서 게이트웨이 IP 만 허용했다면 그 짧은 구간의 요청이 거부됩니다.
다음 퀴즈에서 확인할 것
Gateway API 리소스의 역할과 트래픽 분할 필드, Cilium 이 다른 컨트롤러와 다른 지점(eBPF 가로채기, ingress 아이덴티티), 노드당 Envoy 구조, WireGuard 의 키 배포와 포트, BGP 네 리소스의 역할, PodCIDR 광고 범위와 VIP 경로 길이, 수신 포트 기본값, Egress Gateway 의 전제 조건을 묻습니다. 참고: [Cilium BGP Control Plane](https://docs.cilium.io/en/stable/network/bgp-control-plane/bgp-control-plane/), [BGP Control Plane Resources](https://docs.cilium.io/en/stable/network/bgp-control-plane/bgp-control-plane-configuration/), [Egress Gateway](https://docs.cilium.io/en/stable/network/egress-gateway/egress-gateway/).