一 背景
容器网络组件Calico支持多种后端模式,包括overlay中的IPIP和Vxlan模式,以及underlay中的纯路由BGP模式。
与Overlay网络模型相比,Underlay网络具有更高的数据平面转发性能。同时纯路由模式也有两种解决方案: Calico BGP 的全网状解决方案有一些限制:拥有的集群节点越多,拥有的BGP 连接就越多。另外,保护网络需要建立大量的连接,并且每次添加节点时,连接数必须加倍才能保证网络的互操作性,创建大量的连接会产生网络消耗。因此,目前可以使用路由反射器模式,也称为RR模式。在RR模式下,一个或多个BGP发言者被指定为RouterReflectors并与网络中的其他发言者建立连接。每个Speaker只要与Router Reflector建立了BGP,就可以获得整个网络的路由信息。
二 Calico BGP RouteReflector模式组网架构
在不改变IDC机房内部网络拓扑的情况下,接入层交换机和核心层交换机利用机房现有的路由策略建立BGP连接,并根据物理位置分配Pod CIDR。每个节点分配一个Pod CIDR,节点通过BGP协议将该Pod CIDR告知接入层交换机,实现全网通信功能。下图基于Leaf-Spine架构并对其进行了详细解释。
网络原理:
每台接入层交换机与其管理的二层节点进行通信,共同构成AS。 BGP 服务运行在每个节点上,并通告该节点的路由信息。核心层交换机和接入层交换机之间的每台路由器占用独立的AS,物理上直连,运行BGP协议。核心层交换机可以检测整个网络的路由信息,接入层交换机可以检测直连节点的路由信息。同一主机上的Pod 通过主机路由器相互通信。 (将Linux 主机视为路由器)同一机架上不同节点上的pod 之间的通信通过TOR(叶子)交换机。不同机架上的Pod 之间的通信通过核心交换机。
三 模拟生产场景组网搭建环境
准备一台Ubuntu2204操作系统的机器(8U16G就够了)。虚拟机上必须安装以下软件工具:
Dockergo开发环境Kind(kubernetes,kubernetes兴趣小组开发的Docker软件。可以用来快速搭建k8s测试环境。安装Kind需要先在主机上安装go。Kind的安装版本可以选择v0)。您安装的是v0.42.0 版本)。
3.1 kubernetes 环境搭建
Kubernetes集群版本为: 1.27.3。
集群规模为1个主节点和3个工作节点。
集群构建脚本如下。1-setup-env.sh
#!/bin/bash
日期
设置-v
# 1.准备noCNI环境
cat EOF | 类型创建集群–name=calico-bgp-rr –image=kindest/node:v1.27.3 –config=-
kind:集群
apiVersion: kind.x-k8s.io/v1alpha4
网络:
禁用默认CNI: true
podSubnet:\’10.244.0.0/16\’
节点:
– role: 控制平面
kubeadmConfigPatches:
– |
kind: 初始化配置
节点注册:
kubeletExtraArgs:
节点IP: 10.1.5.10
节点标签: \’机架=机架0\’
– 角色: 工人
kubeadmConfigPatches:
– |
kind:键配置
节点注册:
kubeletExtraArgs:
节点ip: 10.1.5.11
节点标签: \’机架=机架0\’
– 角色: 工人
kubeadmConfigPatches:
– |
kind:键配置
节点注册:
kubeletExtraArgs:
节点IP: 10.1.8.10
节点标签: \’机架=机架1\’
– 角色: 工人
kubeadmConfigPatches:
– |
kind:键配置
节点注册:
kubeletExtraArgs:
节点IP: 10.1.8.11
节点标签: \’机架=机架1\’
结束后
#2.清除污垢
kubectl 污点节点$(kubectl get 名称-o 名称| grep 控制平面)node-role.kubernetes.io/control-plane:NoSchedule-
kubectl 获取节点-o Wide
# 3.安装工具
for i in $(docker ps -a –format \’table {{.Names}}\’ |grep calico-bgp-rr)
做
回声$i
docker cp /usr/bin/ping $i:/usr/bin/ping
docker cp /usr/local/bin/calicoctl $i:/usr/local/bin/
# docker exec -it $i bash -c \’apt-get -y update /dev/null apt-get -y install net-tools tcpdump lrzsz /dev/null 21\’
结尾
运行该脚本创建集群时,由于未安装cni组件,集群中部分pod处于pending状态,集群节点也处于NotReady状态。这个是正常的。稍后可以通过安装calico cni组件来解决。
3.2 创建网桥
在主机上创建网桥的主要目的是连接type中创建的K8s节点和containerlab中内置的交换机之间的网络。
brctl addbr br-leaf0;ifconfig br-leaf0 up;brctl addbr br-leaf1;ifconfig br-leaf1 up
3.3 借助containerLab搭建三层交换机并配置BGP规则
ContainerLab 构建切换脚本是:2-setup-clab.sh
#!/bin/bash
设置-v
cat EOFclab.yaml | clab 部署-t clab.yaml –
name: calico-bgp-rr
拓扑:
节点:
脊柱0:
kind: Linux
image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/vyos:1.4.9
cmd: /sbin/init
绑定:
– /lib/modules:/lib/modules
– ./startup-conf/spine0-boot.cfg:/opt/vyatta/etc/config/config.boot
脊柱1:
kind: Linux
image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/vyos:1.4.9
cmd: /sbin/init
绑定:
– /lib/modules:/lib/modules
– ./startup-conf/spine1-boot.cfg:/opt/vyatta/etc/config/config.boot
叶0:
kind: Linux
image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/vyos:1.4.9
cmd: /sbin/init
绑定:
– /lib/modules:/lib/modules
– ./startup-conf/leaf0-boot.cfg:/opt/vyatta/etc/config/config.boot
叶1:
kind: Linux
image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/vyos:1.4.9
cmd: /sbin/init
绑定:
– /lib/modules:/lib/modules
– ./startup-conf/leaf1-boot.cfg:/opt/vyatta/etc/config/config.boot
br-叶0:
kind:桥
br-叶1:
kind:桥
服务器1:
kind: Linux
image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/nettool
网络模式: 容器: calico-bgp-rr – 控制平面
执行:
-ip地址添加10.1.5.10/24 dev net0
-ip 路由通过10.1.5.1 替换默认值
服务器2:
kind: Linux
image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/nettool
网络模式: 容器:calico-bgp-rr-worker
执行:
-ip地址添加10.1.5.11/24 dev net0
-ip 路由通过10.1.5.1 替换默认值
服务器3:
kind: Linux
image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/nettool
网络模式: 容器:calico-bgp-rr-worker2
执行:
-ip地址添加10.1.8.10/24 dev net0
-ip 路由通过10.1.8.1 替换默认值
服务器4:
kind: Linux
image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/nettool
网络模式: 容器:calico-bgp-rr-worker3
执行:
-ip地址添加10.1.8.11/24 dev net0
-ip 路由通过10.1.8.1 替换默认值
链接:
– 端点: [\’br-leaf0:br-leaf0-net0\’, \’server1:net0\’]
– 端点: [\’br-leaf0:br-leaf0-net1\’, \’server2:net0\’]
– 端点: [\’br-leaf1:br-leaf1-net0\’, \’server3:net0\’]
– 端点: [\’br-leaf1:br-leaf1-net1\’, \’server4:net0\’]
– 端点: [\’leaf0:eth1\’, \’spine0:eth1\’]
– 端点: [\’leaf0:eth2\’, \’spine1:eth1\’]
– 端点: [\’leaf0:eth3\’, \’br-leaf0:br-leaf0-net2\’]
– 端点: [\’leaf1:eth1\’, \’spine0:eth2\’]
– 端点: [\’leaf1:eth2\’, \’spine1:eth2\’]
– 端点: [\’leaf1:eth3\’, \’br-leaf1:br-leaf1-net2\’]
结束后
可以看到Containerlab网络已经成功建立。有关在交换机上为VYO 配置BGP 路由协议的信息,请参阅文档末尾。
3.4 Calico cni插件部署安装
Calico默认安装为ipip模式,因此需要手动关闭不带ipip/vxlan封装的Bgp模式。
kubectl apply -f calico.yaml
#kubectl apply -f https://projectcalico.docs.tigera.io/archive/v3.23/manifests/calico.yaml
一旦安装了Calico 组件,节点之间建立的BGP 连接就采用全网状形式。
3.5 Calico BGP RR模式开启
全网状全连接模式不适合大型集群。必须关闭BGP 全网状模式才能使用BGP 路由反射器。
方法如下:3-disable-bgp-full-mesh.sh
#!/bin/bash
设置-v
#1. 禁用bgp 全网状
猫EOF | calicoctl 应用-f –
apiVersion: 项目calico.org/v3
商品:
– apiVersion: 项目calico.org/v3
kind: BGP 配置
元数据:
名称: 默认
规格:
logSeverityScreen: 信息
NodeToNodeMeshEnabled: 假
kind: BGP配置列表
元数据:
结束后
3.6 Calico node 配置BGP RR规则
Kubernetes集群中的节点作为BGP路由反射器的客户端,必须配置BGP路由反射器和对等体信息,以实现路由同步的能力。
#!/bin/bash
设置-v
# 1.3. 节点add() bgp配置
猫EOF | 应用-f –
apiVersion: 项目calico.org/v3
kind:节点
元数据:
注释:
标签:
机架: 机架0
name: calico-bgp-rr-控制平面
规格:
地址:
– 地址: 10.1.5.10
type: 内部IP
bgp:
asNumber: 65005
IPv4地址: 10.1.5.10/24
orchRefs:
– 节点名称: calico-bgp-rr-控制平面
协调器: k8s
结束后
猫EOF | calicoctl 应用-f –
apiVersion: 项目calico.org/v3
kind:节点
元数据:
标签:
机架: 机架0
name: calico-bgp-rr-worker
规格:
地址:
– 地址: 10.1.5.11
type: 内部IP
bgp:
asNumber: 65005
IPv4地址: 10.1.5.11/24
orchRefs:
– 节点名称: calico-bgp-rr-worker
协调器: k8s
结束后
猫EOF | 应用-f –
apiVersion: 项目calico.org/v3
kind:节点
元数据:
标签:
机架: 机架1
name: calico-bgp-rr-worker2
规格:
地址:
– 地址: 10.1.8.10
type: 内部IP
bgp:
编号: 65008
IPv4地址: 10.1.8.10/24
orchRefs:
– 节点名称: calico-bgp-rr-worker2
协调器: k8s
结束后
猫EOF | 应用-f –
apiVersion: 项目calico.org/v3
kind:节点
元数据:
标签:
机架: 机架1
name: calico-bgp-rr-worker3
规格:
地址:
– 地址: 10.1.8.11
type: 内部IP
bgp:
编号: 65008
IPv4地址: 10.1.8.11/24
orchRefs:
– 节点名称: calico-bgp-rr-worker3
协调器: k8s
结束后
#1.4. 点对点0 切换
猫EOF | 应用-f –
apiVersion: 项目calico.org/v3
kind: BGP 对等体
元数据:
name: 从机架0 到叶0
规格:
对等IP: 10.1.5.1
asNumber: 65005
nodeSelector: 机架==\’机架0\’
结束后
#1.5. 点对点1 开关
猫EOF | 应用-f –
apiVersion: 项目calico.org/v3
kind: BGP 对等体
元数据:
name: 机架1 到叶子1
规格:
对等IP: 10.1.8.1
编号: 65008
nodeSelector: 机架==\’机架1\’
结束后
登录集群任意节点,查看BGP信息:可以看到,不再是BGP全网状的形式了。节点特定是指该节点是路由反射器的客户端,并且作为路由反射器的对等体的地址为10.1.5.1。
四 集群外访问Pod进行BGP验证测试
测试业务发展
apiVersion: 应用程序/v1
kind:恶魔套装
#kind: 部署
元数据:
标签:
应用程序:应用程序
name: 应用程序
规格:
#replica: 2
选择器:
匹配标签:
应用程序:应用程序
模板:
元数据:
标签:
应用程序:应用程序
规格:
集装箱:
– image: swr.cn-north-4.myhuaweicloud.com/k8s-solution/nettool
name:网络工具箱
—
api版本: v1
kind:服务
元数据:
name: 应用程序
规格:
type:节点端口
选择器:
应用程序:应用程序
端口:
– name:应用程序
端口: 8080
目标端口: 80
节点端口: 32000
登录集群任意节点查看路由规则
例如:10.244.210.64/26 via 10.1.5.1 dev net0 proto Bird表示通过BGP协议学习到的路由,bird是calico的BGP客户端。
登录Leaf0交换机,查看BGP信息和路由规则。
显示路由表。
可以看到k8s集群中的pod路由信息驻留在leaf 0交换机上。这意味着您可以访问集群中的Pod。
显示BGP信息:show ip bgp
:清晰可见
导航到地址为:10.1.8.0/24||10.244.192.0/26||10.244.210.64 的设备。下一跳为10.1.12.2和10.1.10.2,属于EBGP路由,包含ECMP策略。
目的地址为:10.244.81.64/26||10.244.205.64/26,下一跳为10.1.5.10||10.1.5.11,属于IBGP路由。
访问测试
集群内Pod之间相互访问
核心交换机接入集群Pod
如果您的核心交换机和公网配置了同步路由的EBGP 规则,公网流量也可以进入您的Kubernetes 集群。
5C的
ontainerlab中的vyos容器镜像模拟交换机的配置文件
spine0-boot.cfg如下:
interfaces {
ethernet eth1 {
address 10.1.10.2/24
duplex auto
speed auto
}
ethernet eth2 {
address 10.1.34.2/24
duplex auto
speed auto
}
loopback lo {
}
}
protocols {
bgp {
address-family {
ipv4-unicast {
network 10.1.10.0/24 {
}
network 10.1.34.0/24 {
}
}
}
neighbor 10.1.10.1 {
address-family {
ipv4-unicast {
}
}
remote-as 65005
}
neighbor 10.1.34.1 {
address-family {
ipv4-unicast {
}
}
remote-as 65008
}
parameters {
bestpath {
as-path {
multipath-relax
}
}
}
system-as 500
}
}
system {
config-management {
commit-revisions 100
}
console {
device ttyS0 {
speed 9600
}
}
host-name spine0
login {
user vyos {
authentication {
encrypted-password $6$QxPS.uk6mfo$9QBSo8u1FkH16gMyAVhus6fU3LOzvLR9Z9.82m3tiHFAxTtIkhaZSWssSgzt4v4dGAL8rhVQxTg0oAG9/q11h/
plaintext-password \”\”
}
}
}
time-zone UTC
}
// Warning: Do not remove the following line.
// vyos-config-version: \”bgp@4:broadcast-relay@1:cluster@1:config-management@1:conntrack@3:conntrack-sync@2:container@1:dhcp-relay@2:dhcp-server@6:dhcpv6-server@1:dns-dynamic@1:dns-forwarding@4:firewall@10:flow-accounting@1:https@4:ids@1:interfaces@29:ipoe-server@1:ipsec@12:isis@3:l2tp@4:lldp@1:mdns@1:monitoring@1:nat@5:nat66@1:ntp@2:openconnect@2:ospf@2:policy@5:pppoe-server@6:pptp@2:qos@2:quagga@11:rip@1:rpki@1:salt@1:snmp@3:ssh@2:sstp@4:system@26:vrf@3:vrrp@3:vyos-accel-ppp@2:wanloadbalance@3:webproxy@2\”
// Release version: 1.4-rolling-202307070317
spine1-boot.cfg
interfaces {
ethernet eth1 {
address \”10.1.12.2/24\”
duplex \”auto\”
mtu \”9000\”
offload {
gso { }
sg { }
}
speed \”auto\”
}
ethernet eth2 {
address \”10.1.11.2/24\”
duplex \”auto\”
mtu \”9000\”
offload {
gso { }
sg { }
}
speed \”auto\”
}
loopback lo { }
}
protocols {
bgp {
address-family {
ipv4-unicast {
network 10.1.11.0/24 { }
network 10.1.12.0/24 { }
}
}
neighbor 10.1.11.1 {
address-family {
ipv4-unicast { }
}
remote-as \”65008\”
}
neighbor 10.1.12.1 {
address-family {
ipv4-unicast { }
}
remote-as \”65005\”
}
parameters {
bestpath {
as-path {
multipath-relax { }
}
}
router-id \”10.1.8.1\”
}
system-as \”800\”
}
}
system {
config-management {
commit-revisions \”100\”
}
conntrack {
modules {
ftp { }
h323 { }
nfs { }
pptp { }
sip { }
sqlnet { }
tftp { }
}
}
console {
device ttyS0 {
speed \”9600\”
}
}
host-name \”spine1\”
login {
user vyos {
authentication {
encrypted-password \”$6$QxPS.uk6mfo$9QBSo8u1FkH16gMyAVhus6fU3LOzvLR9Z9.82m3tiHFAxTtIkhaZSWssSgzt4v4dGAL8rhVQxTg0oAG9/q11h/\”
plaintext-password \”\”
}
}
}
time-zone \”UTC\”
}
// Warning: Do not remove the following line.
// // vyos-config-version: \”bgp@4:broadcast-relay@1:cluster@1:config-management@1:conntrack@3:conntrack-sync@2:container@1:dhcp-relay@2:dhcp-server@6:dhcpv6-server@1:dns-dynamic@1:dns-forwarding@4:firewall@10:flow-accounting@1:https@4:ids@1:interfaces@29:ipoe-server@1:ipsec@12:isis@3:l2tp@4:lldp@1:mdns@1:monitoring@1:nat@5:nat66@1:ntp@2:openconnect@2:ospf@2:policy@5:pppoe-server@6:pptp@2:qos@2:quagga@11:rip@1:rpki@1:salt@1:snmp@3:ssh@2:sstp@4:system@26:vrf@3:vrrp@3:vyos-accel-ppp@2:wanloadbalance@3:webproxy@2\”
// // Release version: 1.4-rolling-202307070317
leaf0-boot.cfg
interfaces {
ethernet eth1 {
address 10.1.10.1/24
duplex auto
mtu 9000
speed auto
}
ethernet eth2 {
address 10.1.12.1/24
duplex auto
mtu 9000
speed auto
}
ethernet eth3 {
address 10.1.5.1/24
duplex auto
mtu 9000
speed auto
}
loopback lo {
}
}
nat {
source {
rule 100 {
outbound-interface eth0
source {
address 10.1.0.0/16
}
translation {
address masquerade
}
}
}
}
protocols {
bgp {
address-family {
ipv4-unicast {
network 10.1.5.0/24 {
}
network 10.1.10.0/24 {
}
network 10.1.12.0/24 {
}
}
}
neighbor 10.1.5.10 {
address-family {
ipv4-unicast {
nexthop-self {
}
route-reflector-client
}
}
remote-as 65005
}
neighbor 10.1.5.11 {
address-family {
ipv4-unicast {
nexthop-self {
}
route-reflector-client
}
}
remote-as 65005
}
neighbor 10.1.10.2 {
address-family {
ipv4-unicast {
}
}
remote-as 500
}
neighbor 10.1.12.2 {
address-family {
ipv4-unicast {
}
}
remote-as 800
}
parameters {
bestpath {
as-path {
multipath-relax
}
}
router-id 10.1.5.1
}
system-as 65005
}
}
system {
config-management {
commit-revisions 100
}
console {
device ttyS0 {
speed 9600
}
}
host-name leaf0
login {
user vyos {
authentication {
encrypted-password $6$QxPS.uk6mfo$9QBSo8u1FkH16gMyAVhus6fU3LOzvLR9Z9.82m3tiHFAxTtIkhaZSWssSgzt4v4dGAL8rhVQxTg0oAG9/q11h/
plaintext-password \”\”
}
}
}
time-zone UTC
}
// Warning: Do not remove the following line.
// vyos-config-version: \”bgp@4:broadcast-relay@1:cluster@1:config-management@1:conntrack@3:conntrack-sync@2:container@1:dhcp-relay@2:dhcp-server@6:dhcpv6-server@1:dns-dynamic@1:dns-forwarding@4:firewall@10:flow-accounting@1:https@4:ids@1:interfaces@29:ipoe-server@1:ipsec@12:isis@3:l2tp@4:lldp@1:mdns@1:monitoring@1:nat@5:nat66@1:ntp@2:openconnect@2:ospf@2:policy@5:pppoe-server@6:pptp@2:qos@2:quagga@11:rip@1:rpki@1:salt@1:snmp@3:ssh@2:sstp@4:system@26:vrf@3:vrrp@3:vyos-accel-ppp@2:wanloadbalance@3:webproxy@2\”
// Release version: 1.4-rolling-202307070317
leaf1-boot.cfg
interfaces {
ethernet eth1 {
address 10.1.34.1/24
duplex auto
mtu 9000
speed auto
}
ethernet eth2 {
address 10.1.11.1/24
duplex auto
mtu 9000
speed auto
}
ethernet eth3 {
address 10.1.8.1/24
duplex auto
mtu 9000
speed auto
}
loopback lo {
}
}
nat {
source {
rule 100 {
outbound-interface eth0
source {
address 10.1.0.0/16
}
translation {
address masquerade
}
}
}
}
protocols {
bgp {
address-family {
ipv4-unicast {
network 10.1.8.0/24 {
}
network 10.1.11.0/24 {
}
network 10.1.34.0/24 {
}
}
}
neighbor 10.1.8.10 {
address-family {
ipv4-unicast {
nexthop-self {
}
route-reflector-client
}
}
remote-as 65008
}
neighbor 10.1.8.11 {
address-family {
ipv4-unicast {
nexthop-self {
}
route-reflector-client
}
}
remote-as 65008
}
neighbor 10.1.11.2 {
address-family {
ipv4-unicast {
}
}
remote-as 800
}
neighbor 10.1.34.2 {
address-family {
ipv4-unicast {
}
}
remote-as 500
}
parameters {
bestpath {
as-path {
multipath-relax
}
}
router-id 10.1.8.1
}
system-as 65008
}
}
system {
config-management {
commit-revisions 100
}
console {
device ttyS0 {
speed 9600
}
}
host-name leaf1
login {
user vyos {
authentication {
encrypted-password $6$QxPS.uk6mfo$9QBSo8u1FkH16gMyAVhus6fU3LOzvLR9Z9.82m3tiHFAxTtIkhaZSWssSgzt4v4dGAL8rhVQxTg0oAG9/q11h/
plaintext-password \”\”
}
}
}
time-zone UTC
}
// Warning: Do not remove the following line.
// vyos-config-version: \”bgp@4:broadcast-relay@1:cluster@1:config-management@1:conntrack@3:conntrack-sync@2:container@1:dhcp-relay@2:dhcp-server@6:dhcpv6-server@1:dns-dynamic@1:dns-forwarding@4:firewall@10:flow-accounting@1:https@4:ids@1:interfaces@29:ipoe-server@1:ipsec@12:isis@3:l2tp@4:lldp@1:mdns@1:monitoring@1:nat@5:nat66@1:ntp@2:openconnect@2:ospf@2:policy@5:pppoe-server@6:pptp@2:qos@2:quagga@11:rip@1:rpki@1:salt@1:snmp@3:ssh@2:sstp@4:system@26:vrf@3:vrrp@3:vyos-accel-ppp@2:wanloadbalance@3:webproxy@2\”
// Release version: 1.4-rolling-202307070317
#以上关于干货收藏!Calico的BGP RouteReflector策略实践的相关内容来源网络仅供参考,相关信息请以官方公告为准!
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92703.html