个人为了方便记忆的一些总结
架构


整体架构就是平台适配器拉去各个平台的模型转化为统一的抽象模型(适配器模式)然后用户api进行配置一些规则,会通过envoy api将这些规则下发到对应的容器中
容器在启动的时候会使用自动注入将一些其他容器注入到对应配置中,其中有个Pilot-agent容器就是代理启动的进程,它会生成一些初始化代理的基本静态配置,最后它会启动代理(envoy),然后init启动前初始化的shell脚本会修改iptable将容器中的流量全部代理到对应的代理容器envoy中
目前控制层全部集中了,使用istiod来包含之前的polit,citade, galley,然后mix被丢弃了将之前独立部署的mix放到了各个envoy中使用envoy的插件机制在插件中运行v8引擎,然后根据这个引擎可以去执行WebAssembly的代码,从而实现这种新型的mix
envoy
一种类似nginx的代理中间件,使用c++写的,有个filter的插件机制可以让用户实现很多丰富的功能
基本概念
Host:能够进行网络通信的实体(如移动设备、服务器上的应用程序)。在此文档中,主机是逻辑网络应用程序。一块物理硬件上可能运行有多个主机,只要它们是可以独立寻址的。在EDS接口中,也使用“Endpoint”来表示一个应用实例,对应一个IP+Port的组合。
Downstream:下游主机连接到 Envoy,发送请求并接收响应。
Upstream:上游主机接收来自 Envoy 的连接和请求,并返回响应。
Listener:监听器是命名网地址(例如,端口、unix domain socket等),可以被下游客户端连接。Envoy 暴露一个或者多个监听器给下游主机连接。在Envoy中,Listener可以绑定到端口上直接对外服务,也可以不绑定到端口上,而是接收其他listener转发的请求。
Cluster:集群是指 Envoy 连接的一组上游主机,集群中的主机是对等的,对外提供相同的服务,组成了一个可以提供负载均衡和高可用的服务集群。Envoy 通过服务发现来发现集群的成员。可以选择通过主动健康检查来确定集群成员的健康状态。Envoy 通过负载均衡策略决定将请求路由到哪个集群成员。
xds
由很多ds组成比如lds,cds,eds,sds,rds等
xds是一种协议,其实就是根据api动态的变更envoy代理的配置(根据api动态修改nginx的conf配置)
xds的接口是最终一致性的,为了保证服务的可用,xds在更新各个ds的内容的时候会有先后顺序,目的是为了保证服务可用
ADS
其实就是grpc中的stream流形式的服务访问,就是将各个xds中的分开的更新,变成流的形式一次性发送,从而避免更新顺序导致的配置数据不一致问题
istiod
1.6版本后整个控制层的组件现在就剩下istiod了,里面包括polit, citade, galley的功能,目前istiod用这个来替换之前那些组件是为了让服务更加清晰和简单,因为目前来说控制层基本就是作为一种配置下发了,之前的mix的遥测还有策略都被移到envoy中了
使用istiod的好处
安装变得更加容易。 所需的 Kubernetes deployment 和相关配置更少,因此 Istio 的配置选项和参数集大大减少了。在最简单的情况下,您只需启动单个 Pod,就可以启用一个包含了所有功能的 Istio 控制平面。
配置变得更加容易。 Istio 目前拥有的许多配置选项都是编排控制平面组件的方法,因此不再需要。您也不再需要更改群集范围内的 PodSecurityPolicy 来部署Istio。
使用虚拟机变得更加容易。 要将工作负载添加到网格中,现在只需要安装一个代理和已生成的证书即可。该代理仅连接单个后台服务。
维护变得更加容易。 安装、升级和删除 Istio 不再需要复杂的版本依赖关系和启动顺序。例如:要升级控制平面,您只需要在现有控制平面边上启动一个新的 istiod 版本,对其进行金丝雀部署,然后将所有流量移至该平面即可。
伸缩变得更加容易。 现在只有一个需要伸缩的组件。
调试变得更加容易。 更少的组件意味着更少的跨组件环境调试。
启动时间减少。 在以预定义的顺序启动时,组件不再需要彼此等待。
资源使用率下降,响应能力上升。 组件之间的通信将得到保证,并且不受 gRPC 报文大小限制。缓存可以被安全的共享,从而减少了资源占用。
polit
作为envoy代理的配置刷新和下发的工具,存在的意义是为了将用户的配置变更成xds api然后下发给各个envoy代理
istio-polit
在1.6版本之前,单独运行的一个控制层的组件
citade
作为istio安全组件,为了各个服务之间建立安全的访问机制,也就是给各个服务配置加密访问,然后证书过期的时候直接替换而服务不需要变更
istio-citade
在1.6版本之前,单独运行的一个控制层的组件
galley
在控制层上给其他组件提供支持,负责配置管理组件,验证配置信息的格式和正确性,将这些配置信息提供给控制层组件
istio-galley
在1.6版本之前,单独运行的一个控制层的组件
mix(已废弃)
提供2种功能,遥测和策略,用户可以自己写对应的adapter来自行实现各种功能,目前该组件被废弃,遥测功能直接移到了envoy上,而策略的功能也交给envoy上运行的v8引擎,通过WebAssembly来执行
istio-telemetry
是一种数据遥测的mix服务组件,服务将数据上报给mix然后会根据数据对数据进行汇总和上报到其他组件上去,比如zikip, Prometheus
istio-policy
另外一个mix服务,和istio-telementry基本上是完全相同的流程和机制,但是它会返回是否允许访问,也就是作为一种策略访问的组件
WebAssembly
WebAssembly(Wasm)是一种由多种语言编写的,可移植的字节码格式,它能以以接近本机的速度执行。其最初的设计目标与上述挑战很相符,并且在其背后得到了相当大的行业支持。Wasm 是在所有主流浏览器中可以本地运行的第四种标准语言(继 HTML,CSS 和 JavaScript 之后),于 2019 年 12 月成为 W3C 正式建议。这使我们有信心对其进行战略下注。
尽管 WebAssembly 最初是作为客户端技术而诞生,但它在服务器上用也有很多优势。运行时是内存安全的,并且以沙盒方式运行以确保安全。它有一个很大的工具生态系统,用于以文本或二进制格式编译和调试 Wasm。W3C 和 BytecodeAlliance 已成为其它服务器端工作的活跃中心。比如,Wasm 社区正在 W3C 中标准化 “WebAssembly 系统接口 Interface” (WASI),并通过一个示例实现,它为 Wasm “程序” 提供了一个类似 OS 的抽象。
envoy使用Wasm的架构

