Slack 为 Kubernetes StatefulSets 开发 Bedrock Operator

Slack开发自定义Kubernetes Operator以优化StatefulSet部署

Slack作为流行的职场沟通平台,开发了一款名为Bedrock Rollout Operator的自定义Kubernetes Operator,旨在解决管理StatefulSet部署时的局限性。该Operator由Slack的高级软件工程师Clément Labbe在Slack工程博客中介绍,专为在Kubernetes集群中部署有状态应用提供了更好的控制与功能。

背景与挑战

StatefulSet通常用于运行需要持久化存储和唯一Pod身份的应用。然而,Slack的工程团队发现现有的StatefulSet更新策略存在不足。默认的RollingUpdate策略虽然自动化,但一次只能更新一个Pod,导致包含大量Pod的应用部署速度缓慢。而OnDelete策略虽然允许手动控制,但缺乏基于百分比的滚动更新等高级功能。

Bedrock Rollout Operator的功能

Slack使用Kubebuilder开发了Bedrock Rollout Operator,管理名为StatefulsetRollout的自定义资源。该Operator解决了以下关键问题:

  1. 部署速度慢:默认的RollingUpdate策略一次只能更新一个Pod,导致部署速度缓慢。
  2. 控制不足:提供比原生Kubernetes选项更可控的滚动更新,支持基于百分比的快速更新和暂停功能。
  3. 回滚能力有限:在需要时能够更快地进行回滚。
  4. 集成缺口:与Slack内部的服务发现系统(Consul)集成,并通过Slack通知提供滚动更新状态,填补了现有工作流的不足。
  5. 定制需求:允许Slack实现符合其特定需求的定制化滚动逻辑。
  6. 可见性提升:通过实时Slack通知和内部发布管理UI集成,提高了滚动更新过程的可见性。
  7. 大规模管理:尽管需要一些调整,但该解决方案能够管理包含多达1,000个Pod的大型StatefulSet。

部署与工作原理

Bedrock Rollout Operator部署在Slack的Kubernetes基础设施中,涵盖200多个集群,管理近100个有状态服务。其工作流程如下:

  1. 工程师在bedrock.yaml文件中定义应用配置。
  2. 开发者通过Slack内部发布平台启动部署时,Bedrock API将该配置转换为StatefulsetRollout资源。
  3. Operator持续监控StatefulsetRollout资源,并通过自排队协调循环将期望状态与集群实际状态进行同步。
  4. 在滚动更新过程中,Operator执行创建或更新StatefulSet、终止Pod等操作,并通过Slack通知实时更新用户。

挑战与局限性

尽管该Operator在Slack内部表现出色,但仍存在一些局限性:

  1. 大规模StatefulSet:处理包含多达1,000个Pod的StatefulSet时需要调整通知系统以避免速率限制问题。
  2. 版本泄漏问题:使用OnDelete策略时,如果滚动更新被暂停或部分完成,终止的旧版本Pod可能会被新版本Pod替代,导致无意中逐渐完成更新。Slack通过鼓励团队尽快完成更新来缓解这一问题。

未来展望

Slack计划扩展Operator模型的使用,探索现有CNCF项目(如Argo Rollouts和OpenKruise)以管理非有状态的Deployment资源。其他组织(如Grafana Labs)也开发了类似的Operator,提供更细粒度的滚动更新控制。此外,Argo Rollouts和Flagger等产品提供了类似的功能,专注于Deployment资源的蓝绿部署、金丝雀发布和渐进式交付。

总结

通过开发Bedrock Rollout Operator,Slack在StatefulSet部署中实现了更高的控制与集成能力。尽管Kubernetes未来可能会将部分功能纳入核心特性,但对于具有复杂部署需求和定制基础设施的组织而言,Operator模型的灵活性与集成能力仍将具有重要价值。

阅读 24
0 条评论