7.3 Linkerd
2016年1月,离开Twitter的基础设施工程师打造的一个服务网格项目,第一个Service Mesh项目由此诞生,解决通用性。
Linkerd很好地结合了Kubernetes所提供的功能,以此为基础,在每个Kubernetes Node上都部署运行一个Linkerd实例,用代理的方式将加入Mesh的Pod通信转接给Linkerd,这样Linkerd就能在通信链路中完成对通信的控制和监控。
Linkerd设计思想
Linderd的思想跟sidecar很类似,目标也是屏蔽网络通信细节
Linkerd除了完成对Service Mesh的命名,以及Service Mesh各主要功能的落地,还有以下重要创举:
- 无须侵入工作负载的代码,直接进行通信监视和管理;
- 提供了统一的配置方式,用于管理服务之间的通信和边缘通信;
- 除了支持Kubernetes,还支持多种底层平台。
- 总结:
- 跟我们前面sidecar很类似,以前的调用方式都是服务来调用服务,在Linkerd思想要求所有的流量都走sidecar,Linkerd帮业务人员屏蔽了通信细节,通信不需要侵入到业务代码内部了,这样业务开发者就专注于业务开发的本身
- Linkerd在面世之后,迅速获得用户的关注,并在多个用户的生产环境上成功部署、运行。2017年,Linkerd加入CNCF,随后宣布完成对千亿次生产环境请求的处理,紧接着发布了1.0版本,并且具备一定数量的商业用户,一时间风光无限,一直持续到Istio横空出世。
问题: 在早期的时候又要部署服务,又要部署sidecar,对于运维人员来说比较困难的,所以没有得到很好的发展,其实主要的 问题是Linkerd只是实现了数据层面的问题,但没有对其进行很好的管理。
数据层面:通过sidecar解决了数据处理的问题
打开github:搜索linkerd,是由scala语言编写的
7.4 istio
由Google、IBM和Lyft共同发起的开源项目
打开github:搜索istio,是由go语言编写的
什么是istio?
地址
:https://istio.io/docs/concepts/what-is-istio/#why-use-istio
Istio makes it easy to create a network of deployed services with load balancing, service-to-service authentication, monitoring, and more, with few or no code changes in service code. You add Istio support to services by deploying a special sidecar proxy throughout your environment that intercepts all network communication between microservices, then configure and manage Istio using its control plane functionality 翻译: 通过Istio,可以轻松创建带有负载平衡,服务到服务的身份验证,监视等功能的已部署服务网络,使得服务中的代码更改很少或没有更改。 通过在整个环境中部署一个特殊的sidecar代理来拦截微服务之间的所有网络通信,然后使用其控制平面功能配置和管理,可以为服务添加Istio支持。
注意这句话:
使得服务中的代码更改很少或没有更改
这句描述非常重要,如果我们用的是spring cloud通信功能,是不是要加依赖、加注解、改配置
什么是控制平面?
控制平面就是来管理数据平面,也就是管理sideCar
所以istio既有数据平面也有控制平面
istio能干什么?
Automatic load balancing for HTTP, gRPC, WebSocket, and TCP traffic. Fine-grained control of traffic behavior with rich routing rules, retries, failovers, and fault injection. A pluggable policy layer and configuration API supporting access controls, rate limits and quotas. Automatic metrics, logs, and traces for all traffic within a cluster, including cluster ingress and egress. Secure service-to-service communication in a cluster with strong identity-based authentication and authorization. 翻译: 1.HTTP、gRPC、WebSocket和TCP流量的自动负载平衡。 2.路由、重试、故障转移和故障注入对流量行为进行细粒度控制。 3.支持访问控制、速率限制、配置API。 4.集群内所有流量的自动衡量、日志和跟踪,包括集群入口和出口。 5.使用基于身份验证和授权来保护集群中服务跟服务之间的通信。
**总结:**很明显Istio不仅拥有“数据平面(Data Plane)”,而且还拥有“控制平面(Control Plane),也就是拥有了数据 接管与集中控制能力。
7.5 什么是服务网格
服务网格:指的是微服务网络应用之间的交互,随着规模和复杂性增加,服务跟服务调用错综复杂
如下图所示
如果每一个格子都是一个sidecar数据平面,然后sidecar进行彼此通信,那么servicemech就是来管理每个格子的控制平面,这就是服务网格,从架构层面看起来跟网格很像
特点: 基础设施:服务网格是一种处理服务之间通信的基础设施层。 支撑云原生:服务网格尤其适用于在云原生场景下帮助应用程序在复杂的服务间可靠地传递请求。 网络代理:在实际使用中,服务网格一般是通过一组轻量级网络代理来执行治理逻辑的。 对应用透明:轻量网络代理与应用程序部署在一起,但应用感知不到代理的存在,还是使用原来的方式工作。
7.6 什么是Service Mesh
istio官网 也对什么是service mesh给出了定义
地址
:https://istio.io/docs/concepts/what-is-istio/#what-is-a-service-mesh
Istio addresses the challenges developers and operators face as monolithic applications transition towards a distributed microservice architecture. To see how, it helps to take a more detailed look at Istio’s service mesh. 翻译: 解决开发与运维部署分布式微服务面临的问题
The term service mesh is used to describe the network of microservices that make up such applications and the interactions between them. As a service mesh grows in size and complexity, it can become harder to understand and manage. Its requirements can include discovery, load balancing, failure recovery, metrics, and monitoring. A service mesh also often has more complex operational requirements, like A/B testing, canary rollouts, rate limiting, access control, and end-to-end authentication. 翻译: 也是解决微服务之间服务跟服务之间通信的问题,可以包括服务发现、负载平衡、故障恢复、度量和监视,服务网格通常还具有更复杂的操作需求,如A/B测试、速率限制、访问控制和端到端身份验证
7.7 CNCF云原生组织发展和介绍
云原生发展历史时间轴
- 微服务
马丁大师在2014年定义了微服务
- Kubernetes
从2014年6月由Google宣布开源,到2015年7月发布1.0这个正式版本并进入CNCF基金会,再到2018年3月从CNCF基金会正式毕业,迅速成为容器编
- Linkerd
Scala语言编写,运行在JVM中,Service Mesh名词的创造者 2016年01月15号,0.0.7发布 2017年01月23号,加入CNCF组织 2017年04月25号,1.0版本发布
- Envoy
envoy是一个开源的服务代理,为云原生设计的程序,由C++语言编程[Lyft] 2016年09月13号,1.0发布 2017年09月14号,加入CNCF组织
- Istio
Google、IBM、Lyft发布0.1版本 Istio是开源的微服务管理、保护和监控框架。Istio为希腊语,意思是”起航“。
CNCF介绍
CNCF 是一个开源软件基金会,致力于使云原生计算具有普遍性和可持续性。 云原生计算使用开源软件技术栈将应用程序部署为微服务,将每个部分
CNCF解决了什么问题
- 统一基础平台:kubernetes
- 如果我们需要日志监控:Prometheus
- 需要代理:Envoy
- 需要分布式链路跟踪:Jaeger
- …
介绍几个常用的已经毕业的云原生项目
- Kubernetes
Kubernetes 是世界上最受欢迎的容器编排平台也是第一个 CNCF 项目。 Kubernetes 帮助用户构建、扩展和管理应用程序及其动态
- Prometheus
Prometheus 为云原生应用程序提供实时监控、警报包括强大的查询和可视化能力,并与许多流行的开源数据导入、导出工具集成。
- Jaeger
Jaeger 是由 Uber 开发的分布式追踪系统,用于监控其大型微服务环境。 Jaeger 被设计为具有高度可扩展性和可用性,它具有现
- Containerd
Containerd 是由 Docker 开发并基于 Docker Engine 运行时的行业标准容器运行时组件。 作为容器生态系统的选择,Containerd
- Envoy
Envoy 是最初在 Lyft 创建的 Service Mesh(服务网格),现在用于Google、Apple、Netflix等公司内部。 Envoy 是用 C++ 编写
- Fluentd
Fluentd 是一个统一的日志记录工具,可收集来自任何数据源(包括数据库、应用程序服务器、最终用户设备)的数据,并与众多警报、分析
孵化中的项目,
- Open Tracing
OpenTracing:为不同的平台,供应中立的API,使开发人员可以轻松地应用分布式跟踪。
- GRPC
gRPC 是一个高性能、开源和通用的 RPC 框架,语言中立,支持多种语言。
- CNI
CNI 就是这样一个标准,它旨在为容器平台提供网络的标准化。不同的容器平台能够通过相同的接口调用不同的网络组件。
- Helm
Helm 是 Kubernetes 的包管理器。包管理器类似于我们在Centos中使用的yum一样,能快速查找、下载和安装软件包。
- Etcd
一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。一般用的最多的就是作为一个注册中心来使用
7.8 国内兴起的服务网格
前面提到,在Service Mesh这个概念得到具体定义之前,实际上已经有很多厂商开始了微服务新的尝试,这一动作势必引发对微服务治理的强劲
- 蚂蚁金服 sofa Mesh
代理架构
前身是SOFA RPC ,2018年07月正式开源
- 腾讯 Tencent Service Mesh
代理架构
- 华为 CSE Mesher
代理架构
总结:
基本上都借鉴了Sidecar、Envoy和Istio等设计思想