載自:「Yoaz 的博客」
原文:https://url.hi-linux.com/12Rw2
背景
官方提供了多篇文檔說明如何配置 Cilium 和 BGP 協(xié)同工作,本文主要對以下部分功能進(jìn)行驗(yàn)證:
Using BIRD to run BGP[1]
Using kube-router to run BGP[2]
BGP[3]
Cilium BGP Control Plane[4]
為了模擬支持 BGP 的網(wǎng)絡(luò)環(huán)境,文中所有節(jié)點(diǎn)均是通過 vagrant 創(chuàng)建的 VM, 網(wǎng)絡(luò)拓?fù)淙缦聢D。
注意:實(shí)際配置時(shí)使用 vagrant 創(chuàng)建的 VM 模擬網(wǎng)絡(luò)環(huán)境并不便利。可以參考以下文章,使用 ContainerLab 和 Kind 進(jìn)行驗(yàn)證。
上圖中,Router 節(jié)點(diǎn)包含多張網(wǎng)卡并將作為其他兩臺主機(jī)的網(wǎng)關(guān),對應(yīng)的系統(tǒng)配置如下:
net.ipv4.ip_forward=1 net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6=1 net.ipv6.conf.lo.disable_ipv6=1 net.ipv6.conf.all.forwarding=1
node1、node2 節(jié)點(diǎn)均只包含一張網(wǎng)卡,其默認(rèn)路由均指向 router 節(jié)點(diǎn)(node1 指向 10.0.1.2,node2 指向 10.0.2.2)。
node1、node2 上將部署 Kubernetes 和 Cilium。
基于 Bird 部署容器網(wǎng)絡(luò)
Cilium 為 PodCIDR 提供了 Encapsulation 和 Native-Routing 兩種組網(wǎng)方式。
Native-Routing 方案中,Cilium 會將 PodCIDR 中的跨節(jié)點(diǎn)流量委托給 Linux 內(nèi)核的路由子系統(tǒng),此時(shí) Linux 內(nèi)核需要知道如何路由 PodCIDR 中的特定地址。
當(dāng)用戶的所有 Node 處于同一個(gè) L2 網(wǎng)絡(luò)時(shí),我們可以設(shè)置參數(shù) autoDirectNodeRoutes=true ,此時(shí)整個(gè) PodCIDR 路由信息被插入到每個(gè)節(jié)點(diǎn)的內(nèi)核路由表中,用戶無需其他額外工作即部署完成。
上述測試環(huán)境中,Node1 和 Node2 分別處于 10.0.1.0/24 和 10.0.2.0/24 ,并不滿足設(shè)置 autoDirectNodeRoutes 的條件,因此我們需要借助設(shè)置 BGP 服務(wù)完成 PodCIDR 組網(wǎng)。
參考Using BIRD to run BGP[5]文檔中的描述,并結(jié)合測試環(huán)境的網(wǎng)絡(luò)拓?fù)?,我們設(shè)定測試節(jié)點(diǎn)的 ASN 如下圖:
1. FRR 設(shè)置
在 router 上部署軟件路由器 FRR , 如下:
FRRVER="frr-stable" curl-Ohttps://rpm.frrouting.org/repo/$FRRVER-repo-1-0.el7.noarch.rpm sudoyuminstall./$FRRVER* sudoyuminstallfrrfrr-pythontools
修改 /etc/frr/daemons 文件,打開 bgpd 功能(設(shè)置配置文件中 bgpd=yes)。編輯 /etc/frr/frr.conf 文件,寫入以下 BGP 相關(guān)的配置:
frrversion8.4.1 frrdefaultstraditional hostnamerouter#主機(jī)名 logsysloginformational ! routerbgp65100#router節(jié)點(diǎn)的本地ASN bgprouter-id192.168.121.16#router-id nobgpebgp-requires-policy neighbor10.0.1.10remote-as65010#配置Node1作為router的鄰居,ASN為65010 neighbor10.0.2.10remote-as65020#配置Node2作為router的鄰居,ASN為65020 exit !
完成上述配置后,啟動(dòng) frr 服務(wù)systemctl restart frr!
2. 部署 Cilium
登錄 Node1 或 Node2 部署 Cilium,配置如下:
k8sServiceHost:"10.0.1.10" k8sServicePort:6443 kubeProxyReplacement:strict devices:eth1 ipam: operator: clusterPoolIPv4PodCIDR:"172.31.254.0/23" clusterPoolIPv4PodCIDRList:[] clusterPoolIPv4MaskSize:26 loadBalancer: mode:dsr tunnel:disabled autoDirectNodeRoutes:false bpf: masquerade:true ipv4NativeRoutingCIDR:"172.31.254.0/23" socketLB: enabled:true nodePort: enabled:true externalIPs: enabled:true hostPort: enabled:true
Cilium 容器就緒后,Kubernetes 集群中可以正常創(chuàng)建容器并分配容器IP,但是跨節(jié)點(diǎn)容器無法正常通信。
3. 部署 Bird
Cilium 官方文檔中,給出了 Bird2 的配置示例。我們可以直接通過yum -y install bird2安裝。
查看各個(gè)節(jié)點(diǎn)分配的 PodCIDR 網(wǎng)段,執(zhí)行kubectl -n kube-system exec -it ds/cilium -- cilium node list:
參考以下配置 bird2 服務(wù),配置文件 /etc/bird.conf
routerid10.0.1.10; protocoldevice{ scantime10;#Scaninterfacesevery10seconds } #Disableautomaticallygeneratingdirectroutestoallnetworkinterfaces. protocoldirect{ disabled;#Disablebydefault } #ForbidsynchronizingBIRDroutingtableswiththeOSkernel. protocolkernel{ ipv4{#ConnectprotocoltoIPv4tablebychannel importnone;#Importtotable,defaultisimportall exportnone;#Exporttoprotocol.defaultisexportnone }; } #StaticIPv4routes. protocolstatic{ ipv4; route172.31.254.0/26via"cilium_host";#將 PodCICR 通告到上游,PS:這里是 Node1 分配到的 PodCIDR } #BGPpeers protocolbgpuplink0{ description"BGPuplink0"; local10.0.1.10as65010;#設(shè)置當(dāng)前節(jié)點(diǎn)的 ASN ,PS:這里示例的是 Node1 neighbor10.0.1.2as65100;#設(shè)置節(jié)點(diǎn)的Neighbor,這里是router節(jié)點(diǎn) ipv4{ importfilter{reject;}; exportfilter{accept;}; }; }
在 Node1、Node2 按照上述方式配置完成 Bird2 后啟動(dòng)服務(wù)。執(zhí)行以下命令檢查 BGP 連接是否正常:
#在router執(zhí)行以下命令 #查看bgppeer連接 vtysh-c"showbgpsummary" #查看注冊到router的路由信息 vtysh-c"showbgpipv4all"
完成上述流程后,使得 Node1 和 Node2 上的容器網(wǎng)絡(luò)打通,并且任意以 router 節(jié)點(diǎn)作為默認(rèn)網(wǎng)關(guān)的服務(wù)器都可以直連 PodIP。
查看 router 接地的路由信息如下:
上圖中,我們發(fā)現(xiàn) router 節(jié)點(diǎn)被注入了 PodCIDR 。
本文測試環(huán)境的網(wǎng)絡(luò)拓?fù)浞浅:唵?,?shí)際上直接通過命令行直接在 router 節(jié)點(diǎn)上插入路由信息可以達(dá)到同樣效果。在實(shí)際生產(chǎn)中,我們可以通過 BGP 動(dòng)態(tài)發(fā)現(xiàn)簡化配置流程。
內(nèi)置 BGP
Cilium 1.10 之后的版本內(nèi)置了 BGP Speaker 的功能,用戶無需在節(jié)點(diǎn)上部署 Bird2 也可以向外廣播節(jié)點(diǎn)的 PodCIDR 信息,并且 1.12 版本中 Cilium 參考 Metallb 實(shí)現(xiàn)支持基于 BGP + ECMP 的 LoadBalancer 功能。
參考文檔[6]中的描述,啟用內(nèi)置的 BGP 能力需要額外創(chuàng)建以下 ConfigMap,Cilium-Agent 和 Cilium-Operator 啟動(dòng)時(shí)均會掛載該配置。
apiVersion:v1 kind:ConfigMap metadata: name:bgp-config namespace:kube-system data: 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 節(jié)點(diǎn)的 bgpd 服務(wù)(PS:BGP 建立連接是基于 TCP 的),并且 Node1 和 Node2 將使用相同的 ASN 65000。
address-pools 指定的是 LoadBalanacer 的 IP 地址池,當(dāng)用戶創(chuàng)建 LoadBalancer 類型的 Service 時(shí),Cilium 將自動(dòng)從該地址池中分配 ip 地址,并自動(dòng)進(jìn)行 BGP 宣告。
安裝上述 Configmap 后,我們需要為 Cilium 為添加如下配置:
bgp: enabled:true announce: loadbalancerIP:true podCIDR:true loadBalancer: mode:snat#此處使用dsr模式時(shí),存在問題
創(chuàng)建 service 如下:
apiVersion:v1 kind:Service metadata: name:whoami-lb spec: type:LoadBalancer ports: -port:80 targetPort:80 protocol:TCP name:http selector: app:whoami
cilium 自動(dòng)分配 192.0.2.0 作為 service 的 EXTERNAL-IP:
我們登錄 router 節(jié)點(diǎn)通過 vtysh 查看 Cilium 是否 bgpd 服務(wù)建立了連接,并且查看其通告的路由信息如下:
需要注意,router 節(jié)點(diǎn)上我們需要添加 ECMP 的相關(guān)配置,并且依然靜態(tài)指定 Node1 和 Node2 作為 neighbor 如下:
frrversion8.4.1 frrdefaultstraditional hostnamerouter logsysloginformational ! routerbgp65100 bgpbestpathas-pathmultipath-relax bgpbestpathbandwidthskip-missing bgprouter-id192.168.121.16 nobgpebgp-requires-policy neighbor10.0.1.10remote-as65000 neighbor10.0.2.10remote-as65000 exit !
執(zhí)行vtysh -c "show bgp ipv4 unicast 192.0.2.0/32"我們可以查看當(dāng)前,F(xiàn)RR 執(zhí)行 ECMP 時(shí)的路徑選擇:
Cilium BGP Control Plane
BGP Controller 控制器是 Cilium 高版本推出的針對內(nèi)置 BGP Speaker 更加細(xì)粒度的控制功能,其功能是上述 ConfigMap 的擴(kuò)展。
審核編輯:劉清
-
控制器
+關(guān)注
關(guān)注
112文章
16361瀏覽量
178050 -
路由器
+關(guān)注
關(guān)注
22文章
3732瀏覽量
113779 -
BGP
+關(guān)注
關(guān)注
0文章
83瀏覽量
15331 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
316瀏覽量
21650 -
TCP通信
+關(guān)注
關(guān)注
0文章
146瀏覽量
4223
原文標(biāo)題:如何快速讓 Cilium 和 BGP 協(xié)同工作
文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論