1 原理

[!info]
同一集群内的客户机只需要与该集群的 RR 直接交换路由信息,因此客户机只需要与 RR 之间建立 IBGP 连接,不需要与其他客户机建立 IBGP 连接,从而减少了 IBGP 连接数量。并采用独有的 Cluster_List 属性和 Originator_ID 属性防止路由环路。RR 向 IBGP 邻居发布路由规则如下:

  • 从非客户机学到的路由,发布给所有客户机。
  • 从客户机学到的路由,发布给所有非客户机和客户机(发起此路由的客户机除外)。
  • 从 EBGP 对等体学到的路由,发布给所有的非客户机和客户机。

2 配置 Calico

2.1 关闭 node-to-node BGP 网络

[!info]
为保证 IBGP 对等体之间的连通性,需要在 IBGP 对等体之间建立全连接关系。假设在一个 AS 内部有 n 台设备,那么建立的 IBGP 连接数就为 n(n-1)/2。当设备数目很多时,设备配置将十分复杂,而且配置后网络资源和 CPU 资源的消耗都很大。Calico 默认是 Full-mesh 全互联模式,需要关闭

1
2
3
4
5
6
7
8
9
10
11
cat > gpconfiguration.yaml << EOF
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
logSeverityScreen: Warning
nodeToNodeMeshEnabled: False
asNumber: 63456
EOF
calicoctl apply -f gpconfiguration.yaml

2.1.1 查看

1
2
3
calicoctl get bgpconfig
NAME LOGSEVERITY MESHENABLED ASNUMBER
default Warning false 64512
1
2
3
4
5
6
7
8
calicoctl node status
Calico process is running.

IPv4 BGP status
No IPv4 peers found.

IPv6 BGP status
No IPv6 peers found.

2.2 路由反射器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 节点添加标签
kubectl label node my-node route-reflector=true

# 搜索带`route-reflector=true`标签的节点为路由反射节点

cat > peer-with-route-reflectors.yaml << EOF
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
name: peer-with-route-reflectors
spec:
nodeSelector: all()
peerSelector: route-reflector == 'true'
EOF
calicoctl apply -f peer-with-route-reflectors.yaml

2.3 查看 ippool

[!tip]
CrossSubnet表示跨子网才使用ipip,否则使用 bgp

1
2
3
calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED DISABLEBGPEXPORT SELECTOR
default-ipv4-ippool 192.168.0.0/16 true CrossSubnet Never false false all()

3 查看节点状态

1
2
3
4
5
6
7
8
9
calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+---------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+---------------+-------+----------+-------------+
| 10.0.0.2 | node specific | up | 10:40:46 | Established |
| 10.0.0.3 | node specific | up | 10:40:48 | Established |

4 测试

测试,随便找个 pod ping 不同节点的 pod

5 问题

[!question]
calico 查看节点信息一直 start 状态

检测此 ip 的 179 端口能否访问,如果访问不了检查 ip 能不能通信,如果不能就是这节点网络问题,如果可以检查 calico 组件状态与节点配置