Helm 中的 gRPC
Helm 是 Kubernetes 的包管理器。Helm 为用户提供了一种可定制的机制,用于管理分布式应用程序并控制其部署。
我有幸作为核心贡献者加入到了出色的开源 Kubernetes Helm 社区中。在 Helm 团队工作的第一天,我就参与了下一代 Helm 架构的原型设计。当天结束时,我们已经获取了初步的 RPC 协议数据模型,用于支持 Helm 与其集群内服务器组件 Tiller 之间的通信。
我们选择使用协议缓冲区(Protocol Buffers,即 gRPC 用于序列化和空中传输的默认框架)作为我们的数据定义语言。在与 Helm 团队合作的第一天结束时,gRPC 和 Protocol Buffers 被证明是一个强大的组合。我们已经成功实现了使用由 protobuf 和 gRPC 服务定义生成的代码,完成 Helm 客户端与 Tiller 服务器之间的通信。作为个人偏好,我们发现与 Swagger 等方案相比,protobuf 文件及其生成的 gRPC 代码提供了一种美观、几乎自文档化的开发体验。
几天之内,Helm 团队就开始为我们的用户进行特性评估和实现。通过选择 gRPC/Proto,我们减少了通常在 API 建模和编写样板服务器代码时不可避免产生的“自行车棚效应”(bikeshedding,指在琐碎问题上过度争论)。如果我们没有从第一天起就获得 gRPC/protobuf 的好处,我们将花费更多时间在堆栈的上下层之间反复切换,而不是专注于真正重要的事情:用户和他们请求的功能。
除了作为 Helm/Tiller 的通信协议外,Protocol Buffers 的一个更有趣的应用是,我们用它来建模 Kubernetes 中所谓的“Chart”。Chart 是 Kubernetes 清单的封装,使您能够定义、安装和升级 Kubernetes 应用程序。对于更复杂的 Kubernetes 应用程序,清单集可能非常庞大。凭借其固有的压缩能力,Protocol Buffers 和 gRPC 使我们能够减轻传输笨重且冗长的 Kubernetes 清单所带来的困扰。
深入了解:
- Helm 的 proto,见:https://github.com/kubernetes/helm/tree/master/_proto/hapi
- 其生成的对应代码,见:https://github.com/kubernetes/helm/tree/master/pkg/proto/hapi
- Helm 客户端的接口,见:https://github.com/kubernetes/helm/tree/master/pkg/helm
总之,protobuf 和 gRPC 为 Helm 提供了:
- 为客户端和服务器通信提供了明确定义的消息和协议语义。
- 通过减少在样板服务器代码和 API 建模上花费的时间,加快了功能开发。
- 通过生成的代码和压缩功能,实现了高性能的数据传输。
- 最小化了从零到客户端/服务器通信所需的认知周期。