East West Switching With Calico Using BGP Route Reflector

Recently I was part of the lab proof of concept as a practical learning experience to evaluate the East West switching in a Kubernetes infrastructure where we had tested 3 conditions.

  • Internode communication with VXLAN
  • Internode communication with IPIP
  • Internode communication using BGP.
Mode Mechanism Encapsulation Best For Overhead (bytes)
IPIP IP packets inside another IP packet (Protocol 4) Yes (lightweight) Private/baremetal clusters ~20 bytes
VXLAN IP packets inside UDP packets (UDP 4789) Yes (heavy) Public cloud (AWS, GCP, Azure) or complex networks ~50 bytes
BGP Native Routing Advertise pod CIDRs over BGP between nodes No High-performance clusters, advanced networking (Telecom networks) 0 bytes

In this blog we will focus on BGP implementation in large scale telecom networks and talk about our lab implementation. BGP Peering Between Kubernetes Nodes is Default in Calico. In a Calico cluster without Route Reflectors (RRs),Every node establishes a BGP session with every other node. The formula for calculating peering session is

Total Sessions=n×(n1)/2

Why Use a Route Reflector (RR)

By default, Calico establishes a full-mesh BGP — meaning each node peers with every other node. The number of peering sessions grows rapidly:

To scale better:

  • Introduce a Route Reflector (RR).

  • Nodes peer only with the RR, not with each other.

  • RR redistributes routes across the cluster.

This dramatically reduces BGP session complexity.

Calico is a popular Container Network Interface (CNI) plugin for Kubernetes. OpenShift uses OVN-Kubernetes as default CNI , but we install Calico manually for telecom grade large clusters where tight performance is requirements.

Calico provides network connectivity for pods and also supports network security policies.

  • Unlike some other CNIs, Calico uses pure Layer 3 (routing-based) networking — no overlay like VXLAN, unless you explicitly enable it. It can integrate directly with the underlay network making it very high performance and simple. A Route Reflector (RR) is a special node that acts like a BGP hub.
  • Instead of full mesh peering, nodes only peer with RR.
  • RR receives routes from all nodes, and reflects (redistributes) them to other nodes.

In Kubernetes clusters using Calico, each pod is assigned a unique /32 IP address, and all nodes keep track of the pod IPs running across the cluster. When a pod on Node A needs to communicate with a pod on Node B, the Calico agent on Node A checks the destination IP and uses the routing table to figure out the next hop — which is simply Node B’s host IP. The traffic is sent directly over the network without any VXLAN or IP-in-IP encapsulation by default, keeping things simple and efficient. When the packet reaches Node B, its Calico agent delivers it straight to the correct pod. To make this all seamless, Calico uses BGP (Border Gateway Protocol) between nodes: each node advertises the pod IPs it manages, and nodes share this information with each other using a BGP daemon like BIRD or GoBGP. As a result, routing tables across the cluster are dynamically updated, so every node knows exactly where each pod lives. In bare-metal environments, this direct BGP peering makes pod-to-pod communication super-fast, with minimal latency and no need for an overlay network — unless your setup specifically requires it. This is ideally best for telecom networks.

The below diagram depicts the connection between worker nodes and the Cisco router .

Our Cisco IOS router configuration is simple and straight forward.

! Configure router BGP process
router bgp 64512
bgp log-neighbor-changes
! Make this router a Route Reflector
bgp cluster-id 1
! Calico Node A Peering
neighbor 192.168.1.10 remote-as 64512
neighbor 192.168.1.10 route-reflector-client
! Calico Node B Peering
neighbor 192.168.1.11 remote-as 64512
neighbor 192.168.1.11 route-reflector-client
! Calico Node C Peering
neighbor 192.168.1.12 remote-as 64512
neighbor 192.168.1.12 route-reflector-client
! Optional tuning
timers bgp 10 30


address-family ipv4
neighbor 192.168.1.10 activate
neighbor 192.168.1.11 activate
neighbor 192.168.1.12 activate
exit-address-family
Command Purpose
router bgp 64512 Enable BGP with AS 64512
bgp cluster-id 1 Set Cluster ID (RR requirement)
neighbor X.X.X.X remote-as 64512 Define Calico node peers (same AS)
neighbor X.X.X.X route-reflector-client Mark them as RR clients
address-family ipv4 + activate Activate BGP IPv4 address family

Manifest file calico-external-rr.yaml

# Disable node-to-node mesh (Important: else nodes will also peer with each other)

apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
asNumber: 64512
nodeToNodeMeshEnabled: false

# Peering all Calico nodes to external Route Reflector (Cisco Router)

apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: peer-to-external-rr
spec:
peerIP: 192.168.1.1 # IP address of Cisco Router RR
asNumber: 64512 # Same AS Number as the Router and Nodes
nodeSelector: all() # Apply to all Kubernetes nodes
kubectl apply -f calico-external-rr.yaml

All nodes have single BGP session to external router. Native Pod IP routing — no overlay. Highly scalable to thousands of nodes.

We have to use calicoctl to Check Calico BGP Peering. calicoctl is the command-line tool to interact with Calico resources. It can show BGP peering status, IP Pool configs, Node info, etc. It talks directly to the Calico datastore (Kubernetes API server or etcd).

Here are the steps to install calicoctl

curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.27.0/calicoctl
chmod +x calicoctl
sudo mv calicoctl /usr/local/bin/

Set Up Access. Create a config file /etc/calico/calicoctl.cfg

apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
datastoreType: "kubernetes"
kubeconfig: "/etc/kubernetes/admin.conf"
export CALICOCTL_CFG_FILE=/etc/calico/calicoctl.cfg
calicoctl node status
+--------------+----------------+-------------+

| PEER ADDRESS | PEER TYPE | STATE |

+--------------+----------------+-------------+

| 192.168.1.1 | Global peer | Established |

+--------------+----------------+-------------+

Conclusion

Using Calico BGP native routing for Kubernetes clusters, especially when paired with an external Route Reflector like a Cisco router, provides a highly scalable, overlay-free, and telecom-grade performance solution for pod networking.
This setup is particularly ideal for large bare-metal Kubernetes/OpenShift deployments in the telecom industry, where every microsecond of network efficiency counts.

Leave a Reply

Your email address will not be published.