路由器bgp协议对接生产K8S集群网络(Calico)

本文详细介绍了如何将路由器通过BGP协议与使用Calico的Kubernetes集群进行对接。首先,讲解了Calico客户端工具calicoctl的安装和配置,包括在物理主机和Kubernetes上的部署方式,以及配置文件的设置。接着,阐述了路由器Quagga的安装和配置步骤。最后,提到了修改K8S Calico配置的方法,并进行了状态验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

路由器对接K8S集群网络(Calico)

在这里插入图片描述

一、Calico 客户端管理工具(calicoctl)安装和配置

1 calicoctl 工具下载安装

calicoctl 工具可以通过命令行读取、创建、更新和删除 Calico 的存储对象。
Calico 对象可以存储在 Etcd 服务或者 Kubernetes 服务中;在安装 Calico 的时候,需要选择其数据存储的位置。
在使用 calicoctl 管理工具时,你也可以选择工具部署的位置。

  1. 直接部署在物理主机上。
  2. 部署在容器化服务中。
  3. 部署在Kubernetes 容器编排工具的Pod中。

1.1 直接部署在物理主机

curl -O -L  https://github.com/projectcalico/calicoctl/releases/download/v3.21.5/calicoctl-linux-amd64
mv calicoctl-linux-amd64 /usr/bin/calicoctl
chmod +x /usr/bin/calicoctl

1.2 部署在Kubernetes 上

官方提供了 calicoctl 的容器和 Kubernetes yaml 文件,我们可以直接使用:

#数据存储在 etcd 服务中,对应2.1
kubectl apply -f https://docs.projectcalico.org/manifests/calicoctl-etcd.yaml
#数据存储在 Kubernetes API datastore 服务中,对应2.2
kubectl apply -f https://docs.projectcalico.org/manifests/calicoctl.yaml

2 calicoctl 配置文件

calicoctl 在使用过程中,需要从配置文件中读取 Calico 对象存储地址等信息。

  1. calicoctl 的配置文件默认存储位置 /etc/calico/calicoctl.cfg。
  2. 可以通过 –config 选项,覆盖配置文件的读取位置。
  3. 配置文件的内容可以是 Json 类型也可以是 Yaml 类型。
  4. 如果 calicoctl 找不到配置文件的话,会读取环境变量。

以下2选1

2.1 calicoctl 连接etcd 服务

calicoctl 客户端连接 Etcd 服务进行管理, 配置文件示例:

apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  etcdEndpoints: https://etcd1:2379,https://etcd2:2379,https://etcd3:2379
  etcdKeyFile: /etc/kubernetes/pki/etcd/server.key
  etcdCertFile: /etc/kubernetes/pki/etcd/server.crt
  etcdCACertFile: /etc/kubernetes/pki/etcd/ca.crt
2.2 calicoctl 连接 Kubernetes 服务

calicoctl 客户端连接 Kubernetes 服务进行管理,配置文件示例:

apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  datastoreType: "kubernetes"
  kubeconfig: "/path/to/.kube/config"

3 配置文件验证

这里有一个简单的命令用于验证 calicoctl 的安装和配置是否正确。

calicoctl node status
calicoctl get nodes

如果一切正常,则会返回已经注册的主机节点列表。
如果返回为空,则可能配置了错误的数据存储地址datastore或者 Calico 服务还没有主机注册。
如果返回错误信息,则请修复后重试。

二、路由器quagga安装和配置

安装quagga

yum install quagga telnet -y

拷贝配置文件:

cp /usr/share/doc/quagga-0.99.22.4/zebra.conf.sample /etc/quagga/zebra.conf
cp /usr/share/doc/quagga-*/bgpd.conf.sample /etc/quagga/bgpd.conf

编辑bgpd.conf文件:

router bgp 65186 
 bgp router-id 192.168.3.53
 network 192.168.10.0
 neighbor 192.168.3.81 remote-as 65186
 neighbor 192.168.3.81 route-reflector-client
 neighbor 192.168.3.82 remote-as 65186
 neighbor 192.168.3.82 route-reflector-client
 neighbor 192.168.3.83 remote-as 65186
 neighbor 192.168.3.83 route-reflector-client

启动服务:

systemctl enable zebra --now
systemctl enable bgpd --now

进入路由器console:

