首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

利用Konvoy为集群基础架构打补丁 Part 1

导读

本文将通过大量的代码范例向您展示应该如何利用Konvoy更简单地给Kubernetes集群打补丁,并保证集群在生命周期中都处于安全和健康的状态,真正实现无感升级。

最近,我们在内部的生产Konvoy集群中遇到了臭名昭著的kmem bug。我们发现在用户报告某个集群中的CI任务出现间歇性故障之后,我们就遇到了这个问题。当时显示如下的报错:

来自Pod日志:

来自Kernel日志:

这个发生故障是在一个特别的CI任务,该任务使用docker-in-docker 镜像来创建Kind Cluster,为的是测试我们的D2iQ Helm Charts运行Kubernetes集群的能力。尽管错误是间断出现的,但一经出现,便会在加载容器或者测试代码的环节让我们的流程失败。鉴于我们所有的工作节点都可能会引起这个问题,而且CI任务可以在任何时间、任意节点上运行。故需要定义一个流程,给工作节点打上补丁,以确保集群和工作负载始终保持良好状态。非常幸运的是,利用Konvoy来打造这个流程就变得非常简单。

我们将首先介绍是如何利用Konvoy为工作节点打补丁、并解决了生产Konvoy集群中出现的kmem问题。首先,我们将介绍我们的bugfix解决方案,接着,将介绍如何在整个生产kubernetes集群中完成无感修复。通过代码范例的截屏,我们将展示给您如何利用Konvoy来更简单地给集群打补丁,并确保集群都处于安全和健康的状态。

测  试

我们今天所要解决的bug是一个已知与CentOS操作系统相关的问题。目前唯一已知的应对方法,也是最常见的方法,就是在启动时就彻底禁用kmem的记账功能。这是目前来说的最佳实践,很多文章都推荐了这个方法,此外,我们也应该把kernel更新到最新的版本,因为我们目前所使用的还不是最新版本。我们决定利用Konvoy中的“节点池”功能来验证上述的解决方案,利用一个含有最新kernel的AMI来部署一个新的工作节点。针对测试,我们决定给这个节点打上标签,这样就只有我们的测试Pods可以被调度用在新的测试节点上运行。只需要在Konvoy中执行非常简单的两个步骤,就可以通过新的节点池在集群中添加这个新的工作节点。

1. 在cluster.yaml里添加一个新的节点池,把数量设置为1。我们还需要给节点池加入了污点和容差,确保其它的工作负载不会被调度到这些节点。

在新节点池的cluster.yaml的“ClusterProvisioner”(集群配置器)部分,我们在imageID的参数填入某个特定AMI,这个AMI包含有最新的kernel。

在cluster.yaml的ClusterConfiguration的节点池部分之下,给测试节点节点池添加名称为“testnode”的标签。

2. 一旦cluster.yaml包含了新的节点池和污点之后,运行Konvoy up给集群添加一个新的节点,具体操作如下:

仅需非常简单的两步,Konvoy就在集群中添加了新的节点。在这个例子中,因为上游的CentOS AMIs中kmem不是缺省的,需要在Konvoy之外引入另外一个步骤,我们需要禁用kmem。针对这一步骤,我们创建了两个简单的Ansible playbooks去完成对kmem的禁用,之后我们就可以在整个集群中自动执行这个步骤了。如果您有兴趣可以点击这里下载这些playbooks。

最后,我们部署了一个测试Pod,我们让这个CI任务运行了好几天,就是想看看是否能够让这个错误重现。

在接下来的几天中,我们每隔几小时就要检查Pod日志的Kibana(这是我们缺省集群部署的一个部分),观察能否复出现之前的的错误。

解  决

在经过72个小时的运行之后,没有再出现同样的错误。我们由此认定本次给集群打补丁是一个有效的解决方案。下面,我们就看看看如何利用Konvoy按照测试中的同样流程,给生产集群打补丁并最终解决这个问题的。

鉴于每一个worker节点都是有漏洞的,我们需要为目前的节点池创建一个副本。在cluster.yaml中,我们创建了一个新的节点池,称之为“worker-7.7.1908”,与目前的工作节点池的点数一样。

就像上面一样,我们在池中添加了新的AMI,但是这次我们去掉了污点,因为我们期望让所有的工作负载都能够在这里运行。

在本例中,我们要重新启动节点,以保证kmem的记账功能被完全禁用。只需要先执行如下命令,就可以对要增加的节点进行初始化配置。

Tips:在实际执行konvoy provision之前,您可以先通过执行增加 --plan-only选项的命令 ,先查看Terraform计划,来确定是否要对您的基础架构进行修改。

新实例配置好了之后,我们会通过playbooks来禁用kmem。

当我们确定kmem在新池中已经被禁用了,这时就可以利用Konvoy来向集群添加(节点)。

现在节点已经添加进了集群,也已经做好接收工作负载的准备,我们就可以利用Konvoy安全地将现有的工作负载从现有的池子中过滤出来。请注意,这可能需要一段时间才能完成。

在这一步中,Konvoy不仅会把工作节点过滤出来,而且还会把这些节点隔离起来,这些节点就有会承载其它的运行了。产出的范例如下:

现在,我们将旧的节点池扩展至0。

最后,我们可以终止旧的工作池,并把它从集群中删除。

如上,旧的工作池实例和相关的资源正在被终止,并从集群中删除。

这个例子展示了Konvoy如何简化集群打补丁的过程,也缩短了集群解决问题的时间。给集群打补丁可能是一项非常困难的工作,我们希望您已经了解到Konvoy是如何让集群打补丁的流程变得友好而高效。在后续的文章中,我们将继续探讨如何利用Konvoy进一步给您的Kubernetes集群打补丁,还有其它有关集群管理方面的内容,敬请关注。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200831A084PA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券