tnblog
首页
视频
资源
登录

Kubernetes Calico BGP Full Mesh模式

7059人阅读 2022/11/20 16:34 总访问:3466969 评论:0 收藏:0 手机
分类: 容器编排

Kubernetes Calico BGP Full Mesh模式

Full Mesh模式简介


Full Mesh - 全互联模式,启用了 BGP 之后,Calico 的默认行为是在每个节点彼此对等的情况下创建完整的内部 BGP(iBGP)连接,这使 Calico 可以在任何 L2 网络(无论是公有云还是私有云)上运行,或者说(如果配了 IPIP)可以在任何不禁止 IPIP 流量的网络上作为 overlay 运行。对于 vxlan overlay,Calico 不使用 BGP。
Full-mesh 模式对于 100 个以内的工作节点或更少节点的中小规模部署非常有用,但是在较大的规模上,Full-mesh 模式效率会降低,较大规模情况下,Calico 官方建议使用 Route reflectors。

启动Full Mesh模式


我们可以通过关闭IPIP模式和Vxlan模式来打开Full Mesh模式。

  1. calicoctl --allow-version-mismatch get ipPool -o wide
  2. kubectl edit ippool default-ipv4-ippool
  3. calicoctl --allow-version-mismatch get ipPool -o wide


然后修改calico.yamlcalico_backend的参数为bird,以及设置CALICO_IPV4POOL_IPIPCALICO_IPV4POOL_VXLANCALICO_IPV6POOL_VXLANNever。然后再进行apply。

  1. kubectl apply -f calico.yaml
  2. # 通过下面的命令来进行测试。
  3. calicoctl --allow-version-mismatch node status


参与BGP路由的每个AS都被分配一个唯一的自制系统编号(ASN),对BGP来说ASN是区分整个相互连接的网络的唯一标识。64512到65535之间的ASN编号保留给专用网络。
我们可以通过如下命令来查看Calico的ASN。

  1. calicoctl --allow-version-mismatch get node -o wide

路由学习


关于每个不同的节点中,所学习的路由是BGP学习到的还是非BGP学习到的,我们都可以到每个Calico Pod节点中进行查看。

  1. # 查看Calico运行到一些Pod
  2. kubectl get pod -n kube-system -o wide | grep calico
  3. # 进入calico容器内部
  4. kubectl exec -n kube-system -it calico-node-bc6hd /bin/bash
  5. # 使用birdcl工具查看相关路由
  6. birdcl
  7. show ?


我们通过show interfaces来查看网络接口。


我们可以看到eth0是一个多接入的广播。
当然我们还可以通过show route的方式查看BGP学习到的路由(这里不一定看到所有的路由学习,因为不同的协议只能看到自己能够学习到的)。


