1. Istio简介
Istio提供了服务网络(ServiceMesh)基础环境。解决了开发人员和运维人员所面临的从单体应用向分布式微服务架构转变的挑战。
1.1 Istio是什么
Istio的核心意义在于:适配多种Pass平台,把调用链路相关工作从业务逻辑中彻底剥离出来。形成“数据平面”,再通过添加“控制平面”进行统一控制,把整个链路负载工作都下沉到了PaaS基础技术栈上层,从此业务开发工程师不再需要关心内部实现,就像使用云服务一样简单。
与TCP/IP协议一样,即在网络通信出现问题时,不会有人质疑“拥塞控制”与“流量控制”的逻辑——它们已诞生几十年了,时间已经证明了它们的稳定性,大家都淡忘了其存在,除少数据情况或者特殊场景外,在应用层没有工程师会去留意TCP/IP协议里的传输内容。
1.2 Istio主要特性
1. 流量管理
Istio 简单的规则配置和流量路由允许您控制服务之间的流量和 API 调用过程。Istio 简化了服务级属性(如熔断器、超时和重试)的配置,并且让它轻而易举的执行重要的任务(如 A/B 测试、金丝雀发布和按流量百分比划分的分阶段发布)。
有了更好的对流量的可视性和开箱即用的故障恢复特性,您就可以在问题产生之前捕获它们,无论面对什么情况都可以使调用更可靠,网络更健壮。
2. 安全
Istio 的安全特性解放了开发人员,使其只需要专注于应用程序级别的安全。Istio 提供了底层的安全通信通道,并为大规模的服务通信管理认证、授权和加密。有了 Istio,服务通信在默认情况下就是受保护的,可以让您在跨不同协议和运行时的情况下实施一致的策略——而所有这些都只需要很少甚至不需要修改应用程序。
Istio 是独立于平台的,可以与 Kubernetes(或基础设施)的网络策略一起使用。但它更强大,能够在网络和应用层面保护pod到 pod 或者服务到服务之间的通信。
3. 可观察性
Istio 健壮的追踪、监控和日志特性让您能够深入的了解服务网格部署。通过 Istio 的监控能力,可以真正的了解到服务的性能是如何影响上游和下游的;而它的定制 Dashboard 提供了对所有服务性能的可视化能力,并让您看到它如何影响其他进程。
Istio 的 Mixer 组件负责策略控制和遥测数据收集。它提供了后端抽象和中介,将一部分 Istio 与后端的基础设施实现细节隔离开来,并为运维人员提供了对网格与后端基础实施之间交互的细粒度控制。
1.3 Istio架构
Istio的所有模块整体上被划分成两层:“数据平面”与“控制平面”。这两个概念是Istio的核心,也是最基础的逻辑划分。
数据平面(Data Plane)
Istio 默认采用Envoy作为sidecar,它们在服务之间进行实际路由。
当所有流量流经 Envoy proxy 时,它们会收集有关业务流量的基本数据,这可以帮助我们收集信息,做好规划。
Envoy proxy 可帮助提供 Istio 的大多数功能,例如:
- 流量控制:这有助于控制流量通过服务网格,例如提供 HTTP、TCP、Websocket 和 gRPC 流量的路由规则。
- 安全性和身份验证:它对 Pod 实施身份和访问管理,以便只有正确的 Pod 才能与另一个 Pod 交互。此外,还实现了双向 TLS 和流量加密,以防止中间人攻击。
- 网络弹性:它有助于提供网络弹性功能,例如重试、故障转移、断路和故障注入。
控制平面(Control Plane)
这是告诉数据平面如何路由流量的组件,它存储、管理配置,帮助管理员与 sidecar 代理进行交互并控制 Istio 服务网格。控制平面就像是 Istio 的大脑。
控制平面以单个二进制 Istiod 的形式提供:
- Pilot 是Istio实现流量管理的核心组件,它主要的作用是配置和管理Envoy代理。比如可以为代理之间设置特定的流量规则,或者配置超时、重试、熔断这样的弹性能力。Pilot会将控制流量行为的路由规则转换为Envoy的配置,并在运行时将它们广播到Envoy。
- Mixer的主要功能是提供策略控制,并从Envoy代理收集遥测数据。每次网络通信时Envoy代理都会向Mixer发出预检要求,用来检测调用者的合法性。
- Citadel是与安全相关的组件,主要负责密钥和证书的管理。
- Galley是配置管理组件,负责配置的获取、处理和分发。
1.4 缺点
蚂蚁金服的工程师们就认为Mixer的中心化设计也不能完全满足其生产场景,主要原因便是存在流量集中的现象,即由于中心节点Mixer的存在,链路的认证、鉴权、统计等信息都需要请求中心来实现,在大规模微服务体系中,确实有很大的吞吐量压力。
蚂蚁金服的工程师们为了规避上述问题,将Mixer的部分逻辑移到了Sidecar中(蚂蚁金服使用的Sidecar并不是官方的Envoy,而是Go语言编写的Mosn)。
2. 流量管理
Istio扩展了K8s的CRD,我们可以像使用k8s的API声明一样,使用Istio轻松地实现各种维度的流量控制。
Istio 简化了服务级别属性的配置,比如熔断器、超时和重试,并且能轻松的设置重要的任务,如 A/B 测试、金丝雀发布、基于流量百分比切分的概率发布等。它还提供了开箱即用的故障恢复特性,有助于增强应用的健壮性,从而更好地应对被依赖的服务或网络发生故障的情况。
Istio 的流量管理模型源于和服务一起部署的 Envoy 代理。网格内服务发送和接收的所有流量(data plane流量)都经由 Envoy 代理,这让控制网格内的流量变得异常简单,而且不需要对服务做任何的更改。
比如下面的配置,根据请求是否来自特定的用户,把它们路由到服务的不同版本。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v3
另外,使用匹配条件您可以按百分比”权重“分发请求。这在 A/B 测试和金丝雀发布中非常有用
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 75
- destination:
host: reviews
subset: v2
weight: 25
超时是 Envoy 代理等待来自给定服务的答复的时间量,以确保服务不会因为等待答复而无限期的挂起,并在可预测的时间范围内调用成功或失败:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
timeout: 10s
重试设置指定如果初始调用失败,Envoy 代理尝试连接服务的最大次数:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
retries:
attempts: 3
perTryTimeout: 2s
在熔断器中,设置一个对服务中的单个主机调用的限制,例如并发连接的数量或对该主机调用失败的次数。一旦限制被触发,熔断器就会“跳闸”并停止连接到该主机。使用熔断模式可以快速失败而不必让客户端尝试连接到过载或有故障的主机:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
3. 安全
Istio安全架构–理解身份/认证/授权
4. 可观察性
Istio 为网格内所有的服务通信生成详细的遥测数据。这种遥测技术提供了服务行为的可观察性,使运维人员能够排查故障、维护和优化应用程序,而不会给服务的开发人员带来任何额外的负担。通过 Istio,运维人员可以全面了解到受监控的服务如何与其他服务以及 Istio 组件进行交互。
Istio 生成以下类型的遥测数据,以提供对整个服务网格的可观察性:
- 指标。Istio 基于 4 个监控的黄金标识(延迟、流量、错误、饱和)生成了一系列服务指标。Istio 还为网格控制平面提供了更详细的指标。除此以外还提供了一组默认的基于这些指标的网格监控仪表板。
- 分布式追踪。Istio 为每个服务生成分布式追踪 span,运维人员可以理解网格内服务的依赖和调用流程。
- 访问日志。当流量流入网格中的服务时,Istio 可以生成每个请求的完整记录,包括源和目标的元数据。此信息使运维人员能够将服务行为的审查控制到单个工作负载实例的级别。
参考
https://istio.io/latest/zh/docs/concepts/traffic-management/ https://istio.io/latest/zh/docs/concepts/security/