Tungsten Fabric入门宝典丨关于集群更新的那些事

作者:Tatsuya Naganawa 译者:TF编译组

集群范围内的更新是很重要的功能,可以在保证生产集群的SLA的条件下提供集群中最新功能的有效性。

由于Tungsten Fabric在MPLS-VPN中使用类似的协议,因此,根据我的尝试,即使Control的模块版本和vRouter的模块版本不同,基本的互操作性还是有的。

因此,总体思路是,首先一个一个地更新controller,然后并根据需要使用vMotion或maintence模式逐一更新vRouter。

另外,Tungsten Fabric controller还支持名为ISSU的奇特功能,但是我认为这个名称有些混乱,因为Tungsten Fabric controller与route reflector非常相似,而不是routing-engine。

https://github.com/Juniper/contrail-specs/blob/master/contrail-issu.md

因此,基本思路是,首先将所有配置(configs)复制到新创建的controller(或route reflectors),然后更新vRouter设置(如果服务器可以重新启动,则更新vRouter模块)以使用这些新的controller。通过这个过程,vRouter模块更新的回滚操作也将更加容易。

下面我来描述一下这个过程。

就地更新(in-place update)

由于ansible-deployer遵循等幂行为(idempotent behavior),因此更新与安装没有太大区别。以下的命令将更新所有模块。

一个限制是由于此命令几乎同时重启了所有节点,因此不容易做到一一重启controller和vRouter。另外,从instances.yaml中删除其它节点将不起作用,因为一个节点的更新需要其它节点的某些参数。

• 例如,vRouter更新需要控件的IP,该IP是从instances.yaml中的control role节点推导出的

为了克服这个问题,从R2005版本开始,ziu.yaml就加入了这个功能,至少对于控制平面来说,要逐一更新。.

https://github.com/Juniper/contrail-ansible-deployer/blob/master/README_ziu.md

就我试过的情况来看,当控制平面更新时,它会进行串联更新和重启控制进程,所以没有看到掉包的现象。

 在install_contrail.yaml期间,控制进程的重启是被跳过的,因为它们已经更新了
 当执行vrouter-agent重启时,仍然会出现一些丢包现象,所以如果可以的话,建议进行工作负载迁移。

ISSU

即使容器格式的差异很大(例如从4.x到5.x),我们也可以使用ISSU,因为它创建了一个新的controller集群,并在其中复制数据。

首先,我来描述最简单的情况,即一个旧controller和一个新controller,以查看整个过程。所有命令都在新的controller上键入。

[commands]
1. 停止批处理作业

2. 在cassandra上注册新的control,在它们之间运行bgp

3. 在控制器之间同步数据

4. 启动进程进行实时数据同步

(如果需要,请检查日志)

5. (更新 vrouters)

6. 在结束后停止作业,同步所有数据

7. 从cassandra中去掉旧的节点,加入新的节点

8. 启动批处理作业

以下将是可能的检查点。

1. 步骤3之后,你可以尝试使用contrail-api-cli ls -l \*来查看所有数据是否已成功复制,并且可以通过ist.py ctr nei来查看controller之间的ibgp是否已启动。
2. 步骤4之后,你可以修改旧数据库,以查看更改是否可以成功传播到新数据库。

接下来,我将在使用编排器和两个vRouter的条件下,讨论更为实际的情况。

编排器集成

为了说明结合编排器的情况,我尝试用ansible-deployer部署两个vRouters和kubernetes。

即使与编排器结合使用,总体过程也不会有太大不同。

需要注意的是,需要在什么时候将kube-manager更改为新的。

从某种意义上讲,由于kube-manager动态订阅了来自kube-apiserver的事件并更新了Tungsten Fabric配置数据库(config-database),因此它类似于批处理作业,例如schema-transformer、svc-monitor和device-manager。因此,我使用此类批处理作业,同时停止并启动了旧的或新的kube-manager(实际上也包括webui),但是可能需要根据每个设置进行更改。

这个示例中的总体过程如下所示。

1.设置一个controller(带有一个kube-manager和kubernetes-master)和两个vRouter
2.设置一个新的controller(带有一个kube-manager,但kubernetes-master与旧的controller相同)
3.停止批处理作业、新controller的kube-manager和webui
4.启动ISSU进程并继续执行,直到开始运行同步(run-sync)
->将在controller之间建立iBGP
5.根据新controller的ansible-ployer一个一个地更新vRouter
->将一个vRouter移至新的vRouter时,新的controller也将获得
4.启动ISSU进程并继续执行,直到开始运行同步(run-sync)
->将在controller之间建立iBGP
5.根据新controller的ansible-ployer一个一个地更新vRouter
->将一个vRouter移至新的vRouter时,新的controller也将获得
k8s-default-pod-network的路由目标(route-target),并且容器之间仍然可以ping通正常工作(ist.py ctr路由摘要以及ping的结果将在稍后附上)
6.将所有vRouter移至新的controller后,停止批处理作业、旧controller上的kube-manager和webui
之后,继续执行ISSU进程,新controller上启动批处理作业, kube-manager和webui
->这个阶段从开始到结束,你都无法手动更改config-database,因此可能需要一些维护时间
(整个过程可能会持续5至15分钟,可以ping通,但是直到启动新的kube-manager时,新容器的创建才能正常工作)
7.最后,停止旧的节点上的control、config和config-database

更新vRouters时,我使用了controller的provider: bms-maint,k8s_master和vRouter,它们都已经更改为新的,以避免由于容器重启而造成干扰。我附上了原始instances.yaml和更新vRouter的instances.yaml,以便大家获取更多详细信息。

