使用工具包部署到多个Kubernetes集群

编者注:今天的来宾帖子是InVision全栈工程师Chesley Brown讲的,他们讨论了如何构建和开源工具包,以帮助他们将更新持续部署到多个集群中。

我们在InVision的Docker之旅可能听起来很熟悉。我们从开发环境中的Docker开始,首先尝试在其中获得一致性。我们将遗留的整体应用程序整理到Docker映像中,并简化了Dockerfile,以最大程度地减小大小并提高效率。情况看起来不错。我们在此过程中学到了很多吗?当然。但最后,我们让整个工程团队与Docker在本地合作以开发他们的环境。任务完成!好吧,不完全是。开发是一回事,但进入生产则是另外一回事。

沿来Kubernetes

在去年12月对协调器和调度器的评估期间,Kubernetes进入了我们的生活。 AWS ECS仍然很新鲜,Docker刚刚发布了1.9(网络覆盖版本)。我们花了一个月的时间评估我们的选择,然后将其范围缩小到本地Docker工具(Machine,Swarm,Compose),ECS和Kubernetes。好吧,毋庸置疑,Kubernetes是我们的明显赢家,我们在新的一年开始了新的一年,充分利用Kubernetes使我们投入生产。但是不久我们遇到了一个小麻烦……

自动化部署

在这里 视觉,我们面临着独特的挑战。我们只是没有一个运行Kubernetes的生产环境,而是几个,都需要通过我们的CI / CD流程进行自动更新。尽管在这些环境上运行的代码相似,但配置却不同。事情需要平稳,自动地工作,因为我们负担不起部署过程中的麻烦或妨碍了我们的工程团队。

有几个几乎重复的集群很容易变成Kubernetes的噩梦。反模式非常丰富,因为我们复制并粘贴了95%的清单以得到新的集群。可扩展?头疼吗是。使这些清单保持最新和准确将是一项艰巨(且容易出错)的任务。我们需要更轻松的东西,可以重复使用的东西,保持较低的维护成本,并且可以将其合并到CI / CD系统中。

因此,在寻找适合我们需求的项目或工具之后,我们空了出来。在InVision,我们喜欢创建可帮助我们解决问题的工具,并且在这种情况下,我们可能不是唯一的团队,所以我们决定袖手旁观并创建自己的东西。结果就是我们的开源工具包! (Kubernetes + git的缩写)

你好套件!

套件 是一套组件,当将它们插入CI / CD系统和源代码管理时,可让您根据需要将更新(或全新的服务!)持续部署到任意数量的集群,所有这些都利用webhook,而无需托管外部服务。

使用工具包的模板格式,您可以一次定义服务文件,并在多个集群中重复使用它们。它通过在通常的Kubernetes清单文件之上构建而工作,从而使它们可以一次定义,然后通过仅定义该特定集群所需的唯一配置来在整个集群中重用。这使您可以轻松地为应用程序构建业务流程,并将其部署到所需的任意多个群集中。它还允许对应用程序的变体进行分组,因此您可以使群集运行应用程序的“开发”版本,而其他集群则运行“生产”版本,依此类推。

开发人员只需像往常一样将代码提交到他们的分支,然后将工具包部署到运行该服务的所有群集。然后,工具包将用于给定服务的映像和标签直接更新到包含所有工具包清单模板的存储库。这意味着从环境变量或配置到映像更新对群集进行的所有更改都将在源代码管理历史记录下进行跟踪,从而为您拥有的每个群集提供审计跟踪。

我们制作了所有这些开源文件,因此您可以 查看套件仓库!

套件适合我们吗?

如果您正在跨多个集群(或命名空间)运行Kubernetes,而所有这些集群都需要持续部署,那您肯定!由于使用工具包不需要托管任何外部服务器,因此您的团队可以利用github和CI / CD系统可能已经拥有的webhooks来开始使用。在这里,您可以创建一个存储库来托管您的Kubernetes清单文件,该文件可以告诉哪些服务部署到了哪些集群。由于使用了kit的模板引擎,大大简化了这些文件的复杂性。kit-image-deployer组件被集成到CI / CD流程中,并且每当开发人员将代码提交给母带并通过构建时,它都会自动部署到所有配置的集群中。

那么,什么是组件?

该套件由几个组件组成,每个组件都位于下一个。通常的流程是,开发人员将代码提交到其存储库,构建映像,然后kit-image-deployer将新映像和标记提交到清单存储库。从那里运行kit-deploymentizer,解析所有清单模板,以生成原始Kubernetes清单文件。最终,kit-deployer运行并获取所有构建的清单文件,并将它们部署到所有适当的集群中。这是组件和流程的摘要:

工具包图像部署程序
可以用于使用新的Docker映像路径更新git存储库中给定yaml文件的服务。可以与kit-deploymentizer和kit-deployer协作使用,以自动更新用于多个群集的服务的映像。

套件部署程序
该服务智能地构建部署文件,以允许环境变量和其他形式的配置的可重用性。它还支持为多个群集聚合这些部署。最后,它将为每个集群生成一个集群列表和一个部署文件列表。最好与kit-deployer和kit-image-deployer配合使用,以实现连续的部署工作流。

套件部署者
使用此服务可将文件部署到多个Kubernetes集群。只需将清单文件组织到与集群名称(在kubeconfig文件中定义的名称)匹配的目录中即可。然后,您提供kubeconfig文件的目录,然后kit-deployer将异步将所有清单发送到它们对应的集群。

下一个是什么?

在不久的将来,我们希望使部署更加智能,以便处理诸如mongo复制集之类的更新。我们还希望添加智能监控以进一步改善Kubernetes的自我修复特性。我们还在努力添加其他集成(例如Slack)和通知方法。最重要的是,我们正在通过允许工具包清单模板存在于每个单独的服务存储库中而不是单个主清单存储库中,努力将更多控制权移交给每个服务的单个开发人员。这将使他们能够从开发到跨所有集群的生产完全完全管理其服务。

希望您仔细看看 套件 告诉我们您的想法!看看我们的 视觉工程 博客中有关我们在InVision的出色工作的更多帖子。如果您要研究套件或类似这样的其他有趣的事情,请单击以查看 我们的工作页面。我们很乐意听取您的意见!

-全栈工程师Chesley Brown,网址: 视觉.