Istio 基础
Istio是什么
-
Istio是Envoy Data Plane的控制平面实现之一
-
Istio是一个开源的独立服务网格,可为用户成功运行分布式微服务架构提供所需的基础设施
为什么要使用Istio
- Istio可以轻松创建带有负载均衡、service-to-service的身份认证、细粒度的可观测性等功能的服务网格,而应用程序代码却无须或很少为些而作出改变;
- 通过在整个服务环境中为每一个应用部署一个特殊的Sidecar形式的Proxy拦截各服务之间的所有网络通信,并由控制平面Istio进行配置和管理,进而为服务无侵入式添加如下功能
-
HTTP、gRPC、WebSocket和TCP通信的自动负载均衡;
-
通过丰富的路由规则、重试、故障转移和故障注入对流量进行细粒度控制;
-
支持访问控制、速率限制和配额的可插拔的策略层及配置API;
-
集群内所有流量的自动度量、记录日志和分布式跟踪跟踪,包括集群的入口和出口;
-
强大身份验证和授权,以及在群集中进行安全的服务间通信;
-
- 在kubernetes环境中,服务网格就像一个仪表板,用于解决问题、执行流量策略、分配限制和测试代码,它允许一个中央节点来监视、跟踪和控制所有服务之间的交互
Istio系统架构
Istio系统架构介绍
-
从完整意义上讲,Istio 服务网格逻辑上分为数据平面和控制平面
-
Istio:控制平面,由多个组件组合完成控制机制;
-
Istio的控制面板在底层集群管理平台(如Kubernetes,Mesos等)上提供了一个抽象层
-
-
Envoy:数据平面,以Sidecar的形式与服务进程运行在一起的智能代理Envoy
-
-
迄今,Istio架构经历了三次重要变革
-
2018年7月,Istio v1.0
-
生产可用
-
-
2019年3月,Istio v1.1
-
完全分布式
-
-
2020年3月,Istio v1.5
-
回归单体
-
-
Istio v1.0 Architecture
-
控制平面主要有三个组件
-
Pilot:控制平台核心组件
- 管理和配置部署在Istio服务网格中的所有Envoy代理实例
- 为Envoy Sidecar 提供服务发现、智能路由的流量管理功能(例如,A/B 测试、金丝雀推出等)和弹性(超时、重试、断路器等)
- Citadel:身份和凭据管理等安全相关的功能,实现强大的服务到服务和最终用户身份验证
-
Mixer:遥测和策略
-
通过内部插件接口扩展支持第三方组件
-
插件的修改或更新,需要重新部署Mixer
-
-
-
数据平面Envoy
- 基于sidecar模式同网格中的每个服务实例一同部署
- 拦截服务流量,强制执行控制平面中定义的策略,并收集遥测数据
Istio v1.0 系统组件的工作逻辑
- Sidecar模式运行的Envoy根据控制平面组件Pilot定义配置略来决定如何路由流量
-
遥测功能都由Mixer来完成
-
响应来自数据平面的查询,包括授权、访问控制和配额等
-
收集流量指标、日志和追踪数据等
-
根据启用的适配器,将收集的数据存储至相应适配器的后端
-
-
Citadel
-
帮助用户基于服务身份(而非网络控制机制)构建零信任的安全网络环境
- 密钥管理
-
Istio v1.1 Architecture
- Mixer
-
将插件模型替换为使用进程外的Adapter进行扩展
- 性能表现更差
- 完成了Mixer与扩展间的解耦
-
-
Galley
-
Pilot中适配底层平台的功能独立成的组件
-
是Istio的配置验证、摄取、处理和分发组件
-
负责将其余的 Istio 组件与从底层平台(例如kubernetes)获取用户配置的细节隔离开来,从而将ilot与底层平台进行解耦
-
Istio v1.5 Architecture
-
回归单体
-
抛弃影响性的Mixer,遥测功能交Envoy完成
-
将Pilot、Citadel、Galley和Sidecar Injection整合为一个单体应用istiod
-
-
Istiod
- Istiod充当控制平面,将配置分发到所有Sidecar代理和网关
- 它能够为支持网格的应用实现智能化的负载均衡机制,且相关流量绕过了kube
Pilot功能简介
- Pilot管理和配置部署在Istio服务网格中的所有Envoy代理实例,是Istio控制平面的核心组件
- 它主要由Platform Adapter、Abstract Model、Envoy API (xDS)和Rules API四个组件构成;
- 平台适配器:负责适配底层平台,并完成从平台特有的服务模型到Istio服务模型的转换;
- 抽象聚合层:聚合底层不同平台的服务和配置规则并对上提供统一的接口,从而解耦Envoy API和底层平台;
- Envoy API:Pilot通过xDS服务器提供服务发现接口xDS API,而xDS服务器接收并维护Envoy代理的连接,并基于Envoy订阅的资源名称进行配置分发;
- Rules API:高级流量管理规则的API接口,用户通过该API配置流量管理规则并由其转换为低级配置,而后通过discovery API分发到Envoy实例;
- 它主要由Platform Adapter、Abstract Model、Envoy API (xDS)和Rules API四个组件构成;
- Pilot功能
- 服务发现
- 配置sidecar
- 流量治理
- A/B testing
- Failover
- Fault Injection
- Canary rollout
- Circuit breaker
- Retries
- Timeouts
Citadel功能简介
- Citadel是Istio控制平面的核心安全组件,负责服务的私钥和数字证书管理,用于提供自动生成、分发、轮换及撤销私钥和数据证书的功能;
-
Kubernetes平台上,Citadel的传统工作方式是基于Secret资源将证书及私钥注入到Sidecar容器中;
- 非容器环境中,首先通过系统上运行的Node Agent生成CSR,而后向Citadel发起证书签署请求,并将接收到的证书和私钥存储于本地文件系统提供给Envoy使用;
-
Istio 1.1版本起支持基于SDS API动态配置Secret给Envoy;
-
-
另外,除了Istio的Citadel之外,还有Vault等其它证书和私钥管理系统可用
-
Istio的安全模型需要多个组件协同工作
-
Citadel管理私钥和数字证书
-
Sidecar和perimeter proxies执行服务间的安全通信
-
Pilot向代理分发认证策略和名称信息
-
Galley功能简介
- Galley负责向Istio控制平面的其它组件提供支撑功能,它核验进入网格的配置信息的格式和内容的正确性,并将这些配置信息提供给Pilot和Mixer;
-
Galley从底层平台接收配置信息并完成分发,从而将其它组件同底层平台解耦
-
MCP(Mesh Configuration Protocol)是Istio网格中用于分发配置的传输协议
-
基于gRPC
-
与xDS协议类似,一次完整的MCP请求/响应流程包括请求、响应和ACK/NACK;
-
MeshConfigRequest
-
MeshConfigResponse
-
以MeshConfigRequest形式发送的ACK或NACK
-
-
目前尚不支持增量配置分发机制;
-
-
- 从实现上来说,Galley通过Kubernetes的动态Admission Controller(Admission Hook)完成组件配置的校验;
-
在Mutation阶段,实现对请求内容的修改,利用为服务注入Sidecar;
-
在Validation阶段实现对请求内容进行校验,Galley对配置的校验即发生在此阶段;
-
-
程序文件istio-galley
Istio Gateway
-
Istio Gateway用于将Istio功能(例如,监控和路由规则)应用于进入服务网格的流量
-
通过将Envoy代理部署在服务之前,运维人员可以针对面向用户的服务进行A/B测试、金丝雀部署等
-
Istio Gateway不同于Kubernetes Ingress
- 类似地,有必要时,也可以部署专用的Egress Gateway,运维人员可以为这些服务添加超时控制、重试、断路器等功能,同时还能从服务连接中获取各种细节指标
-
-
程序文件istio-ingressgateway和istio-egressgateway
Istio Sidecar Injector
- Istio服务网格中的每个Pod都必须伴随一个Istio兼容的Sidecar一同运行,常用的将Sidecar注入Pod中的方法有两种
-
手工注入:使用istioctl客户端工具进行注入
-
自动注入:使用Istio sidecar injector自动完成注入过程
-
利用Kubernets webhook实现sidecar的自动注入
- 创建Pod时自动注入过程发生在Admission Controller的Mutation阶段,根据自动注入配置,kube-apiserver拦截到Pod创建请求时调用自动注入服务istio-sidecar-injector生成Sidecar容器的描述并将其插入到Pod的配置清单中
-
-
Istio可视化组件Kiali
-
Kiali基于go语言开发,由两个组件构成
-
Kiali front-end:Web UI,查询后端并展示给用户
- Kiali back-end:后端应用,负责与Istio组件通信,检索和处理数据并公开给前端组件
-
- Kiali依赖于Kubernetes和Istio提供的外部服务和组件
- prometheus:查询Prometheus中的指标数据来生成网格拓扑、显示指标、生成健康状况以及可能存在的问题等
-
Cluster API:获取和解析服务网格的配置
- Jaeger:查询和展示追踪数据,前提是Istio需要开启追踪功能
-
Grafana:调用Grafana展示指标数据
-
Kiali 提供的功能
-
服务拓扑图
-
分布式跟踪
-
指标度量收集和图标
-
配置校验
-
健康检查和显示
-
基于Kubernetes CRD描述规则
- Istio的所有路由规则和控制策略都基于Kubernetes CRD实现,于是,其各种配置策略的定义也都保存于kube-apiserver后端的存储etcd中;
-
这意味着kube-apiserver也就是Istio的APIServer
-
Galley负责从kube-apiserver加载配置并进行分发
-
-
Istio提供了许多的CRD,它们大体可分为如下几类
- Network相关:实现流量治理,例如VirtualService、DestinationRule、Gateway、ServiceEntry、Sidecar和EnvoyFilter等,它们都由Pilot使用;
-
Security:
-
认证策略:Policy;
-
授权策略:Rule;
-
Istio 1.15.1 性能总结
Istio 负载测试网格包含了 1000 个服务和 2000 个 sidecar,全网格范围内,QPS 为 70,000。 在使用 Istio 1.15.1 运行测试后,我们得到了如下结果:
- 通过代理的 QPS 有 1000 时,Envoy 使用了 0.5 vCPU 和 50 MB 内存。
- 网格总的 QPS 为 1000 时,
istio-telemetry
服务使用了 0.6 vCPU。 - Pilot 使用了 1 vCPU 和 1.5 GB 内存。
- 90% 的情况 Envoy 代理只增加了 6.3 ms 的延迟。
Istio的功能及其相关实现组件
-
Istio提供了如下开箱即用(Out Of The Box)的功能
-
Service Discovery / Load Balancing → ServicEntry + DestinationRule
-
Secure service-to-service communication (mTLS) → DestinationRule
-
Traffic control / shaping / shifting → VirtualService
-
Policy / Intention based access control → AuthorizationPolicy
-
Traffic metric collection → (built in)
-
-
以下功能不能做到OOTB,在一定程度上,依赖用户自行定义
-
Cross-cluster Networking → EnvoyFilter + ServiceEntry + Gateway
-
External Auth / Rate Limiting → EnvoyFilter
-
Traffic Failover → EnvoyFilter
-
WASM Filters → EnvoyFilter
-
Access Logging / many unexposed Envoy features → EnvoyFilter + ?
-
参考文档
https://istio.io/latest/docs/
https://github.com/Istio
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)