使用addon-operator来简化管理Kubernetes集群中的其他组件


推出shell-operator之后,我们很高兴在此向你们介绍它的兄弟应用addon-operator。这是一个开源的项目,它能帮你安装系统组件(也称为插件)到Kubernetes集群中,配置它们并保持最新。

我们真的需要插件吗?

我们知道,Kubernetes自身并不是一个完整的、能适应所有的解决方案。要构建一个大的集群,你需要依赖于大量的额外的组件:
  • 对于仅用于学习或通用实验的简易Kubernetes安装,你可能会满足于开箱即用的基本可用组件。
  • 对于开发或测试目的,你可能需要添加Ingress。
  • 然而,更加复杂的,生产就绪的环境将需要更多,可能有数十种不同的插件,包括监控和日志记录工具,证书管理器,特定的插件用于节点分配,定义网络策略,sysctl配置,Pod的自动缩放等等。


1.png

插件有何特别之处?

在多数情况下,仅仅进行插件的基本安装远远不够。你需要更新或禁用它们(即从集群中删除),甚至有时你需要在部署到生产集群之前测试它们。

难道是说类似Ansible这类的系统不适用于这些任务吗?好吧,也许是这样,但是如果没有合适的配置,成熟的插件通常都不会存在。这些配置可能因集群类型而异,例如AWS、GCE、Azure、裸金属、DigitalOcean等等。此外,由于它们是由集群本身派生的,导致无法预先设置其中的一些配置项。同时集群不是静态的,你必须持续监视某些比较重要的配置的变更。所以Ansbile不适用于这个案例,你需要一个在集群内运行的程序,这就是Kubernetes Operator。如果你想和更多Kubernetes技术专家交流,可以加我微信liyingjiese,备注『加群』。群里每周都有全球各大公司的最佳实践以及行业最新动态。

如果你已经尝试使用过我们的shell-operator,你就知道部署以及更新插件和监控配置都可以通过shell-operator的钩子来实现。例如,你可以创建一个执行kubectl apply命令的脚本,并监视存储设置的ConfigMap。它与addon-operator中实现的非常类似。

在addon-operator中实际实现了什么?

为了实现我们的解决方案,我们一直遵循以下重要原则:
  • 插件安装器必须支持模板化以及声明式配置。安装插件的“神奇“脚本已经完全被舍弃。Addon-operator使用Helm来部署插件。你所需要做的就是创建一个chart(图表)并将需要被配置到的值作为values。
  • 可以在部署阶段生成配置,可以在集群中发现配置,这些能映射集群资源的变更。该功能可以使用钩子来实现。
  • 配置可以存储在集群中。为此需要创建一个名addon-operator的ConfigMap类型对象,addon-operator监视在ConfigMap中发生的更改。Addon-operator通过简单的约定使这些设置可以在钩子中使用。
  • 插件依赖于这些配置。如果配置变更了,addon-operator将更新Helm图表使用到这些新的值。Helm图表,配置值和钩子的组合称为模块(详情如下)。
  • 阶段性。神奇的发布脚本不复存在。更新的策略将与普通的应用程序无异。你需要构建一个包含插件和addon-operator二进制文件的镜像,打上标签并将其部署到集群中。
  • 监控。Addon-operator实现了/metrics端点用于暴露Prometheus的指标。


在addon-operator中插件是什么?

插件即为Kubernetes集群添加新功能的任意代码。例如,Ingress安装就是一个插件的很好的例子。任何拥有它自己的CRD的operator或控制器,例如prometheus-operator,cert-manager,kube-controller-manager,都可以被认为是插件。简化程序的轻量级脚本,例如将注册表的secret复制到新的命名空间中或给新的节点微调sysctl参数,都可视为插件。

Addon-operator提供了几个实现插件的概念:
  • Helm图表用于在集群中安装各类软件,例如Prometheus、Grafana、nginx-ingress。如果有任何所需组件的Helm图表,可以使用addon-operator来轻易安装。
  • 值存储。Helm图表通常有许多可随时更改的配置。Addon-operator维护这些配置的存储并监视它们的变化,以便使用新的值来重装这些Helm图表。
  • 钩子是在集群中发生事件时addon-operator运行的可执行文件。它们可以访问值存储,钩子能够监视集群变更并更新值存储中的值。钩子还允许在启动时或按计划去发现集群的值。你还可以实现持续发现值这类机制,以便在集群更改时获取新的值。
  • 模块整合了Helm图表,值存储和钩子。你能启用或禁用模块。禁用该模块即删除其Helm图表的所有release版本。模块可以动态地启用它们,例如,如果所有必需的模块已被启用,或者发现机制在钩子中找到所需的参数,则启用的辅助脚本将启用该模块。
  • 全局钩子是独立的。它们不包含在模块中,它们可以读取和修改全局值存储中那些能被所有模块的钩子访问到的值。


