Helm 中的 gRPC
Helm 是 Kubernetes 的包管理器。Helm 为用户提供了可定制的机制,用于管理分布式应用并控制其部署。
我很幸运能成为杰出的开源 Kubernetes Helm 社区的核心贡献者之一。我与 Helm 团队合作的第一天就投入到下一代 Helm 架构的原型设计中。到那天结束时,我们已经获得了用于实现 Helm 客户端与其集群内服务器组件 Tiller 之间通信的初步 RPC 协议数据模型。
我们选择使用 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 manifests 的封装,使您能够定义、安装和升级 Kubernetes 应用。对于更复杂的 Kubernetes 应用,manifests 的集合可能很大。凭借其固有的压缩能力,protocol buffers 和 gRPC 使我们能够减轻传输庞大且分散的 Kubernetes manifests 的麻烦。
如需更深入地了解
- 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 建模的时间,加快了功能开发速度。
- 通过生成的代码和压缩实现高性能数据传输。
- 最大限度地减少了从零开始实现客户端/服务器通信所需的认知投入。