本博客链接:https://security.blog.csdn.net/article/details/
一、微服务的概念
微服务,就是将一个完整应用中所有的模块拆分成多个不同的服务,其中每个服务都可以进行独立部署、维护和扩展,服务之间通常通过RESTful API进行通信,这些服务围绕业务能力构建,且每个服务均可使用不同的编程语言和不同的数据存储技术。
微服务设计的本质在于使用功能较明确、业务较精炼的服务去解决更大、更实际的问题。
二、服务网格的概念
服务网格通常通过一组轻量级网络代理实现,这些代理与应用程序一起部署,而无需感知应用程序本身。
服务网格作为Sidecar运行在服务旁,对应用来说是透明的,所有通过应用的流量均会经过Sidecar,因此Sidecar实现了流量控制功能,包括服务发现、负载均衡、智能路由、故障注入、熔断器、TLS终止等。服务网格的出现将微服务治理从应用自身中抽离出来,通过Sidecar的形式极大降低了代码耦合度,使得微服务管理不再复杂。
目前较为流行的服务网格有Istio、Linkerd、Envoy、NginMesh、Conduit等,其中Istio凭借着社区热度以及大厂联合开发投入成为了服务网格的业界标准。
三、lstio(istio)介绍
更过内容包括安装卸载使用等可以参考官方文档:https://istio.io/latest/zh/docs/setup/getting-started/
3.1、Istio架构
Istio是一款微服务管理框架,也被认为是服务网格的代表实现,由Google、IBM、Lyft联合开发的开源项目。架构图如下:
Istio整体分成控制平面和数据平面两大部分,对应于图中的上下两个部分。
其中数据平面的架构较为简单,其核心就是在同一个Pod内运行Sidecar Proxy,由Proxy代理Pod中业务容器的流量出入,Istio采用Envoy的一个的扩展版本作为Sidecar proxy。Envoy是经过广泛使用验证的、高性能、低延迟的Sidecar代理组件,通过它对业务流量进行分发、复制以及智能路由,同时Envoy还可以对外报告流量的遥测数据。由外部进入的业务请求流量先转发到Sidecar Proxy(即Envoy)中进行处理,业务容器只与Sidecar进行交互。
控制平面则较为复杂,有Galley、Pilot、Mixer和Citadel四个组件。其中Mixer提供客户自定义Adapter的能力,这些Adapter由使用方进行扩展,扩展的Adapter由Sidecar Proxy在请求处理的出入口进行调用,实现遥测数据的汇报。
这种设计的好处有很多,首先无需更改业务容器代码,从而可以最大程度的透明化使应用程序对代理注入无感知;另一方面,Istio的开放化接口和灵活的部署机制在很大程度提升了可扩展性和可移植性;最后Istio的统一策略管理也将基于服务的诸多策略从Sidecar内部解耦,并通过API进行统一管理,从而简化了操作成本。
3.2、数据平面
Istio的数据平面由一组网络代理构成,Istio默认使用的代理为Envoy,当然这里也可以替换为其它代理,例如linkerd、nginmesh、moison或开发者自己编写的代理。Envoy是以C++为基础开发的高性能代理,用于调解服务网格中服务的所有入站和出站流量。Envoy代理是唯一与Istio数据平面流量进行交互的组件。
Envoy的核心为L3/L4和L7层网络代理,通过Envoy内部的Filter机制及开放化的Filter编程接口,开发人员可使用Envoy现有的Filter或自定义Filter对业务流量进行细粒度化管理。
Envoy的内置功能包括“服务发现”、“负载均衡”、“TLS终止”、“HTTP/2”、“GRPC代理”、“熔断器”、“健康检查”、“基于百分比流量拆分的灰度发布”、“故障注入”等。
Envoy在Istio中通常以Sidecar的方式部署,Sidecar与业务容器部署在同一个pod中。这种部署模式允许Istio提取大量流量相关的信息作为元数据。Istio可以利用这些元数据实施相应策略,并同时将元数据发送至外部监控系统,例如Prometheus,Zipkin,Jaeger等,以将服务网格中发生的行为可视化。
3.3、控制平面
Istiod为Istio的控制平面组件,istiod下又包括Pilot、Citadel、Galley、Mixer等子组件。
Pilot
Pilot负责为Envoy Sidecar提供服务发现功能,为智能路由和弹性(A/B测试,金丝雀部署,超时,重试,熔断等)提供流量管理功能,将控制流量的高级路由规则转换为特定于Envoy的配置,并在运行时传播至Envoy/Sidecar容器中。

