kubernetes-handbook/usecases/microservices.md

4.3 KiB
Raw Blame History

微服务架构

Kubernetes 设计之初就是按照 Cloud Native 的理念设计的Cloud Native 中有个重要概念就是微服务的架构设计,当将单体应用拆分微服务后, 随着服务数量的增多,如何微服务进行管理以保证服务的 SLA 呢为了从架构层面上解决这个问题解放程序员的创造性避免繁琐的服务发现、监控、分布式追踪等事务Service mesh 应运而生。

什么是 service mesh

Service mesh 有如下几个特点:

  • 应用程序间通讯的中间层
  • 轻量级网络代理
  • 应用程序无感知
  • 解耦应用程序的重试/超时、监控、追踪和服务发现

目前两款流行的 service mesh 开源软件 IstioLinkerd 都可以直接在 kubernetes 中集成,其中 Linkerd 已经成为 CNCF 成员。

Service mesh如何工作

下面以 Linkerd 为例讲解 service mesh 如何工作Istio 作为 service mesh 的另一种实现原理与 linkerd 基本类似,后续文章将会详解 Istio 和 Linkerd 如何在 kubernetes 中工作。

  1. Linkerd 将服务请求路由到目的地址,根据中的参数判断是到生产环境、测试环境还是 staging 环境中的服务(服务可能同时部署在这三个环境中),是路由到本地环境还是公有云环境?所有的这些路由信息可以动态配置,可以是全局配置也可以为某些服务单独配置。
  2. 当 Linkerd 确认了目的地址后,将流量发送到相应服务发现端点,在 kubernetes 中是 service然后 service 会将服务转发给后端的实例。
  3. Linkerd 根据它观测到最近请求的延迟时间,选择出所有应用程序的实例中响应最快的实例。
  4. Linkerd 将请求发送给该实例,同时记录响应类型和延迟数据。
  5. 如果该实例挂了、不响应了或者进程不工作了Linkerd 将把请求发送到其他实例上重试。
  6. 如果该实例持续返回 errorLinkerd 会将该实例从负载均衡池中移除,稍后再周期性得重试。
  7. 如果请求的截止时间已过Linkerd 主动失败该请求,而不是再次尝试添加负载。
  8. Linkerd 以 metric 和分布式追踪的形式捕获上述行为的各个方面,这些追踪信息将发送到集中 metric 系统。

为何使用 service mesh

Service mesh 并没有给我们带来新功能,它是用于解决其他工具已经解决过的问题,只不过这次是在 Cloud Native 的 kubernetes 环境下的实现。

在传统的 MVC 三层 Web 应用程序架构下,服务之间的通讯并不复杂,在应用程序内部自己管理即可,但是在现今的复杂的大型网站情况下,单体应用被分解为众多的微服务,服务之间的依赖和通讯十分复杂,出现了 twitter 开发的 Finagle、Netflix 开发的 Hystrix 和 Google 的 Stubby 这样的 ”胖客户端“ 库,这些就是早期的 service mesh但是它们都近适用于特定的环境和特定的开发语言并不能作为平台级的 service mesh 支持。

在 Cloud Native 架构下容器的使用给予了异构应用程序的更多可行性kubernetes 增强的应用的横向扩容能力,用户可以快速的编排出复杂环境、复杂依赖关系的应用程序,同时开发者又无须过分关心应用程序的监控、扩展性、服务发现和分布式追踪这些繁琐的事情而专注于程序开发,赋予开发者更多的创造性。

参考

WHATS A SERVICE MESH? AND WHY DO I NEED ONE?

So what even is a Service Mesh? Hot take on Istio and Linkerd

linkerd: A service mesh for AWS ECS

Introducing Istio: A robust service mesh for microservices

Application Network Functions With ESBs, API Management, and Now.. Service Mesh?