使用 Containerlab 搭建 Cilium BGP 环境解析

e1ff124f31fb778b71753a195bc92ca8.gif

本文转自 charlieroro 的博客,原文:https://www.cnblogs.com/charlieroro/p/16712641.html,版权归原作者所有。欢迎投稿,投稿请添加微信好友:cloud-native-yang

containerLab 的简单用法

containerLab[1]支持很多节点[2]和类型[3]设置,相对比较复杂,实际使用中只需要掌握基本的组网即可。

安装[4]

网络布线

如果没有指定网络模式[5],则使用默认的 bridge

container mode[6] 用于于其他容器共享网络命名空间。

my-node:
kind: linux
sidecar-node:
kind: linux
network-mode: container:my-node #my-node 为另一个容器
startup-delay: 10
name: srl02

topology:
  kinds:
    srl:
      type: ixrd3 #srlinux支持的类型,用于模拟硬件
      image: ghcr.io/nokia/srlinux #使用的容器镜像
  nodes:
    srl1: #节点1信息
      kind: srl
    srl2: #节点2信息
      kind: srl

  links:
    - endpoints: ["srl1:e1-1", "srl2:e1-1"] #节点1和节点2的点对点连接信息

上述配置包含两个 SR Linux 节点 srl1srl2,它们通过以下两种方式互通:

  1. 都通过接口 mgmt 连接到了默认的容器网桥 clab(使用 docker network ls 查看)

  2. 通过接口 e1-1 进行了点到点连接。点到点连接是通过一对 veth 实现的。enpoints 描述了一对 veth,因此数组中有且只能有 2 个元素

执行如下命令部署网络:

# containerlab deploy -t srl02.clab.yml

生成的容器网络如下:

IPv4: subnet 172.20.20.0/24, gateway 172.20.20.1
IPv6: subnet 2001:172:20:20::/64, gateway 2001:172:20:20::1
65fd393a0490f90eea5dd3824ccfa02a.png

配置管理网络

用户自定义网络

一般情况下使用默认默认配置即可,但如果默认的网络于现有网络出现冲突,则可以手动指定网段:

mgmt:
  network: custom_mgmt                # management network name
  ipv4_subnet: 172.100.100.0/24       # ipv4 range
  ipv6_subnet: 2001:172:100:100::/80  # ipv6 range (optional)

topology:
# the rest of the file is omitted for brevity

可以手动给节点指定特定 IP,相当于静态 IP,但此时需要给所有容器手动指定 IP:

mgmt:
  network: fixedips #指定容器网络名称(默认的容器网络名称为clab)
  bridge: mybridge #指定网桥名称(默认的网桥名称为 br-<network-id>)
  ipv4_subnet: 172.100.100.0/24
  ipv6_subnet: 2001:172:100:100::/80

topology:
  nodes:
    n1:
      kind: srl
      mgmt_ipv4: 172.100.100.11       # set ipv4 address on management network
      mgmt_ipv6: 2001:172:100:100::11 # set ipv6 address on management network
查看拓扑图

执行如下命令[7]可以查看拓扑图:

$ containerlab graph -t srl02.clab.yml
bd5f131034a6a1b9d80134ea8d64e1ac.png
重新配置网络

如果修改了配置文件可以使用如下命令重新配置网络:

$ containerlab deploy -t srl02.clab.yml --reconfigure

例子

官方给出了很多配置组网的例子[8]。组网中一般涉及两种实例:VM 和路由器,后者可以使用FRR[9]组件模拟。

原文配置解析

Kubernetes 配置

下面使用 kind 创建了一个 kubernetes 集群,其中包含一个控制节点和 3 个工作节点,并分配和节点 IP 和 pod 网段。

注意配置中禁用了默认的 CNI,因此使用 kind 部署之后,节点之间由于无法通信而不会 Ready

# cluster.yaml
kind: Cluster
name: clab-bgp-cplane-demo
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  disableDefaultCNI: true # 禁用默认 CNI
  podSubnet: "10.1.0.0/16" # Pod CIDR
