calico网络模式
一、IPIP模式
IpIp模式是通过宿主机的网络去传输的,这个模式和flannel的vxlan工作模式差不多是一样的,都是一种复杂的网络方案,IPIP和vxlan模式的性能基本上接近,所以在性能方面要相对于路由方面损失10-20%。
在ipip模式下查看tunl0网卡,会发现改网卡有绑定IP,因为从pod出来的网卡需要经过tunl0网卡进行封包,然后再从物理机的网卡转发出去;
ipip模式下查看路由
IPIP模式存在的问题:
数据包传输存在封包和拆包的过程,性能方面相对于路由方案会损害10-20%。
二、BGP模式
Calio和flannel一样也支持路由方案,在calio里面使用了BGP路由方案去实现的,BGP就是基于路由去转发的,每个节点通过BGP协议同步路由表,将每个节点作为路由器转发。
将IPIP模式改为BGP模式
calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR
default-ipv4-ippool 10.244.0.0/16 true Always Never false all()
calicoctl get ippool -o yaml > ippool.yaml
vim ippool.yaml
ipipMode: Always
#改成 ipipMode: Never
calicoctl apply -f ippool.yaml
修改BGP模式后,查看各节点是bgp链接,发现集群中的所有节点两两之间存在BGP连接。
同时,再次查看tunl0网卡,会发现其绑定的IP消失了,这里tul0网卡就没用了,因为不需要封包,所以容器内部的数据到达到宿主机直接从网卡出去了,BGP模式相对于ipip模式少了tul0设备的介入,数据的封装。
接着观察路由信息,这里没有tul0的路由了,数据包到达宿主机上面了,根据这个路由表去转发。这个和flannel的hgw是一样的。
BGP模式存在的问题:
集群节点之间是全互联模式,即各节点之间两两建立BGP连接,当集群规模过大时,连接数成倍增加,会产生新的性能问题。
三、RR模式(router reflector)
Calico 维护的网络默认是(Node-to-Node Mesh)全互联模式,Calico集群中的节点之间都会相互建立连接,用于路由交换。但是随着集群规模的扩大,mesh模式将形成一个巨大服务网格,连接数成倍增加,就会产生性能问题。这时就需要使用 Route Reflector(路由器反射)模式解决这个问题。
3.1、关闭node-to-node模式
将BGPConfiguration配置中的nodeToNodeMeshEnabled设置为false
$ cat << EOF | calicoctl create -f -
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
logSeverityScreen: Info
nodeToNodeMeshEnabled: false
asNumber: 64512
EOF
配置完成后,在各节点上执行calicoctl node status,发现所有的bgp链接都消失了。
3.2、给节点打标签
假设实验环境中共有8台机器,node1和node2在一个交换机下,node3和node4在一个交换机下,node5、node6、node7和node8在一个交换机下。选择node1、node3和node5作为rr节点,其余为非rr节点
1、给RR节点打标签,Node1节点: route-reflector=rr1 ,Node3节点: route-reflector=rr2 ,
Node5节点: route-reflector=rr3
2、给⾮RR节点打标签(本⼦⽹内已经是RR节点的节点也属于是⾮RR节点)Node1/2/节点: spine=peer1 , Node3/4节点: spine=peer2 ,Node5/6/7/8: spine=peer3
kubectl label node k8s-node1 route-reflector=rr1
kubectl label node k8s-node2 spine=peer1
kubectl label node k8s-node3 route-reflector=rr2
kubectl label node k8s-node4 spine=peer2
3.3、配置指定节点充当路由反射器
首先通过calicoctl get node -o wide命令查看集群节点,在集群中选择1个或多个节点作为rr节点。假设选择k8s-node1节点作为rr节点进行配置。
calicoctl get node k8s-node1 -oyaml > k8s-node1.yaml
apiVersion: projectcalico.org/v3
kind: Node
metadata:
name: k8s-node1
spec:
addresses:
- address: 192.168.2.54/24
type: CalicoNodeIP
- address: 192.168.2.54
type: InternalIP
bgp:
ipv4Address: 192.168.2.54/24
ipv4IPIPTunnelAddr: 10.244.83.128
orchRefs:
- nodeName: k8s-node1
orchestrator: k8s
修改配置
apiVersion: projectcalico.org/v3
kind: Node
metadata:
name: k8s-node1
labels:
# 新增-设置标签
route-reflector=rr1
spec:
addresses:
- address: 192.168.2.54/24
type: CalicoNodeIP
- address: 192.168.2.54
type: InternalIP
bgp:
ipv4Address: 192.168.2.54/24
ipv4IPIPTunnelAddr: 10.244.83.128
# 新增-设置集群ID
routeReflectorClusterID: 224.0.0.1
orchRefs:
- nodeName: k8s-node1
orchestrator: k8s
3.4、配置BGPPeer
配置RR节点与同⼦⽹其他节点之间的BGP互联
配置的意思:node节点有 spine=='peer1'标签的,都匹配到有 route-reflector == 'rr1'标签的rr节点上
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
name: peer-to-rr1
spec:
# 规则1:普通 bgp node 与 rr 建立连接
nodeSelector: spine == 'peer1'
peerSelector: route-reflector == 'rr1'
---
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
name: rr-mesh
spec:
nodeSelector: spine == 'peer2'
peerSelector: route-reflector == 'rr2'
3.5、配置RR节点与上联交换机之间的BGP互联(可选)
如果节点不是分布在多个交换机下,此步骤可省略。该步骤的目的是使rr节点与交换机之间形成BGP互联,从而多个RR节点之间网络连接上了。
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
name: rr1-to-spine
spec:
nodeSelector: route-reflector == 'rr1'
asNumber: 63400
peerIP: 10.217.67.62 #如果是IPv6,这个peer ip就是⼀个ipv6地址
3.6、交换机路由过滤
k8s侧只需要容器⽹段(以10.222.0.0/18为例),其他⾮10.222⽹段的路由都可以在交换机侧进⾏过滤(即不发送到主机侧),否则,你会在主机看到很多跟k8s⽆关的、unreachable的路由。如果默认路由是⾛的业务⽹卡(⽬前所有现⽹环境都是的)可以要求SRE过滤掉所有的路由下发,交换机只需要收到RR节点反射给它的容器⽹段,k8s侧不需要交换机同步给⾃⼰路由信息,因为对于未知的容器⽹段,k8s会⾛业务⽹卡的默认路由(即默认⽹关)出去,⼀定可以找到对端。
总结
IPIP模式先进行原始数据包的封装,然后通过宿主机网络去封装,解封装是一样的,但是这种封装拆解是有性能的消耗
这种可以跨网段跨vlan只要两个网络可以Ping通就行,不管是同一个机房还是不同的机房,只要三层可达就行。
BGP模式对宿主机的要求是二层网络可达,如果节点是跨vlan的网络,那么就需要在该节点的路由器上面做相关的配置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?