服务网格是一种分布式应用程序基础设施,它负责以透明的、进程外的方式代表应用程序处理网络流量。Istio是一个由谷歌、IBM和Lyft创建的服务网格的开源实现。
基础设施:它负责将代码部署到平台上(容器、Kubernetes、公共云、虚拟机等)。Istio不限定使用哪些自动化部署工具。
应用程序业务逻辑:为了保持竞争力而必须编写的业务差异化代码,。这段代码包括业务逻辑,以及知道要调用哪些服务、以何种顺序调用服务、如何处理服务的响应(例如,如何将它们聚合在一起)、在出现故障时如何处理。
Istio扮演着部署平台和应用程序代码之间的中间人的角色,它的作用是帮助从应用程序中获取复杂的网络代码。它可以基于请求元数据内容(HTTP头等)进行路由,也可以基于服务和请求元数据匹配进行细粒度的流量控制和路由。
- 数据平面负责建立、保护和控制通过网格的流量。数据平面的行为由控制平面配置。
- 控制平面是网格的大脑,它为运维人员提供了操纵网络行为的API。
- 由于所有的流量都通过网格,可以控制流量、熔断、超时、重试、服务发现、负载均衡等。
1. Istio
1.1 控制平面
Istio控制平面及支持组件:
1.2 istiod
- 通过配置资源,我们可以指定如何允许流量进入集群,如何将其路由到特定版本的服务,在进行新部署时如何转移流量,以及服务的调用者应该如何对待超时、重试和熔断等弹性方面的问题。
- istiod接受这些配置,解析它们,并将它们作为特定于服务代理的配置公开。
- Istio使用Envoy作为服务代理,因此这些配置被转换为Envoy配置。
对于一个试图与catalog服务通信的服务,如果它的请求头中有x-dark-launch,我们可能希望将流量发送到该服务的v2。
istiod通过它的数据平面API,将这个配置意图作为Envoy配置公开给服务代理:
1.3 入口网关和出口网关
Istio网关的入站流量和出站流量:
2. 使用
2.1 部署
服务配置文件catalog.yaml
注入Istio服务代理
命名空间自动注入
为了启用自动注入,我们将istioinaction命名空间标记为istio-injection=enabled:
部署服务
还要注意READY列中的2/2:这意味着Pod中有两个容器,且两个容器都处于READY状态。其中一个容器是应用程序容器本身,在本例中为catalog;另一个容器是istio-proxy sidecar。
2.2 重试
在这个定义中,我们指定对catalog服务的请求可以重试三次,每次尝试都有2s的超时。如果设置了这条规则,当遇到请求失败时,我们可以使用Istio自动重试。
2.3 版本控制
增加 catalog-v2 版本的服务
创建DestinationRule,表示catalog服务的两个不同版本
识别版本 【虚拟主机-> 目标规则】
我们要做的第一件事情是让Istio知道如何识别catalog服务的不同版本。我们使用DestinationRule来做到这一点:
接下来,我们在catalog VirtualService中创建一条规则,将所有流量路由到catalog的v1:
现在,如果向webapp端点发送流量,将只看到v1响应。
区分版本
当调用中包含x-dark-launch:v2头时,我们会看到catalog-v2服务的响应;所有其他流量进入catalog-v1。
3. Envoy
Envoy是一个代理,位于客户端和服务器的通信之间。在Envoy中,这些协议是开箱即用的:HTTP/1.1、HTTP/2、gRPC和其他协议,Envoy可以解析它们,配置请求级超时、重试、每次重试超时、熔断和其他弹性特性。
3.1 流程
- 监听器(Listener)——向外部公开一个应用程序可以连接的端口。例如,80端口上的监听器接收流量,并将任何配置的行为应用于该流量。
- 路由(Route)——如何处理进入监听器的流量的路由规则。例如,如果传入一个请求并匹配/catalog,则将该流量定向到catalog集群。
- 集群(Cluster),Envoy可以将流量路由到这些服务。例如,catalog-v1和catalog-v2可以是单独的集群,路由可以指定将流量定向到catalog服务的v1或v2的规则。
3.2 Envoy与Istio的融合
Istio的组件和Envoy代理一起构成了一个引人注目的服务网格实现。两者都有蓬勃发展的、充满活力的社区,并面向下一代服务架构。
一个相关的例子是Envoy的服务发现,它依赖某种服务注册表来发现端点。istiod实现了这个API,但也将Envoy从所有特定的服务注册1表实现中抽象出来。当Istio被部署在Kubernetes上时,Istio使用Kubernetes的服务注册表来发现服务。Envoy代理完全不涉及这些实现细节。
4. 参考文档
- 《istio in action》