nodes:
- role: control-plane # 节点角色
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-ip: 10.0.1.2 # 节点 IP
        node-labels: "rack=rack0" # 节点标签

- role: worker
  kubeadmConfigPatches:
  - |
    kind: JoinConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-ip: 10.0.2.2
        node-labels: "rack=rack0"

- role: worker
  kubeadmConfigPatches:
  - |
    kind: JoinConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-ip: 10.0.3.2
        node-labels: "rack=rack1"

- role: worker
  kubeadmConfigPatches:
  - |
    kind: JoinConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-ip: 10.0.4.2
        node-labels: "rack=rack1"

Cilium 安装

原文中的验证步骤可能不大合理,应该是先启动 kubernetes 和 cilium,然后再启动 containerlab,否则 kubernetes 因为没有 CNI,也无法生成路由。

# values.yaml
tunnel: disabled

ipam:
  mode: kubernetes

ipv4NativeRoutingCIDR: 10.0.0.0/8

# 开启 BGP 功能支持,等同于命令行执行 --enable-bgp-control-plane=true
bgpControlPlane:  
  enabled: true

k8s:
  requireIPv4PodCIDR: true

$ helm repo add cilium https://helm.cilium.io/
$ helm install -n kube-system cilium cilium/cilium --version v1.12.1 -f values.yaml

完成上述配置之后 kubernetes 集群就启动了,节点也 Ready 了,下面进行 BGP 的配置。

BPG 配置

原文中使用 frrouting/frr:v8.2.2 镜像来实现 BGP 路由发现。更多参数配置可以参见官方手册[10]。文中的 containerlab 的 topo 文件如下:

