Airbnb如何简化Kubernetes 1000多名工程师的工作流程

Airbnb的基础设施工程师Melanie Cebula在QCon London上做了一个演讲,内容是关于Airbnb采用的内部工具和策略,以支持超过1000名工程师同时配置和部署超过250项关键服务到Kubernetes(平均每天部署约500项)。一个关键的促成因素是抽象层和使用标准化环境和名称空间(以及尽可能自动化的验证)从更高级别的原语生成Kubernetes配置。同样重要的是,工程师可以在所有环境中使用相同的工具,实现通用工作流的自动化。

kube-gen是Airbnb的内部工具,它可以获取服务的参数(在单个YAML文件中定义),并通过添加所有必要的样板配置生成完整的Kubernetes服务配置。在过去,Airbnb使用文件继承机制进行配置(如在Chef cookbooks中)会导致级联基础设施故障。因此,目标之一是通过使用YAML模板进行服务配置来减少潜在错误的范围。

kube- genis的另一个主要目标是抽象出Kubernetes配置和工具的复杂性,以允许工程团队保留其服务部署的所有权,并提供必要的隔离级别(部分由基于标准化环境名称的自动生成的名称空间提供保证),但不需要长时间的学习。虽然kube-gen不能公开使用,因为它解决了Airbnb的特定上下文,但Cebula指出了一些开源的备选方案:helm(包管理)、kustomize(通过文件继承进行配置)和kapitan(通过模板进行配置)。

图:自定义YAML中的服务配置文件被转换成Kubernetes所需的配置文件(在自定义YAML中定义的每个环境一个配置文件),然后应用到Kubernetes集群(来源:Melanie Cebula, Airbnb)

进一步的策略来促进均匀,易于发展服务配置包括一个命令创建一个新的服务框架库,在构建和部署时间验证配置文件(不仅语法也已知问题等价值观提供无效的项目名称或所有者),和版本(生成)服务配置。

新创建的服务的git存储库包括应用程序和基础设施样板文件(包括用于CI/CD的文件),自动填充合理的默认值和良好的实践(比如默认自动缩放或文档生成)。版本化服务配置(使用YAML文件中的特定字段)允许标记有问题的版本(因此它们永远不会被重新部署)—这些可能是kube-gen本身或特定于服务的问题—以及在不同的通道上发布不同的版本(例如,稳定的vs beta)。

图:Airbnb服务配置YAML文件示例,包括一个版本字段(来源:Melanie Cebula,Airbnb)

k是Airbnb的另一个内部工具。k主要是kubectl的一个自以为是的包装器,它还过滤掉了一些kubectl的冗长输出。k还支持一些额外的功能,比如包装前面提到的kube-gen工具,以及构建/推送Docker图像。这个工具的目标是自动化通用工作流,因此通过抽象Kubernetes工具的复杂性来简化和标准化工程工作。但它也让开发人员和基础设施工程师使用同一种语言和相同的工具,这加强了协作,据Cebula说。

一个典型的工作流程是,首先从k generate生成Kubernetes文件,然后k build生成Docker映像并推送到registry,最后k deploy创建Kubernetes名称空间并应用Kubernetes文件,等待最终的部署状态。服务的构建和部署方式与环境(即本地机器、CI、暂存或生产环境)相同。也可以运行k diagnostic,它依赖于Airbnb创建的两个插件:kubectl diagnostic和kubectl podevents。其目标是在调试部署问题时自动执行常见的手动步骤:收集关于未准备好的容器的信息,查找相关的pod事件,并获取这些容器的日志。

最后,Cebula提到一些剩余挑战Airbnb的Kubernetes旅程的采用,特别是与成千上万的迁移现有服务需要更好的multicluster支持和扩展(一些服务usehundreds副本),处理高内存需求更有状态的服务,或移动所有配置GitOps工作流模型与自定义控制器。