- 设置 Wasm 扩展的本地缓存
- 将所需的 Wasm 扩展提取到本地缓存中
- 将 wasm-cache 挂载到适当的工作负载中
- 使用 EnvoyFilter CRD 配置 Envoy 以使用 Wasm 过滤器
serviceEntry
一种抽象的概念,为了将外部服务也纳入到istio的流量管控而创建的一种对象,用这种对象去访问外部服务可以使用istio的很多功能
Gateway
类似k8s种的ingress对象只是gateway只是做l3-l6层的流量管理,而ingress管l7层的流量,其实个人感觉gateway就是ingress
ingressGateway
入口流量的网关,本质就是envoy,也是为了复用和统一管理流量,是一种loadbanlance类型的service,配合VirtualService和gateway
engressGateway
出口流量的网关,本质就是envoy,也是为了复用和统一管理流量,是一种loadbanlance类型的service, 配合VirtualService和gateway
VirtualService
概念
描述了一个或多个用户可寻址目标到网格内实际工作负载之间的映射关系。其中,用户可寻址目标可以是任何用于定位服务的,具有可选通配符前缀或 CIDR 前缀的 DNS 名称。这对于应用从单体架构到微服务架构的迁移过程特别有用,单体应用被拆分为多个独立的微服务后,采用 VirtualService 可以继续把多个微服务对外暴露为同一个目标地址,而不需要服务消费者进行修改以适应该变化
总的来说VirtualService目的是为了定位流量到达的位置,而DestinationRule目的是定位流量到达后的策略执行
功能
HTTPRoute
- 重定向(HTTPRedirect)
- 重写(HTTPRewrite)
- 重试(HTTPRetry)
- 故障注入(HTTPFaultInjection)
- 跨站(CorsPolicy)
- 镜像(Mirror)
HTTPMatchRequest
支持将http属性如url,scheme, mechod, authority, port,headers, sourceLabels等作为条件匹配
然后匹配规则可以规定gateways
HTTPRouteDestination
route字段是一个HTTPRouteDestination类型的数组,而HTTPRouteDestination是用来定义路由的走向的, destination字段用来表示请求的目标,通过host,subset和port属性来描述,
weight是用来设置路由权重的
headers可以让路由根据请求头来决定如何如有
TLSRoute路由
TLS配有几种配置,一种是自行配置公钥私钥的地址,其实就是创建特定名称k8s的secret文件里面包含公钥私钥然后gateway的默认配置会自动加载特定名称的secret,还有一种是使用sni进行对流量渗透,从而让服务来进行安全管理(也就是流量直接去nginx服务,让nginx服务来做安全),最后一种是是sds的形式credentialName直接配置对应的secret
DestinationRule
定义了目标 host 的子集 subsets (或者称之为命名版本)。 这些 subset 用于 VirtualService 的路由规则设置中,可以将流量导向服务的某些特定版本。 通过这种方式为版本命名后,可以在不同的 virtual service 中明确地引用这些命名版本的 subset,简化 Istio 代理发出的统计数据。 服务的所有请求流量都会通过 Envoy 自动重新路由。Envoy 在负载均衡池中的实例之间分发流量
功能
- trafficPolicy,定义负载均衡,连接池策略,异常点检查(类似断路器),端口流量策略设置(其实就是定义局部流量策略,覆盖全局流量策略), tls认证配置
- subsets,定义一个服务的子集,用来定义一个服务版本