# topo.yaml
name: bgp-cplane-demo
topology:
  kinds:
    linux:
      cmd: bash
  nodes:
    router0:
      kind: linux
      image: frrouting/frr:v8.2.2
      labels:
        app: frr
      exec:
      - iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      - ip addr add 10.0.0.0/32 dev lo
      - ip route add blackhole 10.0.0.0/8
      - touch /etc/frr/vtysh.conf
      - sed -i -e 's/bgpd=no/bgpd=yes/g' /etc/frr/daemons
      - usr/lib/frr/frrinit.sh start
      - >-
         vtysh -c 'conf t'
         -c 'router bgp 65000'
         -c ' bgp router-id 10.0.0.0'
         -c ' no bgp ebgp-requires-policy'
         -c ' neighbor ROUTERS peer-group'
         -c ' neighbor ROUTERS remote-as external'
         -c ' neighbor ROUTERS default-originate'
         -c ' neighbor net0 interface peer-group ROUTERS'
         -c ' neighbor net1 interface peer-group ROUTERS'
         -c ' address-family ipv4 unicast'
         -c '   redistribute connected'
         -c ' exit-address-family'
         -c '!'
            
    tor0:
      kind: linux
      image: frrouting/frr:v8.2.2  
      labels:
        app: frr
      exec:
      - ip link del eth0
      - ip addr add 10.0.0.1/32 dev lo
      - ip addr add 10.0.1.1/24 dev net1
      - ip addr add 10.0.2.1/24 dev net2
      - touch /etc/frr/vtysh.conf
      - sed -i -e 's/bgpd=no/bgpd=yes/g' /etc/frr/daemons
      - /usr/lib/frr/frrinit.sh start
      - >-
         vtysh -c 'conf t'
         -c 'frr defaults datacenter'
         -c 'router bgp 65010'
         -c ' bgp router-id 10.0.0.1'
         -c ' no bgp ebgp-requires-policy'
         -c ' neighbor ROUTERS peer-group'
         -c ' neighbor ROUTERS remote-as external'
         -c ' neighbor SERVERS peer-group'
         -c ' neighbor SERVERS remote-as internal'
         -c ' neighbor net0 interface peer-group ROUTERS'
         -c ' neighbor 10.0.1.2 peer-group SERVERS'
         -c ' neighbor 10.0.2.2 peer-group SERVERS'
         -c ' address-family ipv4 unicast'
         -c '   redistribute connected'
         -c '  exit-address-family'
         -c '!'
          
    tor1:
      kind: linux
      image: frrouting/frr:v8.2.2
      labels:
        app: frr
      exec:
      - ip link del eth0
      - ip addr add 10.0.0.2/32 dev lo
      - ip addr add 10.0.3.1/24 dev net1
      - ip addr add 10.0.4.1/24 dev net2
      - touch /etc/frr/vtysh.conf
      - sed -i -e 's/bgpd=no/bgpd=yes/g' /etc/frr/daemons
      - /usr/lib/frr/frrinit.sh start
      - >-
         vtysh -c 'conf t'
         -c 'frr defaults datacenter'
         -c 'router bgp 65011'
         -c ' bgp router-id 10.0.0.2'
         -c ' no bgp ebgp-requires-policy'
         -c ' neighbor ROUTERS peer-group'
         -c ' neighbor ROUTERS remote-as external'
         -c ' neighbor SERVERS peer-group'
         -c ' neighbor SERVERS remote-as internal'
         -c ' neighbor net0 interface peer-group ROUTERS'
         -c ' neighbor 10.0.3.2 peer-group SERVERS'
         -c ' neighbor 10.0.4.2 peer-group SERVERS'
         -c ' address-family ipv4 unicast'
         -c '   redistribute connected'
         -c '  exit-address-family'
         -c '!'      
    
    server0:
      kind: linux
      image: nicolaka/netshoot:latest
      network-mode: container:control-plane
      exec:
      - ip addr add 10.0.1.2/24 dev net0
      - ip route replace default via 10.0.1.1

    server1:
      kind: linux
      image: nicolaka/netshoot:latest
      network-mode: container:worker
      exec:
      - ip addr add 10.0.2.2/24 dev net0
      - ip route replace default via 10.0.2.1

    server2:
      kind: linux
      image: nicolaka/netshoot:latest
      network-mode: container:worker2
      exec:
      - ip addr add 10.0.3.2/24 dev net0
      - ip route replace default via 10.0.3.1

    server3:
      kind: linux
      image: nicolaka/netshoot:latest
      network-mode: container:worker3
      exec:
      - ip addr add 10.0.4.2/24 dev net0
      - ip route replace default via 10.0.4.1

  links:
  - endpoints: ["router0:net0", "tor0:net0"]
  - endpoints: ["router0:net1", "tor1:net0"]
  - endpoints: ["tor0:net1", "server0:net0"]
  - endpoints: ["tor0:net2", "server1:net0"]
  - endpoints: ["tor1:net1", "server2:net0"]
  - endpoints: ["tor1:net2", "server3:net0"]

该 topo 中涉及 3 个路由器:router0、tor0、tor1,以及 4 个普通节点:server0、server1、server2、server3,这 4 个节点与 kubernetes 的节点 (容器部署) 共享相同的网络命名空间。上述配置会让路由器启用 BGP 功能,并与 4 个普通节点建立网络连接。

下面看下各个节点是如何配置的。

router0 的配置

下面是 router0 的 bgp 配置,其地址为 10.0.0.0

