从后台服务发展之初,其实一直面临一个问题,就是如何将多台服务器组成一个整体提供对外服务。毕竟单体服务功能单一,在发展前期已经满足各种需求,但是随着互联网的发展,服务类型越来越多,也越来越复杂,如果用单体架构思考,就会发现越来越难满足需求。为了解决这个问题,于是出现了分布式架构,将单体服务拆分成多个子服务,每个子服务负责不同的功能,然后通过网关组合子服务,对外提供服务。看似这样已经解决了单体服务的问题,但是随着子服务的增多,网关也会越来越复杂,而且每个子服务都需要单独维护,服务治理就变得非常复杂。为了解决这里复杂性,因此引入各种架构概念:
分布式架构下将单独服务拆分成子服务,结合各种架构设计已经将分布式基石做好了,但是在业务层的架构设计上,还是有很多问题需要解决,比如子服务更新如何不影响全局,功能迭代如何足够快,如何细粒度的监控某些服务状态等。为了解决这些问题,于是出现了微服务架构,将业务从粒度上变成更加轻量,每个服务负责更小的业务,这样就可以更快的迭代,更细粒度的监控服务状态等。
虽然分布式基石做好了,微服务架构已经能解决业务层发展的一些问题,但是对于工程师来说,关心底层通讯协议,服务发现,负载均衡等这些细节,似乎有些繁琐,就如同使用Linux一样,如果开发者还需要关注什么是文件还是网络(在Linux中,一切皆文件),那对于负担太重了。于是随着Docker和K8S的发展,ServiceMesh 应运而生,作为云原生下的服务间通讯的中间件,屏蔽了底层通讯协议,服务发现,负载均衡等细节,让开发者只需要关注业务逻辑。
ServiceMesh架构图
发展最早的是Linkerd,通过 Sidecar 模式托管服务间的网络调用和调度,不过由于性能问题被开源社区放弃;第二代是由google发展的 Istio,重新开发了 Envoy 作为网关,将系统定义为数据面和控制面,数据面负责网络通讯和负载均衡,控制面负责服务治理,下面将详细介绍其架构和设计方式。
ServiceMesh有一些开源项目,其当前最流行是Google开源实现是 Istio,在2018年10月开源,目前已经发展到了1.2版本,其github地址为:
https://github.com/istio/istio
Istio架构图如下:
Istio架构图
提供的功能:
可以看到架构图上,每个服务都有一个sidecar,也就是 Envoy,这个就是数据面,负责服务间通讯和负载均衡。所有进入服务的请求都经过 Envoy,然后根据路由规则转发到相应的服务,所以 Envoy 被称为服务网格的入口。Envoy 架构图如下:
Envoy
当然,Envoy 并不是唯一的数据面,还有 Linkerd,Kuma 等,但是Envoy 性能比较好,所以目前使用最多。
控制面负责服务治理,比如路由规则,安全策略等,是服务网格的控制核心,通过控制面,可以配置服务网格中各个组件的行为。为了结构化控制面的功能,Istio 将其分为Pilot,Mixer,Citadel组件,其各个部分对应的功能:
Envoy是专为大型现代SOA(面向服务架构)设计的、用C++11开发的代理和通信总线,作为服务网格中的数据面,负责服务间通讯和负载均衡。开源地址:https://github.com/envoyproxy/envoy.git
(1)编译编译依赖:
git clone https://github.com/envoyproxy/envoy.gitcd envoybazel build //source/exe:envoy-static
(2)配置Envoy的配置文件为 yaml 格式,其配置文件分为两部分:
admin: # 监控配置 address: socket_address: protocol: TCP address: 0.0.0.0 port_value: 9901 # 监听的端口static_resources: listeners: - name: listener_0 address: socket_address: protocol: TCP address: 0.0.0.0 port_value: 10000 # 监听的端口 filter_chains: - filters: - name: envoy.filters.network.http_connection_manager # 过滤器名称 typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager stat_prefix: ingress_http access_log: - name: envoy.access_loggers.stdout typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog route_config: name: local_route virtual_hosts: - name: local_service domains: ["*"] routes: - match: prefix: "/" route: host_rewrite_literal: www.envoyproxy.io cluster: service_envoyproxy_io http_filters: - name: envoy.filters.http.router typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router clusters: - name: service_envoyproxy_io type: LOGICAL_DNS # Comment out the following line to test on v6 networks dns_lookup_family: V4_ONLY lb_policy: ROUND_ROBIN load_assignment: cluster_name: service_envoyproxy_io endpoints: - lb_endpoints: - endpoint: address: socket_address: address: www.envoyproxy.io port_value: 443 transport_socket: name: envoy.transport_sockets.tls typed_config: "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext sni: www.envoyproxy.io
(3)服务启动和测试
./envoy -c envoy.yamlcurl -v localhost:10000# 返回数据TODO:
(4)Envoy架构
图片
Envoy包括几个部分:
Envoy提供了xDS API标准,什么是xDS?xDS是x-discovery service,也就是服务发现服务,Envoy通过xDS API获取配置信息,然后根据配置信息进行转发,包括几个类型,分别是:EDS(endpoint discovery service),LDS(listener discovery service)和CDS(cluster discovery service),对应实现节点服务发现,监听器服务发现和集群服务发现。
Envoy
Envoy支持L3/L4 filter架构,提供了对L3/L4网络代理功能,这是Envoy的核心功能,还支持TCP、UDP、HTTP、TLS证书认证、Redis、Postgres、MongoDb等诸多协议的filter;Envoy支持HTTP L7架构,提供了对HTTP协议的filter,支持HTTP1.1、HTTP2、HTTP3,gRPC等协议;Envoy还提供了健康检查,负载均衡,熔断,限流等功能,并且有强大的可观测性,包括metrics、tracing等;
(5)Envoy处理请求流程
Istio 是基于K8S编排服务,而K8S网络相关的知识点,在《Kubernetes核心原理》做过一些介绍,这里再回顾一下:
而在Istio中,每个Pod都有一个对应的Sidecar,Sidecar负责与K8S进行通信,可以登陆到业务的Pod中执行ps aux,会看到proxy的进程,具体istio的pods详细如下图:
详情
如果你想继续探究内部实现,可以尝试自己安装Istio,如果你没有自己的可用集群,可以使用Kubernetes Playground,打开链接:https://labs.play-with-k8s.com/具体可以参考这篇文章:https://www.knowledgehut.com/blog/cloud-computing/test-drive-your-first-istio-deployment-using-play-with-kubernetes-platform-cloud-computing
对应的脚本已经准备好了,可以先执行istio-preinstall.sh:
#!/bin/bashkubeadm init --apiserver-advertise-address $(hostname -i)mkdir -p $HOME/.kubechown $(id -u):$(id -g) $HOME/.kube/configkubectl apply -n kube-system -f "https://cloud.weave.works/k8s/net?k8s-versinotallow=$(kubectl version | base64 | tr -d '/n')"
然后执行istio-install.sh:
#!/bin/bashcurl -L https://git.io/getLatestIstio | sh -export PATH=$PWD/bin:$PATHcd istio-1.21.2istioctl manifest apply --set profile=demo --set values.gateways.istio-ingressgateway.type=ClusterIP
最后执行:kubectl -n istio-system get pod 可以看到isito-ingressgateway和istio-pilot的pod状态都是running。
(1)https://cloud.tencent.com/developer/article/1351311
(2)https://labs.play-with-k8s.com/
(3)https://blog.csdn.net/KeyarchOS/article/details/135782578
本文链接:http://www.28at.com/showinfo-26-86064-0.html浅析ServiceMesh和Istio,你学会了吗?
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 详解CSS3中的Clamp()函数