Kubernetes 上分布式系统的演化

作者|BilginIbryam
译者|张卫滨
策划|丁晓昀
1
现代分布式应用
我想为这次演讲预先设置一些背景 , 在这里当我提到分布式系统时 , 我所指的是由多个组件组成的系统 , 可能会有数百个这样的组件 。 这些组件可能是有状态的、无状态的或者是无服务器的 。 除此之外 , 这些组件可以使用不同的语言创建 , 运行在混合环境之中 , 开发时使用的是开源技术和开发标准 , 支持互操作性 。 我相信你也可以使用闭源的软件创造这样的系统 , 或者在AWS和其他的地方创建它们 。 具体到这次演讲 , 我会特别关注Kubernetes生态系统 , 以及如何在Kubernetes平台上创建这样的系统 。
我们从分布式系统的需求开始 。 我所想的是我们想要创建一个应用或者服务 , 并编写一些业务逻辑 。 那么 , 我们需要从平台和运行时环境得到哪些支撑以构建分布式系统呢?从基础来讲 , 最初的需求是我们需要一些生命周期管理的能力 。 当我们使用任意语言编写应用的时候 , 我们希望能够稳定地打包和部署应用 , 进行回滚和健康检查 。 并且能够将应用放到不同的节点上 , 进行资源隔离、扩展、配置管理 , 以及所有类似这样的事情 。 这些都是我们创建分布式应用所需要的最基本的东西 。
Kubernetes 上分布式系统的演化
文章图片
第二个基石是网络相关的 。 我们有了一个应用之后 , 就希望它能够可靠地连接到其他的服务上 , 不管其他的服务在集群内还是在集群外部 。 我们希望能有诸如服务发现、负载均衡等能力 , 我们还希望能够进行流量转移 , 不管是基于不同的发布策略还是其他的一些原因 。 在此之后 , 我们希望能够与其他的系统进行弹性通信 , 不管是通过重试、超时、断路器还是其他方式来实现 。 当然 , 还要有安全保障 , 要有足够的监控、跟踪、可观察性等等 。
Kubernetes 上分布式系统的演化
文章图片
有了网络之后 , 下一件事就是我们希望能够与不同的API和端点进行对话 , 也就是资源绑定:与其他协议和不同的数据格式进行对话 。 甚至可能从一种数据格式转换成另外一种数据格式 。 在这里我还想要包括像轻量级过滤(lightfiltering)这样的事情 , 也就是当订阅一个主题的时候 , 我们可能只关心特定的事件 。
Kubernetes 上分布式系统的演化
文章图片
你认为最后一类会是什么呢?它就是状态 。 当我提到状态和状态化抽象的时候 , 我讨论的不是实际的状态管理 , 比如数据库或文件系统所做的事情 。 我更多的是讨论开发人员对那些幕后依赖状态的功能的抽象 。 也许 , 你需要进行工作流管理 。 可能你想要管理长时间运行的进程 , 或者要进行时间调度 , 或者要实现一些cronjob来定期运行服务 。 也许 , 你想要实现分布式缓存、保证幂等性或者能够回滚 。 所有的这些都是开发人员层面的原语(primitive) , 但是在幕后 , 它们依赖于一些状态 。 我们希望能拥有这些抽象来创建健壮的分布式系统 。
Kubernetes 上分布式系统的演化
文章图片
我们将会使用这个分布式系统原语的框架来评估在Kubernetes和其他项目上这些内容的变化 。
Kubernetes 上分布式系统的演化】2
单体架构:传统中间件的能力
假设我们从单体架构开始 , 考虑如何获取这些能力 。 在这种情况下 , 当我提到单体的时候 , 在分布式应用这个上下文中 , 我想到的是ESB 。 ESB的功能是非常强大的 , 当检查我们的需求列表时 , 我会说ESB对所有有状态的抽象都有很好的支持 。