$ vtysh -c 'conf t'
-c 'router bgp 65000'
-c ' bgp router-id 10.0.0.0'
-c ' no bgp ebgp-requires-policy'
-c ' neighbor ROUTERS peer-group'
-c ' neighbor ROUTERS remote-as external'
-c ' neighbor ROUTERS default-originate'
-c ' neighbor net0 interface peer-group ROUTERS'
-c ' neighbor net1 interface peer-group ROUTERS'
-c ' address-family ipv4 unicast'
-c '   redistribute connected'
-c ' exit-address-family'
-c '!'
  • vtysh -c 'conf t':通过 vtysh 命令进入交互界面,然后进入配置界面

  • 'router bgp 65000': 配置 BGP 路由器的 ASN(AS number),BGP 协议使用该数值来判断 BGP 连接的是内部还是外部。输入该命令之后就可以执行 BGP 命令。

  • 'bgp router-id 10.0.0.0':指定 router-ID,用于标识路由器。此处使用 IP 作为路由标识

  • 'no bgp ebgp-requires-policy':不需要使用策略来交换路由信息。

  • 'neighbor ROUTERS peer-group': 定义一个 peer group,用于交换路由,一个 peer group 中可以有多个 peer

  • 'neighbor ROUTERS remote-as external':router0 的邻居为 tor0 和 tor1,它们都使用不同的 ASN,因此将 tor0 和 tor1 作为 EBGP,EBGP 会在传播路由的时候修改下一跳。参考:EBGP vs IBGP[11]

  • 'neighbor ROUTERS default-originate':将默认路由 0.0.0.0 发送给邻居。

  • 'neighbor net0 interface peer-group ROUTERS'/'neighbor net0 interface peer-group ROUTERS':将对端绑定到一个 peer group。这里的对端可以是接口名称或是邻居标签

  • 'address-family ipv4 unicast':进入 IPv4 单播配置界面

  • 'redistribute connected':将路由从其他协议重新分发到 BGP,此处为系统的直连路由。

  • 'exit-address-family':退出地址族配置。

上述配置中,为 router0 添加了邻居 net0(连接到 tor0) 和 net1(连接到 tor1),并在 BGP 中引入了 ipv4 的直连路由。此时组网如下:

7bb0d64f17fb63bbfa22d07612c38f6e.png
tor0 配置
$ vtysh -c 'conf t'
-c 'frr defaults datacenter'
-c 'router bgp 65010'
-c ' bgp router-id 10.0.0.1'
-c ' no bgp ebgp-requires-policy'
-c ' neighbor ROUTERS peer-group'
-c ' neighbor ROUTERS remote-as external'
-c ' neighbor SERVERS peer-group'
-c ' neighbor SERVERS remote-as internal'
-c ' neighbor net0 interface peer-group ROUTERS'
-c ' neighbor 10.0.1.2 peer-group SERVERS'
-c ' neighbor 10.0.2.2 peer-group SERVERS'
-c ' address-family ipv4 unicast'
-c '   redistribute connected'
-c '  exit-address-family'

此处配置与 router0 大体相同,它同样创建了一个 EBGP 类型的 peer group ROUTERS,将 net0(连接到 router0) 作为邻居。同时它创建一个 IBGP 类型的 peer group SERVERS,并将 server0server1 的地址作为邻居。

tor1tor0 的配置类似,此处不再详述。最后的组网如下。其中 tor0tor1router0 建立了邻居关系。另外需要注意的是,containerlab 网络中的 server0~3 分别与 kubernetes 的对应节点共享网络命名空间。

ddbda93382621021240d721a4436d56b.png

router0 上查看 bgp 邻居关系,可以看到 router0tor0(net0)、tor1(net1) 建立了邻居关系:

router0# show bgp summary

IPv4 Unicast Summary (VRF default):
BGP router identifier 10.0.0.0, local AS number 65000 vrf-id 0
BGP table version 8
RIB entries 15, using 2760 bytes of memory
Peers 2, using 1433 KiB of memory
Peer groups 1, using 64 bytes of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
net0            4      65010        15        15        0    0    0 00:00:20            3        9 N/A
net1            4      65011        15        15        0    0    0 00:00:20            3        9 N/A

Total number of neighbors 2

tor0 上查看邻居关系,可以看到,tor0 并没有与 kubernetes 节点建立邻居关系,因此无法获取 kubernetes pod 节点的路由信息。

tor0# show bgp summary

IPv4 Unicast Summary (VRF default):
BGP router identifier 10.0.0.1, local AS number 65010 vrf-id 0
BGP table version 9
RIB entries 15, using 2760 bytes of memory
Peers 3, using 2149 KiB of memory
Peer groups 2, using 128 bytes of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
router0(net0)   4      65000        19        20        0    0    0 00:00:33            6        9 N/A
10.0.1.2        4          0         0         0        0    0    0    never       Active        0 N/A
10.0.2.2        4          0         0         0        0    0    0    never       Active        0 N/

