How to find out what podcidr is assigned to each node by calico CNI in kubernetes

3.3k views Asked by At

Is there any direct command to fetch the podcidr assigned to each node when using calico CNI.

I am looking for exact network and netmask assigned to each node. I am not able to fetch it from kubectl get nodes neither via podCIDR value nor via projectcalico.org/IPv4VXLANTunnelAddr annotation. Also looks like the annotation will also differ based on VXLAN or IPIP tunnel used by calico.

Tried to fetch via podCIDR key from nodes. Got the following output. Which wasn't the network assigned to the nodes.

kubectl get nodes -oyaml | grep -i podcidr -B 1
  spec:
    podCIDR: 192.168.0.0/24
    podCIDRs:
--
  spec:
    podCIDR: 192.168.2.0/24
    podCIDRs:

Tried to fetch it via calico annotation. Was able to find the network but the netmask was missing.

kubectl get nodes -oyaml | grep -i ipv4vxlan
      projectcalico.org/IPv4VXLANTunnelAddr: 192.168.33.64
      projectcalico.org/IPv4VXLANTunnelAddr: 192.168.253.192

Tried to fetch it via calico pod. Found the exact network and netmask i.e 192.168.33.64/26 from the calico log.

kubectl logs calico-node-h2s9w   -n calico-system | grep cidr
2020-12-14 06:54:50.783 [INFO][18] tunnel-ip-allocator/ipam.go 140:
Attempting to load block cidr=192.168.33.64/26 host="calico-master"

But i want to avoid looking at logs of calico pod on each node. Is there a better way to find the podcidr assigned to each node via a single command.

2

There are 2 answers

0
apoorva kamath On BEST ANSWER

Looks like calico adds a custom resource called ipamblocks and it contains the podcidr assigned to each cluster node.

The name of the custom resource itself contains the node's podcidr.

kubectl get ipamblocks.crd.projectcalico.org 
NAME               AGE
10-42-123-0-26     89d
10-42-187-192-26   89d

Command to fetch the exact podcidr and nodeip:

kubectl get ipamblocks.crd.projectcalico.org -o jsonpath="{range .items[*]}{'podNetwork: '}{.spec.cidr}{'\t NodeIP: '}{.spec.affinity}{'\n'}"
podNetwork: 10.42.123.0/26   NodeIP: host:<node1-ip>
podNetwork: 10.42.187.192/26     NodeIP: host:<node2-ip>
4
Arghya Sadhu On

You can use etcdctl to know details of subnet block assigned to each node.

ETCDCTL_API=3 etcdctl ls /calico/ipam/v2/host/node1/ipv4/block/

Above example for a node node1 will give something like below as output.

/calico/ipam/v2/host/node1/ipv4/block/192.168.228.192-26