聊聊 Calico BGP容器网络实践( 二 )


block/blockSzie: block主要功能是路由聚合,减少对外宣告路由条目 。block在POD所在节点自动创建,如在worker01节点创建1.1.1.1的POD时,blocksize为29 , 则该节点自动创建1.1.1.0/29的block,对外宣告1.1.1.0/29的BGP路由,并且节点下发1.1.1.0/29的黑洞路由和1.1.1.1/32的明细路由 。在IBGP模式下,黑洞路由可避免环路 。如果blockSize设置为32,则不下发黑洞路由也不会造成环路 , 缺点是路由没有聚合,路由表项会比较多,需要考虑交换机路由器的容量 。
Calico创建block时,会出现借用IP的情况 。如在 worker01节点存在1.1.1.0/29的block , 由于worker01节点负载很高 , 地址为1.1.1.2的POD被调度到worker02节点,这种现象为IP借用 。woker02节点会对外宣告1.1.1.2/32的明细路由,在IBGP模式下,交换机需要开启RR模式 , 将路由反射给worker01上,否则在不同worker节点的同一个block的POD,由于黑洞路由的存在 , 导致POD之间网络不通 。可通过ipamconfigs来管理是否允许借用IP(strictAffinity)、每个节点上最多允许创建block的数量(maxBlocksPerHost)等 。
4 BGP模式下路由分析举例说明,创建1.1.1.0/31的地址池,IPPool配置如下:
root@master1:~# calicoctl get ippool ippool-test-0NAMECIDRSELECTORippool-test-01.1.1.0/31all()使用该地址池,创建一个名字为nettool的POD,创建完成后,查看workloadendpoint资源信息 。可查看得到,POD的IP地址为1.1.1.1/32 , 其网络接口对应在worker01节点的网卡为cali200f7a51a47 。
root@master1:~# calicoctl get workloadendpointNAMESPACEWORKLOADNODENETWORKSINTERFACEdefaultnettoolworker011.1.1.1/32cali200f7a51a47进入该容器,查看路由和接口信息 。可查看得到,容器默认路由为169.254.1.1 , 且均指向eth0 。通过ethtool查看得到,eth0接口的peer_ifindex为532 。
root@master1:~# kubectl exec -it nettool shkubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.sh-4.4# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.04: eth0@if532: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group defaultlink/ether 86:61:23:4e:4e:d0 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 1.1.1.1/32 scope global eth0valid_lft forever preferred_lft foreversh-4.4# ip routedefault via 169.254.1.1 dev eth0169.254.1.1 dev eth0 scope linksh-4.4# ethtool -S eth0NIC statistics:peer_ifindex: 532rx_queue_0_xdp_packets: 0rx_queue_0_xdp_bytes: 0rx_queue_0_xdp_drops: 0登录worker01节点,查看index为532的网卡接口,正是该接口cali200f7a51a47 。worker01节点已经配置了ARP代理(主机上网卡不管ARP请求的内容 , 直接将自己的mac地址作为应答的行为称为ARP Proxy) 。Calico把worker01节点当做容器的默认网关使用,所有报文会发送到节点上,节点再根据路由信息进行转发 。
root@worker01:~# ip a |grep 532532: cali200f7a51a47@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group defaultroot@worker01:~# cat /proc/sys/net/ipv4/conf/cali200f7a51a47/proxy_arp1针对回程报文,我们查看节点的1.1.1.1对应路由,也正是该接口cali200f7a51a47 。此时worker01节点的收发报文通路已经明了 。
root@worker01:~# route -n |grep cali200f7a51a471.1.1.10.0.0.0255.255.255.255 UH000 cali200f7a51a47最后,确认下交换机的路由情况 。目的地址为1.1.1.1的下一跳为192.168.1.4,该IP地址是worker01主机IP 。此时POD就可以跟外部进行通信 。
Destination/MaskProtoPreCostFlagsNextHopInterface1.1.1.1/32IBGP2550RD192.168.1.4vlanif100<switch>全栈云探索实践综合考虑微隔离、网路可观测等技术储备已在G行推广使用,Calico默认不开启网络安全策略,依靠微隔离做网络安全管控 。主要考虑BGP和IPAM上设计和管理网络 。
1.BGP配置1) 创建BGPconfigurations配置文件,声明节点的默认AS号 。
root@master1:~# cat bgpconfigurations.yamlapiVersion: crd.projectcalico.org/v1kind: BGPConfigurationmetadata:name: defaultspec:asNumber: 1111111logSeverityScreen: InfonodeToNodeMeshEnabled: false2) 创建BGPPeer , 明确交换机的AS号、BGP Peer IP,并将含有rr-group=rr1 的节点与交换机建立邻居 。
root@master:~# cat bgppper1.yamlapiVersion: crd.projectcalico.org/v1kind: BGPPeermetadata:name: bgp-peer-1spec:asNumber: 1111111nodeSelector: rr-group == 'rr1'peerIP: 192.168.1.1


推荐阅读