Total number of neighbors 3

router0 上查看 bgp 发现的路由,可以看到不存在 pod 网段 (10.1.0.0/16) 的路由

router0# show bgp ipv4 all

For address family: IPv4 Unicast
BGP table version is 8, local router ID is 10.0.0.0, vrf id 0
Default local pref 100, local AS 65000
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

   Network          Next Hop            Metric LocPrf Weight Path
*> 10.0.0.0/32      0.0.0.0                  0         32768 ?
*> 10.0.0.1/32      net0                     0             0 65010 ?
*> 10.0.0.2/32      net1                     0             0 65011 ?
*> 10.0.1.0/24      net0                     0             0 65010 ?
*> 10.0.2.0/24      net0                     0             0 65010 ?
*> 10.0.3.0/24      net1                     0             0 65011 ?
*> 10.0.4.0/24      net1                     0             0 65011 ?
*> 172.20.20.0/24   0.0.0.0                  0         32768 ?

Displayed  8 routes and 8 total paths

与 kubernetes 建立 BGP

上述配置中,tor0tor1 已经将 kubernetes 的节点作为 IBGP,下面进行 kubernetes 侧 BPG 配置。cilium 的CiliumBGPPeeringPolicy[12] CRD 中可以配置 BGP peer 信息。

apiVersion: "cilium.io/v2alpha1"
kind: CiliumBGPPeeringPolicy
metadata:
  name: rack0
spec:
  nodeSelector:
    matchLabels:
      rack: rack0
  virtualRouters:
  - localASN: 65010
    exportPodCIDR: true # 自动宣告 Pod CIDR
    neighbors:
    - peerAddress: "10.0.0.1/32" # tor0 的 IP 地址
      peerASN: 65010
---
apiVersion: "cilium.io/v2alpha1"
kind: CiliumBGPPeeringPolicy
metadata:
  name: rack1
spec:
  nodeSelector:
    matchLabels:
      rack: rack1
  virtualRouters:
  - localASN: 65011
    exportPodCIDR: true
    neighbors:
    - peerAddress: "10.0.0.2/32" # tor1 的 IP 地址
      peerASN: 65011

上述配置中将标签为 rack=rack0 的节点 (即 control-planeworker) 与 tor0 建立邻居,将标签为 rack=rack1 的节点 (即 workerworker2) 与 tor1 建立邻居:

$ kubectl get node -l rack=rack0
NAME                                 STATUS   ROLES           AGE     VERSION
clab-bgp-cplane-demo-control-plane   Ready    control-plane   2d11h   v1.24.0
clab-bgp-cplane-demo-worker          Ready    <none>          2d11h   v1.24.0
$ kubectl get node -l rack=rack1
NAME                           STATUS   ROLES    AGE     VERSION
clab-bgp-cplane-demo-worker2   Ready    <none>   2d11h   v1.24.0
clab-bgp-cplane-demo-worker3   Ready    <none>   2d11h   v1.24.0

CiliumBGPPeeringPolicy 各个字段的说明[13]如下

nodeSelector: Nodes which are selected by this label selector will apply the given policy

 virtualRouters: One or more peering configurations outlined below. Each peering configuration can be thought of as a BGP router instance.

    virtualRouters[*].localASN: The local ASN for this peering configuration

    virtualRouters[*].exportPodCIDR: Whether to export the private pod CIDR block to the listed neighbors

    virtualRouters[*].neighbors: A list of neighbors to peer with
        neighbors[*].peerAddress: The address of the peer neighbor
        neighbors[*].peerASN: The ASN of the peer

完成上述配置之后,containerlab 的 router0tor0tor1 就学习到了 kubernetes 的路由信息:

查看 tor0 的 bgp 邻居,可以看到它与 clab-bgp-cplane-demo-control-plane(10.0.1.2)clab-bgp-cplane-demo-worker(10.0.2.2) 成功建立了邻居关系:

tor0# show bgp summary

