Calico在K8S中的几种BGP配置模式
在了解Calico K8S BGP之前,需要了解Calico的几种网络模式,以及哪些网络网络模式适合使用BGP
1.Calico在k8s中的几种网络模式
1.1.VXLANCrossSubnet模式
VXLANCrossSubnet的解释
- 定义:当Pod位于不同的子网时,使用VXLAN(Virtual Extensible LAN)隧道模式进行通信
- 原理:源节点上的VTEP(VXLAN Tunnel Endpoint)将Pod发出的以太网帧封装在VXLAN报文中,并通过三层网络传输到目标节点的VTEP。目标节点的VTEP解封报文并将原始的以太网帧转发给目标Pod
- 优势:能够跨越不同的三层网络(如不同的子网或VLAN)实现Pod之间的通信
- 缺点:增加网络传输的开销,因为每个以太网帧都需要额外的封装和解封过程。
- 场景:VXLANCrossSubnet主要适用于需要跨越多个数据中心、需要实现网络和业务维护自动化、多租户环境下二层互联、以及需要跨越IP网络基础设施和第2层网络的场景
1.2.CrossSubnet模式
CrossSubnet的解释
如果需要将Caclico设置成BGP模式,需要将ipipMode设置为Never
- 定义:当Pod跨子网通信时,使用IPIP(IP-in-IP)隧道模式。
- 原理:将一个IP数据包套在另一个IP包里,使用Linux提供的隧道技术。可以理解为一个基于IP层的网桥,将两个本不通的网络通过点对点连接起来。
- 性能:由于IPIP隧道封包解包的过程,会有一定的性能损失。
- 场景:在宿主机网络不完全支持BGP路由协议时,作为一种妥协的overlay机制。
1.3.ipipMode模式
ipipMode的解释
在k8s环境内,如果calico插件使用的网络模式为ipipMode,其本身不支持BGP,如果Caclico需要设置成BGP模式,需要将ipipMode设置为Never
- 定义:始终使用IPIP隧道模式,无论Pod是否位于同一子网。
- 影响:由于始终使用IPIP隧道,即使Pod位于同一子网,也会带来额外的封装和解封开销,从而影响性能。
- 场景:在需要强制使用IPIP隧道模式的场景中,例如某些特定的网络环境或安全策略要求。
2.Calico在k8s中的几种BGP模式
2.1.Full-mesh (全互联模式)
启用 BGP 后,Calico 的默认行为是创建完整的内部 BGP (iBGP)连接,其中每个节点相互对等。这允许 Calico 在任何 L2 网络上运行,无论是公有云还是私有云
全网格非常适合 100 个或更少的中小型部署,但在更大的规模下,Full-mesh的效率会降低,官方建议使用路由反射模式。
2.2.Route reflectors (路由器反射模式)
若要构建内部BGP(iBGP)的大型集群,可以使用 BGP 路由反射器来减少每个节点上使用的 BGP 对等互连数。在此模型中,一些节点充当路由反射器,并配置为在它们之间建立Full-mesh模式。然后,将其他节点配置为与这些路由反射器的子集(通常为2 个用于冗余)对等互连,与Full-mesh模式相比,减少了BGP对等连接的总数。
2.3.Top of Rack(物理边缘路由器)
- 在使用Top of Rack模式时,可考虑与路由器反射模式一起使用
在本地部署中,可以将 Calico 配置为直接与物理网络基础结构对等互连。通常,这涉及禁用 Calico 的默认Full-mesh模式,而是将 Calico与L3 Top of Rack 路由器对等。构建本地 BGP 网络的方法有很多种。如何配置 BGP 由您决定 - Calico 适用于 iBGP 和 eBGP 配置,您可以有效地将 Calico 视为网络设计中的任何其他路由器。
3.Calico中的Full-mesh样例
3.1. Full-mesh模式查询
Calico默认配置模式下,Full-mesh模式为开启状态,节点和节点之间使用BGP协议进行互联
- 样例分析
root@master:~/calico/v3.26.4# calicoctl node status
Calico process is running.
IPv4 BGP status
+--------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+-------------------+-------+----------+-------------+
| 10.22.4.12 | node-to-node mesh | up | 07:58:12 | Established |
| 10.22.4.13 | node-to-node mesh | up | 07:58:12 | Established |
+--------------+-------------------+-------+----------+-------------+
IPv6 BGP status
No IPv6 peers found.
root@master:~/calico/v3.26.4#
# 默认情况下calico bgp的as号为64512
root@master:~/calico/v3.26.4# calicoctl get nodes -o wide
NAME ASN IPV4 IPV6
master.sec.lab (64512) 10.22.4.11/24
node01.sec.lab (64512) 10.22.4.12/24
node02.sec.lab (64512) 10.22.4.13/24
root@master:~/calico/v3.26.4#
# 采用默认配置情况下,ipipmode模式为never
root@master:~/calico/v3.26.4# calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED DISABLEBGPEXPORT SELECTOR
default-ipv4-ippool 10.244.0.0/16 true Never CrossSubnet false false all()
root@master:~/calico/v3.26.4#
4.Calico中的Route reflectors样例
4.1. 关闭Full-mesh模式
- 通过配置nodeToNodeMeshEnabled参数,进行Full-mesh关闭
root@master:~/bgp# cat DisableNodeMesh.yml
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
logSeverityScreen: Info
# 关闭calico默认的node-to-node mesh
nodeToNodeMeshEnabled: false
# 默认BGP集群的as号64512
asNumber: 64512
root@master:~/bgp#
root@master:~/bgp# kubectl apply -f DisableNodeMesh.yml
bgpconfiguration.projectcalico.org/default created
root@master:~/bgp# calicoctl node status
Calico process is running.
IPv4 BGP status
No IPv4 peers found.
IPv6 BGP status
No IPv6 peers found.
root@master:~/bgp#
4.2. 配置指定节点为反射路由器
- 此处配置Master节点为反射路由器
root@master:~/bgp# kubectl label node master.sec.lab route-reflector=true
node/master.sec.lab labeled
root@master:~/bgp#
- 配置集群路由ID
root@master:~/bgp# kubectl annotate node master.sec.lab projectcalico.org/RouteReflectorClusterID=244.0.0.1
node/master.sec.lab annotated
root@master:~/bgp# kubectl get nodes master.sec.lab -o yaml | grep 244.0.0.1
projectcalico.org/RouteReflectorClusterID: 244.0.0.1
root@master:~/bgp#
4.3. 反射路由器配置BGP Peer
root@master:~/bgp# cat PeerBgp.yml
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: peer-with-route-reflectors
spec:
nodeSelector: all()
peerSelector: route-reflector == 'true'
root@master:~/bgp#
root@master:~/bgp# kubectl apply -f PeerBgp.yml
bgppeer.projectcalico.org/peer-with-route-reflectors created
root@master:~/bgp#
4.4. 查看BGP连接状态
- 在master集群
root@master:~/bgp# calicoctl node status
Calico process is running.
IPv4 BGP status
+--------------+---------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+---------------+-------+----------+-------------+
| 10.22.4.12 | node specific | up | 09:27:56 | Established |
| 10.22.4.13 | node specific | up | 09:27:56 | Established |
+--------------+---------------+-------+----------+-------------+
IPv6 BGP status
No IPv6 peers found.
root@master:~/bgp#
- 在node01节点
root@node01:~# calicoctl node status
Calico process is running.
IPv4 BGP status
+--------------+---------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+---------------+-------+----------+-------------+
| 10.22.4.11 | node specific | up | 09:27:55 | Established |
+--------------+---------------+-------+----------+-------------+
IPv6 BGP status
No IPv6 peers found.
root@node01:~#
- 在node02节点
root@node02:~# calicoctl node status
Calico process is running.
IPv4 BGP status
+--------------+---------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+---------------+-------+----------+-------------+
| 10.22.4.11 | node specific | up | 09:27:56 | Established |
+--------------+---------------+-------+----------+-------------+
IPv6 BGP status
No IPv6 peers found.
root@node02:~#
5.Calico中的Top of Rack模式
5.1. 关闭Full-mesh模式
root@master:~/bgp# cat top-node-bgp.yml
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
logSeverityScreen: Info
# 关闭calico默认的node-to-node mesh
nodeToNodeMeshEnabled: false
# 配置BGP集群的as号65002
asNumber: 64512
listenPort: 179
bindMode: NodeIP
communities:
- name: bgp-large-community
value: 64512:300:100
# 配置BGP发布pod网段
prefixAdvertisements:
- cidr: 10.244.0.0/16
communities:
- bgp-large-community
- 64512:120
5.2. 配置节点与TOP路由器互联
root@master:~/bgp# cat top-peer-bgp.yml
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
# 配置对端BGP name
name: top-bgp-device
spec:
# 配置对端BGP IP
peerIP: 10.22.4.1
# 配置BGP宣发路由上只发布对应node的
keepOriginalNextHop: true
# 配置对端as号
asNumber: 65001