那么这些部件如何一起运作?我们来看一下文档中的图片:
2.gif

这里会有两种操作方案:
  1. 全局钩子由事件触发,例如响应Kubernetes集群中的资源更改。该钩子处理更改并将新值写入全局值存储。Addon-operator发现全局存储发生了变化并运行所有模块。借助其钩子,每个模块确定是否应该启动并更新其值存储。如果模块已启用,则addon-operator启动相应Helm图表的安装。该种情况下,Helm图表可以访问模块存储和全局存储的值。
  2. 第二种情况相对简单些。模块钩子由事件触发,它会更改模块值存储中的值。Addon-operator观测到变化并启动含有更新值的Helm图表。


插件可以是单个钩子,单个Helm图表甚至是几个相关模块。它的具体实现方式取决于安装到Kubernetes群集中的组件的复杂性以及所需的设置的灵活性级别。例如,/examples存储库中有一个sysctl-tuner插件,它有两种形式:一个是带钩子和Helm图表的简单模块,另一种是使用值存储的模块(允许我们通过编辑ConfigMap添加设置)。

交付更新

如何处理由addon-operator安装的组件的升级过程呢?

要在集群中运行addon-operator,你需要构建一个包含以下项的镜像:
  • 插件(包含钩子和Helm图表)
  • addon-operator二进制执行文件
  • 钩子所需的所有第三方组件:bash、kubectl、jq、Python等等。


然后你就可以将该镜像作为普通应用程序部署到你的Kubernetes集群中,同时你可能希望为此过程带来一些标注策略。如果你有几个集群,则可以使用与普通应用程序相同的方法:新的发布release,新的版本,遍历所有集群并修改Pod中的镜像。另一方面,在滚动更新大量集群的情况下,你可以使用来自通道的自更新概念。

我们使用下面的方式实现了后者:
  • 通道实际上是一个可具备任何有意义值的标识符,我们使用dev,stage,ea,stable等。
  • 通道的名称就是镜像的标记,当你需要告知通道滚动更新时,一个新的镜像会被构建并使用通道的名称进行标记。
  • 当一个新的镜像出现在容器注册表中,将使用新的镜像重启addon-operator。


正如Kubernetes文档中所提到,这种方法并不属于最佳实践。因此不建议将此方法用于在单个群集中运行的普通应用程序。在我们使用addon-operator的情况下,应用程序由分散在集群中的许多部署组成,因此自更新功能能使工作简化很多。

通道同时也有助于测试。你可以配置一个辅助集群给stage通道,在滚动更新到ea和stable通道前在此测试滚动更新。如果使用ea通道时在集群中发生了错误,则可以在解决问题期间将其切换到stable通道。如果集群未能积极支持,则将其切换到例如freeze-2019-03-20这种“frozen”通道。

除了更新钩子和Helm图表之外,你可能还需要更新第三方组件。例如,你发现node-exporter中的一个错误甚至已清楚如何修补它。那么你可以新建一个PR并等待新版本发布来更新所有集群中的镜像版本。为了减少等待时间,你还可以构建自己的node-exporter并在PR接受之前切换使用你构建的这个镜像。

坦白地说,你可以在没有addon-operator的情况下做到这些,但是,addon-operator使得整个过程更加直接和透明。当用于安装node-exporter的模块和用于构建你自己的镜像的Dockerfile放置在同一个仓库中,你会更容易清楚到底发生了什么。如果你运行多个集群,那么测试PR并滚动更新新版本也会更容易。

在我们的案例中,这种组件更新方法非常有效。但是,你可以实现任何其他合适的方案,因为addon-operator只是一个二进制文件,并不依赖于所选择的更新机制。

结论

在addon-operator中实现的原则允许你构建一个透明的过程,用于在Kubernetes集群中创建,测试,安装和更新插件,这跟开发普通应用程序的过程非常相似。

作为模块(Helm图标+钩子)制作的addon-operator的插件可以容易与他人共享。在Flant,我们计划在接下来的几个月内分享我们的一系列模块。

请随时加入我们在GitHub的项目(shell-operatoraddon-operator),按照使用示例文档使用插件。欢迎订阅我们的媒体博客,敬请期待更多Kubernetes佳作!

原文链接:Announcing addon-operator to simplify managing additional components in K8s clusters (翻译:冯旭松)

0 个评论

要回复文章请先登录注册