IPv4 Unicast Summary (VRF default):
BGP router identifier 10.0.0.1, local AS number 65010 vrf-id 0
BGP table version 13
RIB entries 23, using 4232 bytes of memory
Peers 3, using 2149 KiB of memory
Peer groups 2, using 128 bytes of memory

Neighbor                                     V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
router0(net0)                                4      65000      1430      1431        0    0    0 01:10:58            8       13 N/A
clab-bgp-cplane-demo-control-plane(10.0.1.2) 4      65010        46        52        0    0    0 00:02:12            1       11 N/A
clab-bgp-cplane-demo-worker(10.0.2.2)        4      65010        47        53        0    0    0 00:02:15            1       11 N/A

Total number of neighbors 3

查看 tor1 的 bgp 邻居,可以看到它与 clab-bgp-cplane-demo-worker2(10.0.3.2)clab-bgp-cplane-demo-worker3(10.0.4.2) 成功建立了邻居关系:

tor1# show bgp summary

IPv4 Unicast Summary (VRF default):
BGP router identifier 10.0.0.2, local AS number 65011 vrf-id 0
BGP table version 13
RIB entries 23, using 4232 bytes of memory
Peers 3, using 2149 KiB of memory
Peer groups 2, using 128 bytes of memory

Neighbor                               V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
router0(net0)                          4      65000      1436      1437        0    0    0 01:11:15            8       13 N/A
clab-bgp-cplane-demo-worker2(10.0.3.2) 4      65011        53        60        0    0    0 00:02:31            1       11 N/A
clab-bgp-cplane-demo-worker3(10.0.4.2) 4      65011        54        61        0    0    0 00:02:33            1       11 N/A

Total number of neighbors 3

查看 route0 的配置可以发现其获取到了 Pod 的路由信息:

router0# show bgp ipv4 all

For address family: IPv4 Unicast
BGP table version is 12, local router ID is 10.0.0.0, vrf id 0
Default local pref 100, local AS 65000
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

   Network          Next Hop            Metric LocPrf Weight Path
*> 10.0.0.0/32      0.0.0.0                  0         32768 ?
*> 10.0.0.1/32      net0                     0             0 65010 ?
*> 10.0.0.2/32      net1                     0             0 65011 ?
*> 10.0.1.0/24      net0                     0             0 65010 ?
*> 10.0.2.0/24      net0                     0             0 65010 ?
*> 10.0.3.0/24      net1                     0             0 65011 ?
*> 10.0.4.0/24      net1                     0             0 65011 ?
*> 10.1.0.0/24      net0                                   0 65010 i
*> 10.1.1.0/24      net1                                   0 65011 i
*> 10.1.2.0/24      net0                                   0 65010 i
*> 10.1.3.0/24      net1                                   0 65011 i
*> 172.20.20.0/24   0.0.0.0                  0         32768 ?

Displayed  12 routes and 12 total paths

kubernetes 的 Pod 网络

本环境下,kubernetes 的 Pod 通过分别连接到 pod 命名空间和 host 命名空间的一对 veth 实现互通,当报文从 pod 命名空间传递到 host 命名空间之后就会通过 host 路由进行报文分发。

26cee1d593f43d36cecfa580490919b0.png

pod 内部的默认路由的网关地址是 host 的 cilium_host 接口地址,但响应给 pod 的 arp 是接口 lxc-xxx(即另一个 veth 接口) 的 MAC 地址,实现流程如下:

d32435e5adf8062379e85921174ecfe5.png

思考

如果将 router0tor0tor1 和 kubernetes 的所有节点作为一个 IBGP 会怎么样 (即所有的 ASN 都相同,都是 internal 类型的)?

答:此时由于 tor0tor1 无法将学习到的路由转发给 router0,将导致 router0 缺少 pod 路由,进而导致网络 tor0tor1 不通

EBGP 和 IBGP 在技术实现上的第三个区别在路由转发的行为上。通过 IBGP 学习到的路由,不能传递给其他的 IBGP。 这么作是为了防止路由环路(loop)。EBGP 通过 BGP 协议里面的 AS_PATH 和其他元素过滤来自于自己的路由,但是 IBGP 运行在一个 AS 内部,没有 AS_PATH,所以 IBGP 干脆不转发来自于其他 IBGP 的路由。