cd /etc/quagga
vtysh
提示一下:
Hello, this is Quagga (version 0.99.22.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

进入配置模式,配置端口地址并保存

docker01# conf t
docker01(config)#hostname bgp-RR
bgp-RR(config)#int eth0
bgp-RR(config-if)# ip add 192.168.3.53/24
bgp-RR(config-if)# no shutdown
bgp-RR(config-if)#end
bgp-RR#wr

三、修改K8s calico配置

1 K8S集群操作

创建2个yaml文件:

# cat calico1.yaml 
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: false
  asNumber: 65186
cat calico2.yaml 
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: bgppeer-global-211
spec:
  peerIP: 192.168.3.53
  asNumber: 65186

备注:k8s 19.0以上版本apiVersion需要更改为:crd.projectcalico.org/v1
应用:

calicoctl create -f calico1.yaml 
calicoctl create -f calico2.yaml

2 验证状态

路由器查看配置:

bgp-RR# show ip bgp summary  
BGP router identifier 192.168.3.53, local AS number 65186
RIB entries 7, using 784 bytes of memory
Peers 3, using 13 KiB of memory

Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
192.168.3.81    4 65186       6      11        0    0    0 00:03:41        1
192.168.3.82    4 65186       6      11        0    0    0 00:03:43        1
192.168.3.83    4 65186       6      11        0    0    0 00:03:41        1

Total number of neighbors 3
bgp-RR# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, A - Babel,
       > - selected route, * - FIB route

K>* 0.0.0.0/0 via 192.168.3.1, eth0
B>* 10.255.30.0/26 [200/0] via 192.168.3.82, eth0, 00:03:47
B>* 10.255.91.128/26 [200/0] via 192.168.3.83, eth0, 00:03:45
B>* 10.255.126.192/26 [200/0] via 192.168.3.81, eth0, 00:03:45
C>* 127.0.0.0/8 is directly connected, lo
C>* 172.17.0.0/16 is directly connected, docker0
C>* 192.168.3.0/24 is directly connected, eth0

k8s master节点查看路由:

[root@k8s21-master01 ~]# ip route
default via 192.168.3.1 dev eth0 proto static metric 100 
10.255.30.0/26 via 192.168.3.82 dev tunl0 proto bird onlink 
10.255.91.128/26 via 192.168.3.83 dev tunl0 proto bird onlink 
blackhole 10.255.126.192/26 proto bird 
10.255.126.253 dev calic5f7b738d4b scope link 
10.255.126.254 dev cali25736fd0fdb scope link 
10.255.126.255 dev cali5344222d830 scope link 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.3.0/24 dev eth0 proto kernel scope link src 192.168.3.81 metric 100 
192.168.10.0/24 via 192.168.3.53 dev eth0 proto bird 


[root@k8s21-master01 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+-----------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE |  SINCE   |    INFO     |
+--------------+-----------+-------+----------+-------------+
| 192.168.3.53 | global    | up    | 04:07:59 | Established |
+--------------+-----------+-------+----------+-------------+

IPv6 BGP status
No IPv6 peers found.


[root@k8s21-master01 ~]# calicoctl get bgpconfig default
NAME      LOGSEVERITY   MESHENABLED   ASNUMBER   
default   Info          false         65186
<think>好的,我需要帮用户了解如何在Kubernetes中部署FRRouting(FRR)作为VNF来提供路由功能。首先,我得回忆一下FRR是什么,它有什么作用。FRR是一个开源的网络路由软件套件,支持BGP、OSPF、RIP等协议,通常用于路由器网络设备中。用户的需求是将其部署为Kubernetes中的虚拟网络功能(VNF),对外提供路由服务。 接下来,我得考虑Kubernetes中部署FRR的基本步骤。首先,可能需要创建一个Docker镜像,里面包含FRR的安装和配置。用户可能需要自定义配置,比如BGP邻居设置或OSPF区域。然后,需要将这个镜像部署到Kubernetes集群中,可能涉及Deployment、Service、ConfigMap等资源。 然后,网络配置是关键。因为FRR需要处理网络数据包,可能需要特权模式或者特定的Linux能力,比如NET_ADMIN。此外,网络模式方面,可能需要使用hostNetwork来让Pod直接使用宿主机的网络命名空间,这样FRR才能正确捕获和处理网络接口的流量。但用户得注意这样做可能的安全隐患。 另外,持久化配置的问题。使用ConfigMap来管理FRR的配置文件是个好方法,这样配置可以版本控制,并且方便更新。不过FRR的配置可能比较复杂,特别是动态路由协议部分,需要正确设置邻居、AS号等参数。 服务暴露方面,可能需要使用LoadBalancer或者NodePort类型的Service,但如果是BGP这样的路由协议,可能更依赖于直接的路由通告,而不是传统的Kubernetes服务暴露方式。这时候,宿主机的网络配置可能需要配合,比如允许Pod通过BGP与外部路由器对等。 高可用性方面,可以考虑部署多个FRR实例,并利用Kubernetes的副本集,但需要注意路由协议本身的机制,比如BGP的会话保持,避免脑裂问题。可能还需要使用StatefulSet,但FRR本身可能不需要持久化存储,除非有复杂的配置需要保持。 安全方面,需要确保FRR容器有足够的权限运行,但又不能过度赋予权限。比如,使用securityContext中的capabilities来添加NET_ADMIN,而不是直接使用特权模式。这需要在Deployment中正确配置。 另外,监控和日志也很重要。部署后,需要检查FRR的日志,确认路由是否正确学习和通告。可能需要集成Kubernetes的日志收集工具,如Fluentd或Loki,来方便问题排查。 可能还需要考虑网络插件的影响,比如Calico、Cilium等CNI插件是否与FRR兼容,或者是否需要特定的配置。例如,Calico本身支持BGP,可能和FRR存在冲突,需要合理规划网络架构。 测试步骤方面,用户可能需要进入FRR的Pod,使用vtysh命令检查路由状态,确认BGP邻居是否建立,OSPF邻居是否正常,以及路由表是否正确。此外,外部路由器需要配置与FRR实例的对等连接,确保路由信息的交换。 最后,可能有一些优化点,比如调整资源限制,确保FRR Pod有足够的CPU和内存处理路由更新,特别是在大规模网络中。或者,使用Init Container来预加载配置或检查网络环境。 总结下来,步骤大致是:准备FRR镜像、编写配置文件、创建Kubernetes资源(ConfigMap、Deployment、Service等)、处理网络权限、暴露服务、测试验证。同时要注意高可用、安全、监控等方面的问题。</think>在Kubernetes中部署FRRouting(FRR)作为虚拟网络功能(VNF)对外提供路由功能,可以通过以下步骤实现。FRR是一个支持BGP、OSPF、RIP等协议的开源路由软件,将其容器化后部署在Kubernetes集群中,可实现动态路由的灵活管理。 --- ### **1. 准备FRR容器镜像** 首先构建包含FRR的Docker镜像,或直接使用官方镜像(如 `docker.io/frrouting/frr`)。若需自定义配置,可编写Dockerfile: ```dockerfile FROM frrouting/frr:latest COPY frr.conf /etc/frr/daemons COPY bgpd.conf /etc/frr/bgpd.conf CMD ["/sbin/frr", "-d"] ``` --- ### **2. 配置FRR路由协议** 通过ConfigMap管理FRR的配置文件。例如,配置BGP协议: ```yaml # frr-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: frr-config data: daemons: | bgpd=yes ospfd=no bgpd.conf: | router bgp 65000 neighbor 192.168.1.1 remote-as 65001 network 10.0.0.0/24 ``` --- ### **3. 部署FRR到Kubernetes** 创建Deployment,挂载ConfigMap并配置网络权限: ```yaml # frr-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: frr-router spec: replicas: 2 selector: matchLabels: app: frr template: metadata: labels: app: frr spec: containers: - name: frr image: frrouting/frr:latest securityContext: capabilities: add: ["NET_ADMIN", "NET_RAW"] # 允许操作网络栈 volumeMounts: - name: frr- name: frr-config configMap: name: frr-config hostNetwork: true # 使用宿主机网络命名空间 ``` --- ### **4. 关键配置说明** - **网络模式**:使用 `hostNetwork: true` 让Pod直接使用宿主机的网络接口,确保FRR能捕获物理网卡流量。 - **权限配置**:通过 `securityContext` 授予 `NET_ADMIN` 和 `NET_RAW` 能力,允许修改路由表和抓包。 - **高可用**:部署多个副本并结合BGP/OSPF的协议特性(如Graceful Restart)实现高可用。 --- ### **5. 验证部署** 进入Pod执行 `vtysh` 检查路由状态: ```bash kubectl exec -it <frr-pod-name> -- vtysh # 在FRR Shell中执行: show running-config show bgp summary ``` --- ### **6. 外部路由对接** 确保外部路由器与FRR Pod所在节点的IP可达,并配置对等连接。例如,在外部路由器上添加BGP邻居: ``` router bgp 65001 neighbor <K8s节点IP> remote-as 65000 ``` --- ### **注意事项** - **网络插件兼容性**:若集群使用Calico/Cilium等CNI插件,需避免BGP端口冲突(默认TCP 179)。 - **服务暴露**:若需通过Service暴露路由服务,可使用 `LoadBalancer` 类型并配置外部IP。 - **持久化配置**:动态路由配置变更后,需更新ConfigMap并重启Pod。 --- 通过上述步骤,FRR可作为Kubernetes中的VNF提供企业级路由功能,适合混合云、边缘网络等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值