如何配置Cilium和BGP协同工作呢?

载自:「yoaz 的博客」
原文:https://url.hi-linux.com/12rw2
背景
官方提供了多篇文档说明如何配置 cilium 和 bgp 协同工作,本文主要对以下部分功能进行验证:
using bird to run bgp[1]
using kube-router to run bgp[2]
bgp[3]
cilium bgp control plane[4]
为了模拟支持 bgp 的网络环境,文中所有节点均是通过 vagrant 创建的 vm, 网络拓扑如下图。
注意:实际配置时使用 vagrant 创建的 vm 模拟网络环境并不便利。可以参考以下文章,使用 containerlab 和 kind 进行验证。
上图中,router 节点包含多张网卡并将作为其他两台主机的网关,对应的系统配置如下:
net.ipv4.ip_forward = 1net.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1net.ipv6.conf.lo.disable_ipv6 = 1net.ipv6.conf.all.forwarding = 1  
node1、node2 节点均只包含一张网卡,其默认路由均指向 router 节点(node1 指向 10.0.1.2,node2 指向 10.0.2.2)。
node1、node2 上将部署 kubernetes 和 cilium。
基于 bird 部署容器网络
cilium 为 podcidr 提供了 encapsulation 和 native-routing 两种组网方式。
native-routing 方案中,cilium 会将 podcidr 中的跨节点流量委托给 linux 内核的路由子系统,此时 linux 内核需要知道如何路由 podcidr 中的特定地址。
当用户的所有 node 处于同一个 l2 网络时,我们可以设置参数 autodirectnoderoutes=true ,此时整个 podcidr 路由信息被插入到每个节点的内核路由表中,用户无需其他额外工作即部署完成。
上述测试环境中,node1 和 node2 分别处于 10.0.1.0/24 和 10.0.2.0/24 ,并不满足设置 autodirectnoderoutes 的条件,因此我们需要借助设置 bgp 服务完成 podcidr 组网。
参考 using bird to run bgp[5] 文档中的描述,并结合测试环境的网络拓扑,我们设定测试节点的 asn 如下图:
1. frr 设置
在 router 上部署软件路由器 frr , 如下:
frrver=frr-stablecurl -o https://rpm.frrouting.org/repo/$frrver-repo-1-0.el7.noarch.rpmsudo yum install ./$frrver*sudo yum install frr frr-pythontools  
修改 /etc/frr/daemons 文件,打开 bgpd 功能(设置配置文件中 bgpd=yes)。编辑 /etc/frr/frr.conf 文件,写入以下 bgp 相关的配置:
frr version 8.4.1frr defaults traditionalhostname router                        # 主机名log syslog informational!router bgp 65100                       # router 节点的本地 asn bgp router-id 192.168.121.16          # router-id no bgp ebgp-requires-policy neighbor 10.0.1.10 remote-as 65010    # 配置 node1 作为 router 的邻居,asn 为 65010 neighbor 10.0.2.10 remote-as 65020    # 配置 node2 作为 router 的邻居,asn 为 65020exit!  
完成上述配置后,启动 frr 服务 systemctl restart frr !
2. 部署 cilium
登录 node1 或 node2 部署 cilium,配置如下:
k8sservicehost: 10.0.1.10k8sserviceport: 6443kubeproxyreplacement: strictdevices: eth1ipam:  operator:    clusterpoolipv4podcidr: 172.31.254.0/23    clusterpoolipv4podcidrlist: []    clusterpoolipv4masksize: 26loadbalancer:  mode: dsrtunnel: disabled autodirectnoderoutes: falsebpf:  masquerade: trueipv4nativeroutingcidr: 172.31.254.0/23socketlb:  enabled: truenodeport:  enabled: trueexternalips:  enabled: truehostport:  enabled: true  
cilium 容器就绪后,kubernetes 集群中可以正常创建容器并分配容器ip,但是跨节点容器无法正常通信。
3. 部署 bird
cilium 官方文档中,给出了 bird2 的配置示例。我们可以直接通过 yum -y install bird2 安装。
查看各个节点分配的 podcidr 网段,执行kubectl -n kube-system exec -it ds/cilium -- cilium node list:
参考以下配置 bird2 服务,配置文件 /etc/bird.conf
router id 10.0.1.10;protocol device {    scan time 10;           # scan interfaces every 10 seconds}# disable automatically generating direct routes to all network interfaces.protocol direct {    disabled;               # disable by default}# forbid synchronizing bird routing tables with the os kernel.protocol kernel {    ipv4 {                # connect protocol to ipv4 table by channel        import none;      # import to table, default is import all        export none;      # export to protocol. default is export none    };}# static ipv4 routes.protocol static {    ipv4;    route 172.31.254.0/26 via cilium_host;    # 将 podcicr 通告到上游,ps:这里是 node1 分配到的 podcidr}# bgp peersprotocol bgp uplink0 {    description bgp uplink 0;    local 10.0.1.10 as 65010;                   # 设置当前节点的 asn ,ps:这里示例的是 node1    neighbor 10.0.1.2 as 65100;                 # 设置节点的 neighbor, 这里是 router 节点    ipv4 {        import filter {reject;};        export filter {accept;};    };}  
在 node1、node2 按照上述方式配置完成 bird2 后启动服务。执行以下命令检查 bgp 连接是否正常:
# 在 router 执行以下命令# 查看 bgp peer 连接vtysh -c show bgp summary# 查看注册到 router 的路由信息vtysh -c show bgp ipv4 all  
完成上述流程后,使得 node1 和 node2 上的容器网络打通,并且任意以 router 节点作为默认网关的服务器都可以直连 podip。
查看 router 接地的路由信息如下:
上图中,我们发现 router 节点被注入了 podcidr 。
本文测试环境的网络拓扑非常简单,实际上直接通过命令行直接在 router 节点上插入路由信息可以达到同样效果。在实际生产中,我们可以通过 bgp 动态发现简化配置流程。
内置 bgp
cilium 1.10 之后的版本内置了 bgp speaker  的功能,用户无需在节点上部署 bird2 也可以向外广播节点的 podcidr 信息,并且 1.12 版本中 cilium 参考 metallb 实现支持基于 bgp + ecmp 的 loadbalancer 功能。
参考文档[6]中的描述,启用内置的 bgp 能力需要额外创建以下 configmap,cilium-agent 和 cilium-operator 启动时均会挂载该配置。
apiversion: v1kind: configmapmetadata:  name: bgp-config  namespace: kube-systemdata:  config.yaml: |    peers:      - peer-address: 192.168.121.16        peer-asn: 65100        my-asn: 65000    address-pools:      - name: default        protocol: bgp        addresses:          - 192.0.2.0/24    
上述配置中,cilium 将使用 192.168.121.16 连接 router 节点的 bgpd 服务(ps:bgp 建立连接是基于 tcp 的),并且 node1 和 node2 将使用相同的 asn 65000。
address-pools 指定的是 loadbalanacer 的 ip 地址池,当用户创建 loadbalancer 类型的 service 时,cilium 将自动从该地址池中分配 ip 地址,并自动进行 bgp 宣告。
安装上述 configmap 后,我们需要为 cilium 为添加如下配置:
bgp:  enabled: true  announce:    loadbalancerip: true    podcidr: trueloadbalancer:  mode: snat      # 此处使用 dsr 模式时,存在问题  
创建 service 如下:
apiversion: v1kind: servicemetadata:  name: whoami-lbspec:  type: loadbalancer  ports:  - port: 80    targetport: 80    protocol: tcp    name: http  selector:    app: whoami  
cilium 自动分配 192.0.2.0 作为 service 的 external-ip:
我们登录 router 节点通过 vtysh 查看 cilium 是否 bgpd 服务建立了连接,并且查看其通告的路由信息如下:
需要注意,router 节点上我们需要添加 ecmp 的相关配置,并且依然静态指定 node1 和 node2 作为 neighbor 如下:
frr version 8.4.1frr defaults traditionalhostname routerlog syslog informational!router bgp 65100 bgp bestpath as-path multipath-relax bgp bestpath bandwidth skip-missing bgp router-id 192.168.121.16 no bgp ebgp-requires-policy neighbor 10.0.1.10 remote-as 65000 neighbor 10.0.2.10 remote-as 65000exit!  
执行 vtysh -c show bgp ipv4 unicast 192.0.2.0/32 我们可以查看当前,frr 执行 ecmp 时的路径选择:
cilium bgp control plane
bgp controller 控制器是 cilium 高版本推出的针对内置 bgp speaker 更加细粒度的控制功能,其功能是上述 configmap 的扩展。


TDK 株式会社扩大了其用于汽车应用的贴片压敏电阻的产品阵容
定华成功入选2022年度秦创原“科学家+工程师”队伍!
三相交直流功率源的功能有哪些
人工智能到底会不会威胁到人类
基于AD7606系列器件在电力线监测及保护产品设计中的应用
如何配置Cilium和BGP协同工作呢?
霍尼韦尔推出新温度监控解决方案,能在两秒钟内自动检测皮肤温度
Kotlin协程实战进阶之筑基篇1
首尔半导体:全球领先的专业LED制造商
【计算机组成原理】最后的35分
静电除尘三相电源主电路原理图
探讨自动驾驶系统感知系统
浅析交流接触器运用IT7300交流电源测试应用
考虑线损的中压配电网规划方法
电容器主动投切的操控原理图
量子点大战OLED 胜负明年见分晓?
手机芯片有什么作用
为什么要使用电话机器人,其理由是什么
苹果明年推出4.7英寸廉价版iPhone,或将是iPhone SE 2
荣耀V9怎么样?华为荣耀V9深度评测:使用90天评测,荣耀V9全方位细节分析