由于不能转发路由,这要求所有的 IBGP router 两两相连,组成一个 full-mesh 的网络。Full-mesh 的连接数与节点的关系是 n*(n-1),连接数随着节点数的增加而迅速增加,这给配置和管理带来了问题。

参考

  • bgp-in-the-data-center[14]

  • Packet_Walks_In_Kubernetes-v4[15]

  • cilium-life-of-a-packet-pod-to-service[16]

TIPs:

  • BGP 简单调试:首先使用 show bgp summary 查看本节点与邻居是否协商成功,然后使用 show bgp ipv4 wide 查看本节点学习到的路由即可。

  • 此外还可以通过 show bgp neighbor 查看邻居状态,以及通过 show bgp peer-group 查看 peer group 的信息,使用 show bgp nexthop 查看下一跳表。

引用链接

[1]

containerLab: https://containerlab.dev/

[2]

节点: https://containerlab.dev/manual/nodes/

[3]

类型: https://containerlab.dev/manual/kinds/

[4]

安装: https://containerlab.dev/install/

[5]

网络模式: https://containerlab.dev/manual/nodes/#network-mode

[6]

container mode: https://containerlab.dev/manual/nodes/#container-mode

[7]

命令: https://containerlab.dev/cmd/graph/

[8]

官方给出了很多配置组网的例子: https://containerlab.dev/lab-examples/lab-examples/

[9]

FRR: https://containerlab.dev/lab-examples/frr01/

[10]

手册: https://docs.frrouting.org/en/latest/bgp.html#

[11]

EBGP vs IBGP: https://sulinyn.blog.csdn.net/article/details/123394764?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-123394764-blog-103985347.pc_relevant_multi_platform_featuressortv2dupreplace&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-123394764-blog-103985347.pc_relevant_multi_platform_featuressortv2dupreplace&utm_relevant_index=1

[12]

CiliumBGPPeeringPolicy: https://docs.cilium.io/en/stable/gettingstarted/bgp-control-plane/#ciliumbgppeeringpolicy-crd

[13]

说明: https://docs.cilium.io/en/stable/gettingstarted/bgp-control-plane/#fields

[14]

bgp-in-the-data-center: https://docs.jetstream-cloud.org/attachments/bgp-in-the-data-center.pdf

[15]

Packet_Walks_In_Kubernetes-v4: https://events19.linuxfoundation.org/wp-content/uploads/2018/07/Packet_Walks_In_Kubernetes-v4.pdf

[16]

cilium-life-of-a-packet-pod-to-service: https://arthurchiao.art/blog/cilium-life-of-a-packet-pod-to-service/

b99253f38a1eddb3b8b414ea6e249e6f.gif

7b745eced8bcc05c94427dc5948264c1.png

你可能还喜欢

点击下方图片即可阅读

云原生备份恢复工具 Velero 二开实战

2022-09-23

8e9cd9e744782461114f27759c8ba189.jpeg

K8s 环境下研发如何本地调试?kt-connect 使用详解

2022-09-22

1b390de5d4e8bb461e52059061909735.jpeg

使用 Railway 和 Supabase 零成本搭建 n8n 自动化平台

2022-09-15

e2165815017077a75be7b5c3ad9cd4b3.jpeg

给 K8s 中的 Operator 添加 Webhook 功能【保姆级】

2022-09-13

aa30a411a38737d387770ab40ea5807a.jpeg

6d5201d51137c984a09f1ef69b45f5c0.gif

云原生是一种信仰 🤘

关注公众号

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!

ad38d151b4de9974c994eb157b5f94e4.gif

4244e240fa7ddbdec2c18bd82edbe587.gif

点击 "阅读原文" 获取更好的阅读体验!

发现朋友圈变“安静”了吗?

01e67c88559b42c8e228a5b4353a5d95.gif

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值