https://github.com/tnaganawa/tungstenfabric-docs/blob/master/instances-yaml-for-ISSU

我还将在每个阶段附加ist.py ctr nei和ist.py ctr路由摘要的结果,以说明发生的相关细节。

• 请注意,在此示例中,我实际上并未更新模块,因为此设置主要是为了突出ISSU进程(因为即使模块版本相同,ansible-deployer也会重新创建vrouter-agent容器,同时即使完成实际的模块更新,丢包的数量也不会有太大不同。)

开始issu之前:

-> 在新的控制器里没有导入路由

-> 两个vRouter每个都有一个容器,在两个容器之间ping的结果正常。

在provision_control之后:

-> iBGP 在老的控制器上,但是新的控制器还没有那些配置(在执行pre-sync后,这会被复制到新的控制器上)
在run-sync之后:

-> iBGP 建立起来了,ctr route summary没有改变,因为新的控制器没有k8s-default-pod-network的路由目标(route-target),路由目标(route target)过滤组织了导入这些前缀。

在迁移节点到新的controller之后:

-> 在vrouter-agent 重启后,可以看到丢了3个包(序号40-44)。在迁移vRouter到新的之后,ping工作地很好。

检查主机:172.31.19.25

-> 两个控制器具有XMPP连接,建立了IBGP

检查主机: 172.31.19.25

检查主机: 172.31.13.9

-> 因为两个控制器具有至少一个容器来自k8s-default-pod-network, 它们使用iBGP来交换前缀,因此它们具有同一个前缀

在将第二个vrouter迁移到新的控制器之后:

-> 新的控制器具有两个XMPP连接。

检查主机:172.31.19.25

检查主机:172.31.13.9

-> 老的控制器不再具有前缀。

在ISSU过程结束后,新的kube-manager 启动:

-> 新控制器不再有iBGP路由到旧的控制器。旧控制器依然具有iBGP路由条目,虽然这个过程很快就要停止:)
在停止了就的控制器后,配置:

-> 新容器依然可以被创建

-> 具有新控制器的vRouter工作良好

-> 在vRouter之间Ping成功了

向后兼容

由于有好几种更新集群的方法(就地、ISSU、是否为ifdown vhost0),因此方法的选择也是个重要的话题。

在讨论细节之前,让我先描述一下vrouter-agent up / down的行为,以及ifup vhost0 / ifdown vhost0的行为。

重新启动vrouter-agent时,一种假设是重新创建了vrouter-agent容器和vhost0。

实际上,事实并非如此,因为vhost0与vrouter.ko是紧密耦合的,需要从kernel中卸载vrouter.ko的同时将其删除。所以从操作角度来说,需要ifdown vhost0,那么不仅需要更新vrouter-agent,还需要更新vrouter.ko。(ifdown vhost0也将在内部执行rmmod vrouter)。

因此,要讨论向后兼容,需要研究下面三个主题。
1. controller与vrouter-agent的兼容性
• 如果没有向后兼容性,则需要ISSU

2. vrouter-agent与vrouter.ko的兼容性

• 如果没有向后兼容性,则需要ifdown vhost0,这将导致最少5-10秒的流量损失,因此实际上意味着需要将流量转移到其它节点,如实时迁移(live migration)
• 由于vrouter-agent使用netlink与vrouter.ko同步数据,因此架构更改可能导致vrouter-agent发生意外行为(例如Ksync logic上的vrouter-agent分段错误)

3. vrouter.ko与kernel的兼容性
• 如果没有向后兼容性,则需要更新kernel,因此这意味着需要将流量移至其它节点
• 当vrouter.ko具有不同的in-kernal API时,无法由kernel加载,并且无法创建vhost0和vrouter-agent

对于2和3,基于种种原因不可避免地需要进行kernel更新,因此一个可行的计划是,首先选择一个新的kernel版本,然后选择一个支持该kernel的vrouter-agent / vrouter.ko,再并检查当前使用的vrouter-agent是否可以与该版本的control一起使用。
• 如果运行良好,请使用就地更新;如果由于某些原因无法运行,或者需要回滚操作,此时需要使用ISSU

对于1,由于在导入config-api定义时ifmap会为每个版本维护white_list,
• void
IFMapGraphWalker::AddNodesToWhitelist():https://github.com/Juniper/contrail-controller/blob/master/src/ifmap/ifmap_graph_walker.cc#L349

根据我的尝试,它似乎具有不错的向后兼容性(由于路由信息更新与BGP类似,因此大多数情况下也应该可以正常工作)。

为了验证这一点,我尝试使用不同版本的模块进行该设置,看起来仍然可以正常工作。

I-1. config 2002-latest, control 2002-latest, vrouter 5.0-latest, openstack queens

I-2. config 2002-latest, control 5.0-latest, vrouter 5.0-latest, openstack queens

II-1. config 2002-latest, control 2002-latest, vrouter r5.1, kubernetes 1.12

注意:不幸的是,这种组合不能很好地工作(cni无法从vrouter-agent获取端口信息),我想这是由于5.0.x和5.1之间的cni版本更改(0.2.0-> 0.3.1)引起的。

II-2. config 2002-latest, control 2002-latest, vrouter 5.0-latest, kubernetes 1.12

因此,即使不需要立即更改kernel和vRouter版本,比较频繁地更新config / control也是一个好习惯,以修复可能的错误。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/24183.html
分享到:
相关文章
条评论

登录后才可以评论

carrie-tt 发表于20-06-12
0