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的网络,那么就需要在该节点的路由器上面做相关的配置

posted @   云上码猿  阅读(202)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示