在大规模的节点网络中如果使用BGP网格,将会产生大量的广播风暴。所以在大规模网路中使用BGP Reflect

配置Calico工作为BGP Reflect模式

在每个节点上工作的BIRD既可以作为BGP客户端,还可以作为BGP Reflect,所以只需要从众多的节点中找出1个或2个将其配置为Reflect即可。

1.在Calico中要使用Reflect需要使用专用的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@k8s-master01:~/yaml/chapter08# vim reflector-node.yaml
apiVersion: projectcalico.org/v3
kind: Node # 节点为Node,表示为calico的node节点
metadata:
labels:
route-reflector: true # 加label表示要从整个集群中挑选个别节点为reflect,此标签会在后续中使用到
name: k8s-master01 # 此处的名字为calicoctl get nodes中节点的名字
spec:
bgp: # 指定运行BGP的配置信息
ipv4Address: 172.16.11.71/24 # 指定那个主机要配置为reflect
ipv4IPIPTunnelAddr: 192.168.130.0 # 172.16.11.71节点的tunl0接口的地址
routeReflectorClusterID: 1.1.1.1 # 此为bgp网络信息,不同的网络ID不同,同一网络ID号相同,值自定义。

# 应用此清单
root@k8s-master01:~/yaml/chapter08# kubectl-calico apply -f reflector-node.yaml
Successfully applied 1 'Node' resource(s)

# reflect已经配置成功,但目前BIRD还工作在node to node的mesh模式
# 我们需要将其工作模式从BGP peer模式改为BGP reflect模式

2.改变node节点的工作模型从BGP peer模式为BGP reflect,需要专用配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 此配置用来让每一个节点确定每一个BGP客户端都与定义的reflect进行路由发送
# 而不再是互相发送
root@k8s-master01:~/yaml/chapter08# vim bgppeer-demo.yaml
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
name: bgppeer-demo
spec:
nodeSelector: all() # 设定所有节点都是BGPPeer
peerSelector: route-reflector == "true" # 但是他们都与此行标签选择出来的peer进行通信
# 而不再是1对n-1的模式进行通信
# 应用此清单
root@k8s-master01:~/yaml/chapter08# kubectl-calico apply -f bgppeer-demo.yaml
Successfully applied 1 'BGPPeer' resource(s)

# 再次查看node状态
root@k8s-master01:~/yaml/chapter08# kubectl-calico node status
Calico process is running.

IPv4 BGP status
+--------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+-------------------+-------+----------+-------------+
| 172.16.11.81 | node-to-node mesh | up | 06:08:26 | Established |
| 172.16.11.82 | node-to-node mesh | up | 06:08:27 | Established |
| 172.16.11.83 | node-to-node mesh | up | 06:08:27 | Established |
| 172.16.11.81 | node specific | start | 09:01:55 | Idle |
| 172.16.11.82 | node specific | start | 09:01:55 | Idle |
| 172.16.11.83 | node specific | start | 09:01:55 | Idle |
+--------------+-------------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

# 从node状态中可以看到master节点已经可以和其他节点建立起点到点的node specific
# 并且只有master节点与其他节点进行通信,其他节点相互间不在进行通信路由信息
# 但是之前的node-to-node的还存在,接下来一部需要把这些关闭

3.关闭node-to-node mesh模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 修改node-to-node模式,需要修改BGP的Configuration
root@k8s-master01:~/yaml/chapter08# vim default-bgpconfiguration.yaml
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default # 此处名字必须为default,因为只有default是生效的
spec:
logSeverityScreen: Info
nodeToNodeMeshEnabled: false # 要不要设定节点和节点之间点对点通信,默认为true,需要改为false
asNumber: 63400 # asNumber表示自治系统编号,表示大家都在同一个自治系统中

# 应用配置文件
root@k8s-master01:~/yaml/chapter08# kubectl-calico apply -f default-bgpconfiguration.yaml
Successfully applied 1 'BGPConfiguration' resource(s)

# 再次查看Node状态
root@k8s-master01:~/yaml/chapter08# kubectl-calico node status
Calico process is running.

IPv4 BGP status
+--------------+---------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+---------------+-------+----------+-------------+
| 172.16.11.81 | node specific | up | 09:16:20 | Established |
| 172.16.11.82 | node specific | up | 09:16:20 | Established |
| 172.16.11.83 | node specific | up | 09:16:20 | Established |
+--------------+---------------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.

# 此处node-to-node mesh没有了
# 现在这3个节点再生成的路由信息,不会相互发送了只会发送给master01
# master01收到后会反射给整个网络的各个节点。

总结

要将BGP原有的Node-to-Node mesh的网络改成BGP reflect网络需要3步骤:

  1. 在集群中找一个节点当reflector
  2. 设定其他节点都能与reflector一对一通信
  3. 把其他节点的彼此间通信关闭

多Reflector配置

配置多个reflector时只需要把把第一步进行重复,更改其中的节点名、IP地址,但是标签必须保持一致。然后其他的所有节点都能与这两个reflector进行通信了,但是他们各组件中的通信是借助于etcd进行通信的,所以无论把信息发送给哪个reflector他们都会存储到etcd中,由另外的Reflector向全网进行反射。