微服务
韶华白首白驹过隙
这个作者很懒,什么都没留下…
展开
-
Istio故障定位方法
请求转发流程微服务之间的流量经过服务网格接管后,在微服务之间引入了多个代理层,微服务之间的通信变得更为复杂了。下图分析了一个客户端请求的流量是如何在服务网格中进行路由的。备注:由于Istio Ingress Gateway的功能缺少API管理功能,因此下图采用了API Gateway + sidecar来作为Ingress,和原始的Istio Ingress有所不同,但流量转发逻辑类似。Is...转载 2019-10-18 10:57:15 · 841 阅读 · 0 评论 -
Sidecar自动注入原理
前言Kubernets 1.9版本引入了Admission Webhook(web 回调)扩展机制,通过Webhook,开发者可以非常灵活地对Kubernets API Server的功能进行扩展,在API Server创建资源时对资源进行验证或者修改。使用webhook的优势是不需要对API Server的源码进行修改和重新编译就可以扩展其功能。插入的逻辑实现为一个独立的web进程,通过参数...转载 2019-10-18 10:50:43 · 1587 阅读 · 0 评论 -
Envoy Proxy代码构建分析
Istio由控制面和数据面组成。其中Envoy是Istio在数据面缺省使用的转发代理,Istio利用Envoy的四层和七层代理功能对网格中微服务之间的调用流量进行转发。今天我们来分析一下Istio 使用到的Envoy构建流程。https://github.com/istio/proxy 这个库中包含了Istio对Envoy的扩展,包括用于对接Mixer的Filter和安全认证的Filter。但这...转载 2019-10-18 10:44:26 · 1002 阅读 · 0 评论 -
服务注册插件机制代码解析
Istio服务注册插件机制在Istio架构中,Pilot组件负责维护网格中的标准服务模型,该标准服务模型独立于各种底层平台,Pilot通过适配器和各底层平台对接,以使用底层平台中的服务数据填充此标准模型。例如Pilot中的Kubernetes适配器通过Kubernetes API Server到kubernetes中的Service以及对应的POD实例,将该数据被翻译为标准模型提供给Pilot...转载 2019-10-18 10:42:19 · 424 阅读 · 0 评论 -
服务网格入口网关的解决方案
采用API Gateway + Sidecar Proxy作为服务网格的流量入口在目前难以找到一个同时具备API Gateway和Isito Ingress能力的网关的情况下,一个可行的方案是使用API Gateway和Sidecar Proxy一起为服务网格提供外部流量入口。由于API Gateway已经具备七层网关的功能,Mesh Ingress中的Sidecar只需要提供VirtualS...转载 2019-10-18 10:14:34 · 403 阅读 · 0 评论 -
服务化应用对API Gateway的功能需求
应用对API Gateway的需求采用Gateway和VirtualService实现的Istio Ingress Gateway提供了网络入口处的基础通信功能,包括可靠的通信和灵活的路由规则。但对于一个服务化应用来说,网络入口除了基础的通讯功能之外,还有一些其他的应用层功能需求,例如:第三方系统对API的访问控制用户对系统的访问控制修改请求/返回数据服务API的生命周期管理服务访问...转载 2019-10-18 10:11:44 · 281 阅读 · 0 评论 -
采用Istio Gateway作为网络的流量入口
Istio GatewayIstio社区意识到了Ingress和Mesh内部配置割裂的问题,因此从0.8版本开始,社区采用了 Gateway 资源代替K8s Ingress来表示流量入口。Istio Gateway资源本身只能配置L4-L6的功能,例如暴露的端口,TLS设置等;但Gateway可以和绑定一个VirtualService,在VirtualService 中可以配置七层路由规则,这...转载 2019-10-18 10:08:58 · 769 阅读 · 0 评论 -
采用K8s Ingress作为网格的流量入口
如何为服务网格选择入口网关?在Istio服务网格中,通过为每个Service部署一个sidecar代理,Istio接管了Service之间的请求流量。控制面可以对网格中的所有sidecar代理进行统一配置,实现了对网格内部流量的路由控制,从而可以实现灰度发布,流量镜像,故障注入等服务管控功能。但是,Istio并没有为入口网关提供一个较为完善的解决方案。K8s Ingress在0.8版本以前,...转载 2019-10-18 10:06:38 · 1923 阅读 · 0 评论 -
外部通讯-Ingress
IngressLoadBalancer类型的Service提供的是四层负载均衡器,当只需要向外暴露一个服务的时候,采用这种方式是没有问题的。但当一个应用需要对外提供多个服务时,采用该方式则要求为每一个四层服务(IP+Port)都创建一个外部load balancer。一般来说,同一个应用的多个服务/资源会放在同一个域名下,在这种情况下,创建多个Load balancer是完全没有必要的,反而带...转载 2019-10-18 10:03:39 · 404 阅读 · 0 评论 -
外部通讯-LoadBalancer
LoadBalancerNodePort提供了一种从外部网络访问Kubernetes集群内部Service的方法,但该方法存在下面一些限制,导致这种方式主要适用于程序开发,不适合用于产品部署。Kubernetes cluster host的IP必须是一个well-known IP,即客户端必须知道该IP。但Cluster中的host是被作为资源池看待的,可以增加删除,每个host的IP一般也...转载 2019-10-18 09:33:18 · 1890 阅读 · 0 评论 -
外部通信-NodePort
如何从外部网络访问Kubernetes的Pod IP和Cluster IP都只能在集群内部访问,而我们通常需要从外部网络上访问集群中的某些服务,Kubernetes提供了下述几种方式来为集群提供外部流量入口。NodePortNodePort在集群中的主机节点上为Service提供一个代理端口,以允许从主机网络上对Service进行访问。Kubernetes官网文档只介绍了NodePort的功...转载 2019-10-18 09:27:57 · 11257 阅读 · 0 评论 -
内部通讯-Sidecar Proxy
Istio Sidecar ProxyCluster IP解决了服务之间相互访问的问题,但从上面Kube-proxy的三种模式可以看到,Cluster IP的方式只提供了服务发现和基本的LB功能。如果要为服务间的通信应用灵活的路由规则以及提供Metrics collection,distributed tracing等服务管控功能,就必须得依靠Istio提供的服务网格能力了。在Kubernet...转载 2019-10-18 09:22:35 · 1093 阅读 · 0 评论 -
内部通讯-ClusterIP
内部服务间的通信首先,我们来回顾一下Kubernetes集群内部各个服务之间相互访问的方法。Cluster IPKubernetes以Pod作为应用部署的最小单位。kubernetes会根据Pod的声明对其进行调度,包括创建、销毁、迁移、水平伸缩等,因此Pod 的IP地址不是固定的,不方便直接采用Pod IP对服务进行访问。为解决该问题,Kubernetes提供了Service资源,Ser...转载 2019-10-18 09:18:43 · 2000 阅读 · 0 评论 -
对Bookinfo进行端到端分析
Bookinfo 示例程序分析下面我们以Bookinfo为例对Istio中的流量管理实现机制,以及控制面和数据面的交互进行进一步分析。Bookinfo程序结构下图显示了Bookinfo示例程序中各个组件的IP地址,端口和调用关系,以用于后续的分析。xDS接口调试方法首先我们看看如何对xDS接口的相关数据进行查看和分析。Envoy v2接口采用了gRPC,由于gRPC是基于二进制的RPC...转载 2019-10-17 14:54:21 · 1012 阅读 · 0 评论 -
数据面标准接口
数据面标准API前面讲到,Pilot采用了一套标准的API来向数据面Sidecar提供服务发现,负载均衡池和路由表等流量管理的配置信息。该标准API的文档参见Envoy v2 API[5]。Data Plane API Protocol Buffer Definition[6])给出了v2 grpc接口相关的数据结构和接口定义。(备注:Istio早期采用了Envoy v1 API,目前的版本中...转载 2019-10-17 14:42:23 · 206 阅读 · 0 评论 -
Istio流量管理相关组件
Istio流量管理相关组件我们可以通过下图了解Istio流量管理涉及到的相关组件。虽然该图来自Istio Github old pilot repo, 但图中描述的组件及流程和目前Pilot的最新代码的架构基本是一致的。Pilot Design Overview (来自Istio old_pilot_repo[4])图例说明:图中红色的线表示控制流,黑色的线表示数据流。蓝色部分为和Pilo...转载 2019-10-17 14:40:47 · 219 阅读 · 0 评论 -
Istio流量管理高层架构
Istio作为一个service mesh开源项目,其中最重要的功能就是对网格中微服务之间的流量进行管理,包括服务发现,请求路由和服务间的可靠通信。Istio实现了service mesh的控制面,并整合Envoy开源项目作为数据面的sidecar,一起对流量进行控制。Istio体系中流量管理配置下发以及流量规则如何在数据面生效的机制相对比较复杂,通过官方文档容易管中窥豹,难以了解其实现原理。本...转载 2019-10-17 14:38:32 · 223 阅读 · 0 评论 -
应用场景-故障注入
对于一个大型微服务应用而言,系统的健壮性非常重要。在微服务系统中存在大量的服务实例,当部分服务实例出现问题时,微服务应用需要具有较高的容错性,通过重试,断路,自愈等手段保证系统能够继续对外正常提供服务。因此在应用发布到生产系统强需要对系统进行充分的健壮性测试。对微服务应用进行健壮性测试的一个最大的困难是如何对系统故障进行模拟。在一个部署了成百上千微服务的测试环境中,如果想通过对应用,主机或者交换...转载 2019-10-16 18:00:39 · 1703 阅读 · 2 评论 -
应用场景-断路器
在微服务架构中,存在着许许多多的服务单元,若一个服务出现故障,就会因依赖关系形成故障蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构就更加的不稳定。为了解决这样的问题,因此产生了断路器模式。断路器模式指,在某个服务发生故障时,断路器的故障监控向调用放返回一个及时的错误响应,而不是长时间的等待。这样就不会使得调用线程因调用故障被长时间占用,从而避免了故障在整个系统中的蔓延。Istio 实现断...转载 2019-10-16 17:59:47 · 739 阅读 · 0 评论 -
应用场景-灰度发布
当应用上线以后,运维面临的一大挑战是如何能够在不影响已上线业务的情况下进行升级。无论进行了多么完善的测试,都无法保证线下测试时发现所有潜在故障。在无法百分百避免版本升级故障的情况下,需要通过一种方式进行可控的版本发布,把故障影响控制在可以接受的范围内,并可以快速回退。可以通过灰度发布(又名金丝雀发布)来实现业务从老版本到新版本的平滑过渡,并避免升级过程中出现的问题对用户造成的影响。Istio通...转载 2019-10-16 17:58:42 · 1439 阅读 · 1 评论 -
应用场景-度量收集
Istio 实现度量收集的原理如下图所示:Envoy收集指标相关的原始数据,如请求的服务,HTTP状态码,调用时延等,这些收集到的指标数据被送到Mixer,通过Mixer Adapters 将指标信息转换后发送到后端的监控系统中。由于Mixer使用了插件机制,后端监控系统可以根据需要在运行期进行动态切换。...转载 2019-10-16 17:54:51 · 112 阅读 · 0 评论 -
应用场景-分布式调用跟踪
在微服务架构中,业务的调用链非常复杂,一个来自用户的请求可能涉及到几十个服务的协同处理。因此需要一个跟踪系统来记录和分析同一次请求在整个调用链上的相关事件,从而帮助研发和运维人员分析系统瓶颈,快速定位异常和优化调用链路。Istio通过在Envoy代理上收集调用相关数据,实现了对应用无侵入的分布式调用跟踪分析。 Istio实现分布式调用追踪的原理如下图所示:Envoy收集一个端到端调用中的各个...转载 2019-10-16 17:53:26 · 245 阅读 · 1 评论 -
Istio数据面
Istio数据面以“边车”(sidecar)的方式和微服务一起部署,为微服务提供安全、快速、可靠的服务间通讯。由于Istio的控制面和数据面以标准接口进行交互,因此数据可以有多种实现,Istio缺省使用了Envoy代理的扩展版本。Envoy是以C ++开发的高性能代理,用于调解服务网格中所有服务的所有入站和出站流量。Envoy的许多内置功能被Istio发扬光大,例如动态服务发现,负载均衡,TLS...转载 2019-10-16 17:51:24 · 580 阅读 · 0 评论 -
Istio控制面
Istio控制面板包括3个组件:Pilot, Mixer和Istio-Auth。PilotPilot维护了网格中的服务的标准模型,这个标准模型是独立于各种底层平台的。Pilot通过适配器和各底层平台对接,以填充此标准模型。例如Pilot中的Kubernetes适配器通过Kubernetes API服务器得到kubernetes中pod注册信息的更改,入口资源以及存储流量管理规则等信息,然后将...转载 2019-10-16 17:46:45 · 1483 阅读 · 0 评论