由上图我们可以看出交互流程主要分为以下三个步骤:
1、平台启动一个服务的新实例,该实例通知Pilot的平台适配器;
2、平台适配器使用Pilot的抽象模型注册实例;
3、Pilot将流量规则和配置下发至数据平面的Envoy代理;
可以看出这种松耦合设计允许Istio在Kubernetes、Consul或Nomad等多种环境中运行,同时维护相同的Operator接口来进行流量管理。
Citadel
Citadel是Istio的安全模块,通过内置的身份和证书管理,可支持强大的服务到服务以及最终用户的身份验证,同时,我们可以使用Citadel来升级服务网格中未经加密流量。
Istio的安全功能模型通过以下几个组件的配合来施行。 · Citadel是Istio密钥的中央证书颁发机构和证书轮换机构。 · Pilot负责身份验证策略下发。 · Mixer提供了鉴权服务和审计服务。 · Envoy是Istio中微服务的通信代理,通过Envoy在微服务侧进行业务流量代理转发,并提供端到端的通信安全保障。
Galley
Galley是Istio配置过程中进行验证、提取、处理和分发的核心组件,其并不直接向数据平面提供业务能力,而是在控制平面上向其它组件提供支持,这样其它组件只用和Galley打交道,从而与底层平台(例如Kubernetes)解耦。
Galley使用MCP来支持配置更新通知,MCP是一个由Istio主导的配置更新协议,它提供了配置的订阅和分发接口。Istio控制平面中的其他两个重要组件Pilot和Mixer就作为Galley MCP的客户端来监听由Galley配置更新的消息。Galley通过CRD扩展机制来支持远端Pilot和Mixer组件监听,在配置更新时可以跨级群通知远端的Pilot和Mixer组件。

Mixer
Mixer提供了一种让Sidecar与外部监控运维系统无缝对接的框架,Sidecar接收到请求时,在转发和处理请求之前,先调用Mixer的请求检查接口,对请求的数据进行校验;Sidecar在处理完请求之后,再调用Mixer的请求汇报接口,将调用的遥测数据上报。调用关系的逻辑如下:

3.4、总结
Istio在服务身份认证、RBAC和端到端mTLS等方面具有强大的安全保障功能,在实施通信安全加密和访问保护的同时,不需要对微服务应用本身的代码进行任何更改。
Istio的安全功能模型通过以下几个组件的配合来施行:
● Citadel是Istio密钥的中央证书颁发机构和证书轮换机构。
● Pilot负责身份验证策略下发。
● Mixer提供了鉴权服务和审计服务。
● Envoy是Istio中微服务的通信代理,通过Envoy在微服务侧进行业务流量代理转发,并提供端到端的通信安全保障。
四、Istio内置安全能力
4.1、Istio证书生成和轮转过程
Citadel服务可以部署在Kubernetes节点中,也可以部署在其他地方。Istio为每个节点增加Node Agent组件,这个组件用来接收SDS接口调用以及将CSR转发给Citadel服务,由Citadel服务产生X.509证书。
具体的证书生成和轮换过程如下。
1、Envoy Proxy通过SDS API发送密钥和证书请求秘密发现服务。
2、Node Agent收到SDI请求后,创建私钥和证书签名请求(CSR)。
3、Citadel通过gRPC接收CSR,对其进行验证,然后签署CSR,生成证书,并将其发送到节点代理。
4、Node Agent将Citadel生成的密钥和证书通过SDS API发送给Envoy Proxy。
5、对于每个服务都以一定的时间间隔重复进行证书和密钥轮换,就整体完成了一次证书轮换。
4.2、配置双向认证策略
在云原生应用微服务之间彼此进行调用,需要对微服务的客户端和服务器进行双向的TLS验证。这样调用方可以对被调用方进行认证,而被调用方也可以认证客户端的身份,这就是双向认证策略,简称mTLS。
双向认证过程中,服务器端对客户端的认证过程如下:
1、服务器端保存了允许被验证通过的根证书列表。
2、客户端给服务器端发送证书验证请求,同时附带自己的ID和客户端证书。
3、服务器端对客户端的证书进行验证。
4、验证通过后,就完成了服务器端对客户端的认证,服务器端与客户端建立了一条加密数据通道。
在Istio中,通过认证策略来对微服务之间是否启用mTLS进行配置,Pilot负责将认证策略下发给对应namespace中相应Pod里的Envoy Proxy,由Envoy Proxy来完成证书的获取和启用。
五、Istio流量管理
5.1、Istio流量管理功能
Istio拥有丰富的流量管理功能,其中主要包括请求路由、故障注入、流量迁移三种。
请求路由
Istio支持用户下发请求路由策略,该策略主要用于将访问服务流量重定向至特定版本,从而实现金丝雀部署(金丝雀发布指的是在生产环境中分阶段逐步更新后端应用的版本(需要具备流量控制能力),在小范围验证符合预期之后,再推广至整个生产环境),这种方式在测试新项目上线时带来了诸多好处。
故障注入
Istio的故障注入机制主要用于测试整个应用的故障恢复能力,最终可以确保故障策略不会出现不兼容以及限制较多的情况,与在其它网络层引入故障机制不同,Istio是在应用层注入故障,从而可以获得更多结果,例如使用http状态码来标明故障结果。
流量迁移
流量迁移指将流量从应用的一个版本逐步迁移到另一个版本,在Istio中,可以通过配置一系列规则来实现这一目标,例如可以将请求中50%的流量发送到某服务A的v1版本,剩余的50%流量发送到服务A的v2版本。然后,通过调整阈值最终将100%的流量发送至服务A的v2版本来完成迁移。
5.2、Istio流量管理实体
Istio流量管理功能中有Gateways、Virtual Services、Service Entry和Destination Rules这些资源实体。这些实体的作用分别如下:
1、Gateways
Istio网关组件有Ingress Gateway和Egress Gateway两种。其中Ingress Gateway是作为外部服务调用内部服务的反向代理,在Ingress Gateway上配置服务的端口、地址和协议,同时在Ingress Gateway上还配置服务的证书和私钥。而Egress Gateway是作为内部微服务调用外部服务的出口,通过Egress Gateway来限制内部微服务对外部的访问规则,比如只允许内部微服务访问白名单地址里的外部网络。
2、Virtual Service
Istio的虚拟服务(Virtual Service)是对Kubernetes云原生的Service的补充,名为虚拟服务。它的作用是将一个真实Kubernetes Service的接口进行划分,划分的原则是根据请求地址路径,为每个划分定义Virtual Service,在Virtual Service上进行路由规则配置以及执行更高级的路由策略(比如重试策略、超时策略或故障注入策略)。
3、Service Entry
Service Entry的用途就是将云原生平台中外部的应用引入进来,在Istio的网络中形成一个代表外部服务的网络节点。Service Entry通常与Egress Gateway配合,经过Egress Gateway的Envoy对出口的流量进行TLS加密后转发给外部的ServiceEntry。
4、Destination Rule
Istio的Virtual Service定义了路由规则,根据请求路径进行转发。Destination Rule定义了路由策略,根据具体的策略对业务请求进行转发。Destination Rule的功能有以下两个:
● 高级负载均衡,Destination Rule支持4层和7层负载均衡。
● 连接池管理,通过连接池管理实现微服务熔断功能。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/40201.html