如果我还想看具体的路由是由什么协议来维护的可以通过如下命令来查看(举个例子192.168.36.64/26

  1. show route for 192.168.36.64 all

属性 描述
Type 协议类型
BGP.origin 原始路由协议
BGP.as_path 该属性记录了BGP传递过程中所经过的AS号,实际是一个AS号的列表。它的长短决定通信路径的决策。
BGP.next_hop 下一跳
BGP.local_pref 当BGP有多个路由选择到达目标时,该属性决定其中的优先级。

node-to-node mesh


关于node-to-node mesh的Peer类型的模式,它相当于节点对节点的方式的人人平等,其中的一台机器有添加新的路由所有的节点路由都需要学习。多了会造成每个路由随时随地都在学习消耗新年。
(官方建议100台机子一下使用)


它的路由IP也是节点的IP,就是直连的方式,所以如果该路由行不通了就没有其他方式,导致访问的路由方式不能保证高可用性。
(节点少没影响)

抓包


通过抓包,普获新pod运行的路由学习情况。

  1. tcpdump -pne -i eth0 -w eth0_bgp_full_mesh.cap
  2. kubectl apply -f cni.yaml


由于BGP使用TCP传输协议端口号为179,所以我们在Wireshark中的过滤tcp.port==179就可以了。


这里只有Keepalive,如果像节点重启或者禁用ip池,它还会有UPDATE、OPEN新的ip的路由消息。
(这里就不做尝试,大家可以自行尝试一下加深理解)
关于禁用节点可根据添加如下命令参数来进行设置,设置后新pod将无法创建IP而报错。

  1. kubectl edit ippool default-ipv4-ippool
  2. # spec.disabled: true


关于bgp的配置在/etc/calico/confd/config/bird.cfg文件中,如果我们有一些其他的需要添加更改的也可以在这个文件中做配置,接下来我们可以来解读一下。

  1. kubectl exec -n kube-system calico-node-bc6hd cat "/etc/calico/confd/config/bird.cfg"
  1. function apply_communities ()
  2. {
  3. }
  4. # Generated by confd
  5. include "bird_aggr.cfg";
  6. include "bird_ipam.cfg";
  7. # 路由id名
  8. router id 10.211.55.7;
  9. # 配置路由表和内核之间的同步。
  10. protocol kernel {
  11. learn; # 从内核学习所有外来路由
  12. persist; # 不要在bird关闭时删除路由
  13. scan time 2; # 每2秒扫描内核路由表
  14. import all;
  15. export filter calico_kernel_programming; # 默认为不导出
  16. graceful restart; # 当重新加载BIRD配置时,开启优雅的重新启动以减少航路中的潜在网络震荡。对于全自动网格,由于多个节点同时更新其BGP配置,因此无法防止BGP震荡,因此GR无法保证在这种情况下正常工作。
  17. merge paths on; # 允许导出多路径路由(ECMP)
  18. }
  19. # 监视界面上/下事件。
  20. protocol device {
  21. debug { states };
  22. scan time 2; # 每2秒扫描一次接口
  23. }
  24. protocol direct {
  25. debug { states };
  26. interface -"cali*", -"kube-ipvs*", "*"; #排除cali*和kube ipvs*,但包括所有其他内容。在IPVS模式下,kube代理创建一个kube-ipvs0接口。我们排除了kube-ipvs0,因为这个接口为每个正在使用的集群IP获取一个地址。当我们合法地想要导出集群IP时,我们使用静态路由。
  27. }
  28. # 所有BGP客户端模版
  29. template bgp bgp_template {
  30. debug { states };
  31. description "Connection to BGP peer";
  32. local as 64512; # AS 值
  33. multihop;
  34. gateway recursive; # 默认设置。
  35. import all; # 导入所有路线,因为我们不知道上游
  36. # 拓扑是并且因此必须信任ToR/RR。
  37. export filter calico_export_to_bgp_peers; # 只希望导出工作负载的路由。
  38. add paths on;
  39. graceful restart; # 请查看内核模块对graceful的注解
  40. connect delay time 2;
  41. connect retry time 5;
  42. error wait time 5,30;
  43. }
  44. # 上面基本上是路由反射器的
  45. # 下面是node到node的mesh
  46. # ------------- Node-to-node mesh -------------
  47. # 跳过自己
  48. # For peer /host/k8s-125-master/ip_addr_v4
  49. # Skipping ourselves (10.211.55.7)
  50. # 由于我这里有两个节点所以有两条peer信息
  51. # For peer /host/k8s-125-node1/ip_addr_v4
  52. protocol bgp Mesh_10_211_55_8 from bgp_template {
  53. neighbor 10.211.55.8 as 64512;
  54. source address 10.211.55.7; # The local address we use for the TCP connection
  55. passive on; # Mesh is unidirectional, peer will connect to us.
  56. }
  57. # For peer /host/k8s-125-node2/ip_addr_v4
  58. protocol bgp Mesh_10_211_55_9 from bgp_template {
  59. neighbor 10.211.55.9 as 64512;
  60. source address 10.211.55.7; # The local address we use for the TCP connection
  61. passive on; # Mesh is unidirectional, peer will connect to us.
  62. }
  63. # ------------- Global peers -------------
  64. # No global peers configured.
  65. # ------------- Node-specific peers -------------
  66. # No node-specific peers configured.

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

默认昵称

2023/3/9 15:14:39

mac地址会更改但vxlan解析后mac地址除了源mac地址改为cni0的地址外目的mac是c3 pod的mac. 这里的源地址是被改为flannel.1的mac地址吧 ,你这里写的是cni0的地址

ServiceStack.Redis操作Redis配置单例模式

我携漫天星辰以赠你,仍觉漫天星辰不如你。单利的应该是连接池而不应该是redis对象。如果每次操作都是一个redis对象是会有...

GIT中的PR模式

GIT中的Pull Request模式(简称PR)PR是开发者使用Github进行协作的利器。PR是协作者修改代码后或在原基础上增加新代码后向...

EF三种模式解析

万般皆下品,惟有编程高我希望你是为我而来如果我爱你,而你也正巧爱我。你头发乱了时候,我会笑笑地替你拨一拨,然后,手...

identity server4 的授权模式

授权模式OAuth2.0 定义了四种授权模式:Implicit:简化模式;直接通过浏览器的链接跳转申请令牌。Client Credentials:客户...

identity server4 四种授权模式

爱情哪有那么复杂,能让你开开心心笑得最甜的那个人就是对的人下面介绍4种模式安全性从低到高客户端模式客户端模式只对客户...

IdentityServer4实现OAuth2.0四种模式之授权码模式

授权码模式隐藏码模式最大不同是授权码模式不直接返回token,而是先返回一个授权码,然后再根据这个授权码去请求token。这...

也谈TDD,以及三层架构、设计模式、ORM……

想在园子里写点东西已经很久了,但一直没有落笔,还有些软文做推广,还要做奶爸带孩子,还要……好吧,我承认,真正的原因...

.netcore 3.1 MediatR:轻松实现命令查询职责分离模式(CQRS)

.netcore 3.1 MediatR:轻松实现命令查询职责分离模式(CQRS)[TOC] 中介者模式 用一个中介对象封装一系列的对象交...

.net core 3.1 Identity Server4 (ClientCredentials模式)

.net core 3.1 Identity Server4 (ClientCredentials模式)[TOC] ClientCredentials 模式的理解 在这之前我先问大家...

.net core 3.1 Identity Server4 (Password模式)

.net core 3.1 Identity Server4 (Password模式)[TOC] Password 模式的理解 当应用程序将用户的用户名和密码交换为...

.net core 3.1 Identity Server4 (Code模式)

.net core 3.1 Identity Server4 (Code模式)[TOC] Code 模式的理解 大致说一下,这种授权模式的意义。A. 用户通...

Go Map与工厂模式,在Go语言中实现Set

Go Map与工厂模式,在Go语言中实现Set[TOC] Map与工厂模式 Map 的 value 可以是一个方法与 Go 的 Dock type 接口方式一起...

.net core 3.1 Identity Server4 (Implicit模式)

.net core 3.1 Identity Server4 (Implicit模式)[TOC] Implicit 模式的理解 A.用户通过浏览器访问客户端,然后客...

.net core 3.1 Identity Server4 (Hybrid模式)

.net core 3.1 Identity Server4 (Hybrid模式)[TOC] Hybrid 模式的理解 Hybrid 模式相当于(Code模式+Impact模式),所...

.net core 3.1 Identity Server4 (自定义模式)

.net core 3.1 Identity Server4 (自定义模式)[TOC] IdentityServer4除了提供常规的几种授权模式外(AuthorizationCod...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术