
Istio作为服务网格技术最具代表性的产品,历经多年发展已日渐成熟,并受到越来越多开发者的青睐。本书以 Istio 服务网格为核心,内容包括基本概念、核心功能、运维、企业级落地四大部分,从基本的安装部署到功能实践,从底层原理分析到故障排查,从进阶操作到企业级实战,由浅入深地介绍了 Istio 服务网格的各个方面。本书适合正在使用或关注 Istio 的开发工程师、运维工程师、架构师等云原生领域从业者阅读。无论你是服务网格技术的初学者,还是该领域的专家,都能从本书中寻找到有借鉴意义的理论及实践指导。
前 言 构建软件是困难的,通过网络连接不同的服务更困难。任何时候,通过网络发送数据包、消息或请求都不能保证其结果。这个请求会发送成功吗?它需要多长时间?如果请求失败,会有人知道吗? Docker 和 Kubernetes 已经内置了很多功能来支持像微服务这样的分布式服务架构,但是它们加剧了现有的通信问题。一个运行异常的服务可能会毁掉一切。 在与全球各地的采用微服务的组织合作时,我发现让团队持续思考和解决沟通问题是非常困难的,其中涉及许多问题 :他们将如何落实服务发现?是采用超时、重试、熔断,还是链路追踪、身份验证这样的方式?像 Netflix、Twitter 和 Google这样的大型云计算公司开创了一些早期成功的微服务架构。这些公司必须建立许多他们自己的开发者工具和基础设施来解决上述问题,幸运的是,他们开源了其中的大部分功能。那么,其他组织可以使用 NetflixOSS 全家桶或 Twitter Finagle 吗?可以,而且有些组织确实这么做了,但这样做会带来一个新的运作上的问题。 例如,NetflixOSS 全家桶主要是为 Java 开发人员编写的。那么 Node.js、Golang和 Python 团队怎么办呢?这些团队要么自己构建库,要么将其在互联网上找到的各种各样的功能组合在一起,而且还必须将这些与“网络通信”相关的代码混合到业务逻辑中。这增加了传递依赖性,使代码变得混乱,并且使修订变得更加困难。使用这些应用程序网络库来构建服务架构、升级、打补丁,以及跨不同语言来进行这些操作,是非常复杂且容易出错的。 服务网格是解决此应用程序网络问题的更简洁的解决方案。通过服务网格,我们将应用程序网络逻辑抽象成一个专用的基础设施,并将其应用到所有的服务中,而不管这些服务是用什么语言编写的。 Istio 是一个可扩展的、成熟的、功能强大的服务网格实现方案,它最初来自IBM 和 Google 的一个项目。我于 2017 年 1 月来到 Istio 团队,并且很早就开始承担这个项目的相关工作。2018 年年底,我在初创公司 Solo.io 担任全球领域首席技术官,专注于服务网格技术的研发和服务网格落地的推进。 从头开始创建一家公司,推动这项技术的发展,并就这个话题写一本深入的书,不是一件容易的事情。我需要一个有奉献精神和有激情的人来帮助完成 ;所以,当我做到一半的时候,Manning 团队和我邀请了 Rinor Maloku 加入进来。感谢我们二人在 Solo.io 工作期间为社区和客户共同努力而度过的时光。其中一些客户负责世界上最大的 Istio 部署项目,Rinor 和我已经能够根据实际经验为 Istio 编写一本优秀的书。我们希望这本书能向你展示 Istio 的价值和力量,并让你像其他许多人一样,轻松地将这项技术应用到生产环境中。
第 1 部分 理解 Istio 1 Istio 服务网格......................................................................... 2 1.1 快速迭代带来的挑战 ...................................................................................... 3 1.1.1 不可靠的云基础设施 .......................................................................... 5 1.1.2 服务通信需要弹性 .............................................................................. 6 1.1.3 实时可观测性 ...................................................................................... 6 1.2 使用应用程序库解决问题 .............................................................................. 7 1.3 基础设施的解决思路 ...................................................................................... 9 1.3.1 应用程序感知服务代理 ...................................................................... 9 1.3.2 认识 Envoy 代理 ................................................................................ 10 1.4 什么是服务网格 ............................................................................................ 11 1.5 Istio 服务网格简介 ........................................................................................ 13 1.5.1 服务网格与企业服务总线的关系 .................................................... 14 1.5.2 服务网格与 API 网关的关系 ............................................................ 16 1.5.3 在非微服务架构中使用 Istio ............................................................ 17 1.5.4 在分布式架构中使用 Istio ................................................................ 18 1.5.5 使用服务网格的缺点 ........................................................................ 19 本章小结 ................................................................................................................. 19 2 Istio 的第一步.......................................................................21 2.1 在 Kubernetes 上部署 Istio ............................................................................ 21 2.1.1 使用 Docker Desktop 来演示样例 .................................................... 22 2.1.2 获取 Istio 发行版 ............................................................................... 22 2.1.3 将 Istio 组件安装到 Kubernetes 中 ................................................... 24 2.2 了解 Istio 控制平面 ....................................................................................... 25 2.2.1 istiod 简介 .......................................................................................... 26 2.2.2 入口网关和出口网关 ........................................................................ 30 2.3 在服务网格中部署你的第一个应用程序 .................................................... 31 2.4 Istio 的可观测性、弹性和流量路由 ............................................................ 36 2.4.1 Istio 与可观测性 ................................................................................ 37 2.4.2 Istio 与弹性 ........................................................................................ 44 2.4.3 Istio 与流量路由 ................................................................................ 46 本章小结 ................................................................................................................. 50 3 Istio 的数据平面 :Envoy .......................................................51 3.1 什么是 Envoy 代理 ........................................................................................ 51 3.1.1 Envoy 的核心功能 ............................................................................. 53 3.1.2 Envoy 与其他代理的比较 ................................................................. 58 3.2 配置 Envoy ..................................................................................................... 58 3.2.1 静态配置 ............................................................................................ 58 3.2.2 动态配置 ............................................................................................ 60 3.3 Envoy 实战 ..................................................................................................... 61 3.3.1 Envoy 的 Admin API ......................................................................... 65 3.3.2 Envoy 的请求重试 ............................................................................. 66 3.4 Envoy 与 Istio 的融合 .................................................................................... 67 本章小结 ................................................................................................................. 69 第 2 部分 保护、观察和控制服务网格中的流量 4 Istio 网关 :将流量导入集群....................................................72 4.1 流量入口概念 ................................................................................................ 73 4.1.1 虚拟 IP 地址 :简化服务访问 ........................................................... 73 4.1.2 虚拟主机 :来自单个接入点的多个服务 ........................................ 75 4.2 Istio 入口网关 ................................................................................................ 75 4.2.1 声明 Gateway 资源 ............................................................................ 77 4.2.2 虚拟服务的网关路由 ........................................................................ 79 4.2.3 流量整体视图 .................................................................................... 82 4.2.4 对比 Istio 入口网关与 Kubernetes Ingress ....................................... 82 4.2.5 对比 Istio 入口网关与 API 网关 ....................................................... 83 4.3 保护网关流量 ................................................................................................ 83 4.3.1 使用 TLS 的 HTTP 流量 ................................................................... 84 4.3.2 将 HTTP 重定向到 HTTPS ............................................................... 88 4.3.3 使用 mTLS 的 HTTP 通信 ................................................................ 89 4.3.4 为多个虚拟主机提供 TLS 服务 ....................................................... 92 4.4 TCP 流量 ........................................................................................................ 93 4.4.1 在 Istio 网关上暴露 TCP 端口 .......................................................... 94 4.4.2 使用 SNI 直通的流量路由 ................................................................ 96 4.5 网关使用建议 ................................................................................................ 99 4.5.1 拆分网关的职能 ................................................................................ 99 4.5.2 网关注入 .......................................................................................... 101 4.5.3 入口网关访问日志 .......................................................................... 102 4.5.4 减少网关配置 .................................................................................. 103 本章小结 ............................................................................................................... 104 5 流量控制 :细粒度流量路由 .................................................. 105 5.1 减少部署新代码带来的风险 ...................................................................... 105 5.2 Istio 的请求路由 .......................................................................................... 109 5.2.1 清理工作空间 .................................................................................. 109 5.2.2 部署 catalog 服务的 v1 版本 ........................................................... 110 5.2.3 部署 catalog 服务的 v2 版本 ............................................................111 5.2.4 将所有流量路由到 catalog 服务的 v1 版本 ................................... 112 5.2.5 将特定请求路由到 v2 版本 ............................................................ 114 5.2.6 在调用链路内部进行路由 .............................................................. 115 5.3 流量迁移 ...................................................................................................... 117 5.4 进一步降低风险 :流量镜像 ...................................................................... 125 5.5 使用 Istio 的服务发现路由到集群外部的服务 ......................................... 127 本章小结 ............................................................................................................... 131 6 弹性 :应对应用程序的网络挑战............................................ 132 6.1 实现应用程序的弹性 .................................................................................. 132 6.1.1 为应用程序库构建弹性能力 .......................................................... 133 6.1.2 使用 Istio 解决弹性问题 ................................................................. 134 6.1.3 实现去中心化的弹性能力 .............................................................. 134 6.2 客户端负载均衡 .......................................................................................... 135 6.2.1 开始使用客户端负载均衡 .............................................................. 136 6.2.2 构建应用场景 .................................................................................. 138 6.2.3 测试不同的客户端负载均衡策略 .................................................. 139 6.2.4 理解负载均衡算法的差异 .............................................................. 144 6.3 位置感知负载均衡 ...................................................................................... 144 6.3.1 位置感知负载均衡实验 .................................................................. 145 6.3.2 利用加权分布对位置感知负载均衡进行更多的控制 .................. 149 6.4 透明的超时和重试 ...................................................................................... 152 6.4.1 超时 .................................................................................................. 152 6.4.2 重试 .................................................................................................. 154 6.4.3 高级重试 .......................................................................................... 160 6.5 Istio 中的熔断 .............................................................................................. 162 6.5.1 利用连接池设置防止服务过慢 ...................................................... 163 6.5.2 利用异常点检测剔除不健康的服务 .............................................. 169 本章小结 ............................................................................................................... 172 7 可观测性 :理解服务的行为 .................................................. 174 7.1 什么是可观测性 .......................................................................................... 175 7.1.1 可观测性与监控 .............................................................................. 175 7.1.2 Istio 如何帮助实现可观测性 .......................................................... 176 7.2 探索 Istio 的指标 ......................................................................................... 176 7.2.1 数据平面指标 .................................................................................. 177 7.2.2 控制平面指标 .................................................................................. 182 7.3 使用 Prometheus 抓取 Istio 指标 ................................................................ 184 7.3.1 安装 Prometheus 和 Grafana ........................................................... 186 7.3.2 配置 Prometheus Operator 抓取 Istio 控制平面和工作负载的指标 ... 187 7.4 自定义 Istio 标准指标 ................................................................................. 190 7.4.1 配置现有的指标 .............................................................................. 193 7.4.2 创建新指标 ...................................................................................... 197 7.4.3 使用新属性分组调用 ...................................................................... 199 本章小结 ............................................................................................................... 201 8 可观测性 :使用 Grafana、Jaeger 和 Kiali 观察网络行为........... 202 8.1 使用 Grafana 观察 Istio 服务和控制平面指标 .......................................... 202 8.1.1 安装 Istio 的 Grafana 仪表板 .......................................................... 203 8.1.2 查看控制平面指标 .......................................................................... 205 8.1.3 查看数据平面指标 .......................................................................... 206 8.2 分布式追踪 .................................................................................................. 206 8.2.1 分布式追踪是怎么工作的 .............................................................. 207 8.2.2 安装分布式追踪系统 ...................................................................... 209 8.2.3 配置 Istio 实现分布式追踪 ............................................................. 210 8.2.4 查看分布式追踪数据 ...................................................................... 213 8.2.5 追踪采样、强制追踪和自定义标签 .............................................. 214 8.3 使用 Kiali 观察服务网格 ............................................................................ 220 8.3.1 安装 Kiali ......................................................................................... 220 8.3.2 结论 .................................................................................................. 225 本章小结 ............................................................................................................... 225 9 确保微服务通信安全............................................................227 9.1 应用程序网络安全需求 .............................................................................. 227 9.1.1 服务间认证 ...................................................................................... 228 9.1.2 终端用户认证 .................................................................................. 228 9.1.3 授权 .................................................................................................. 228 9.1.4 单体和微服务应用的安全比较 ...................................................... 228 9.1.5 Istio 如何实现 SPIFFE .................................................................... 230 9.1.6 Istio 安全简述 .................................................................................. 230 9.2 自动 mTLS ................................................................................................... 231 9.2.1 安装环境 .......................................................................................... 232 9.2.2 理解 Istio 的对等认证 ..................................................................... 233 9.3 授权服务间流量 .......................................................................................... 238 9.3.1 了解 Istio 中的授权 ......................................................................... 239 9.3.2 设置工作区 ...................................................................................... 240 9.3.3 当策略被应用于工作负载时行为的变化 ...................................... 241 9.3.4 默认使用一个全局策略拒绝所有请求 .......................................... 242 9.3.5 允许来自单一命名空间的请求 ...................................................... 243 9.3.6 允许来自非认证的工作负载的请求 .............................................. 244 9.3.7 允许来自单一服务账户的请求 ...................................................... 245 9.3.8 策略的条件匹配 .............................................................................. 246 9.3.9 了解值匹配表达式 .......................................................................... 246 9.3.10 了解评估授权策略的顺序 ............................................................ 248 9.4 终端用户的认证和授权 .............................................................................. 249 9.4.1 什么是 JWT ..................................................................................... 249 9.4.2 入口网关的终端用户认证和授权 .................................................. 251 9.4.3 使用 RequestAuthentication 验证 JWT ........................................... 252 9.5 与自定义的外部授权服务集成 .................................................................. 256 9.5.1 外部授权实践 .................................................................................. 257 9.5.2 配置 ExtAuthz .................................................................................. 258 9.5.3 使用自定义的 AuthorizationPolicy 资源 ........................................ 259 本章小结 ............................................................................................................... 260 第 3 部分 Istio 运维 10 数据平面的故障排查......................................................... 262 10.1 最常见错误 :数据平面配置错误 ............................................................ 263 10.2 识别数据平面的问题 ................................................................................ 265 10.2.1 如何验证数据平面是最新的 ........................................................ 265 10.2.2 使用 Kiali 发现配置错误 .............................................................. 266 10.2.3 通过 istioctl 发现配置错误 ........................................................... 268 10.3 从 Envoy 配置中发现错误 ........................................................................ 270 10.3.1 Envoy 管理界面 ............................................................................. 270 10.3.2 使用 istioctl 查询代理配置 ........................................................... 270 10.3.3 应用程序的故障排查 .................................................................... 276 10.3.4 使用 ksniff 检查网络流量 ............................................................. 282 10.4 通过 Envoy 的遥测能力了解应用程序 .................................................... 285 10.4.1 在 Grafana 中查看请求失败率 ..................................................... 286 10.4.2 使用 Prometheus 查询受影响的 Pod ............................................ 287 本章小结 ............................................................................................................... 288 11 控制平面性能优化 .............................................................290 11.1 控制平面的主要目标 ................................................................................ 290 11.1.1 了解数据平面同步的步骤 ............................................................ 291 11.1.2 决定性能的因素 ............................................................................ 292 11.2 监控控制平面 ............................................................................................ 293 11.3 性能调整 .................................................................................................... 298 11.3.1 设置工作区 .................................................................................... 299 11.3.2 测量优化前的性能 ........................................................................ 299 11.3.3 忽略事件 :使用发现选择器缩小发现的范围 ............................ 303 11.3.4 事件批处理和推送节流特性 ........................................................ 305 11.4 性能优化准则 ............................................................................................ 308 本章小结 ............................................................................................................... 310 第 4 部分 在组织中落地 Istio 12 在组织中扩展 Istio............................................................312 12.1 多集群服务网格的好处 ............................................................................ 312 12.2 多集群服务网格概述 ................................................................................ 313 12.2.1 Istio 多集群部署模型 .................................................................... 314 12.2.2 在多集群部署中如何发现工作负载 ............................................ 316 12.2.3 跨集群的工作负载连接 ................................................................ 317 12.2.4 集群间互信 .................................................................................... 318 12.3 多集群、多网络、多控制平面的服务网格 ............................................ 319 12.3.1 选择多集群部署模型 .................................................................... 320 12.3.2 建立云基础设施 ............................................................................ 320 12.3.3 配置插件式 CA 证书 ..................................................................... 321 12.3.4 在每个集群中安装控制平面 ........................................................ 322 12.3.5 启用跨集群的工作负载发现 ........................................................ 325 12.3.6 设置跨集群连接 ............................................................................ 327 12.3.7 跨集群的负载均衡 ........................................................................ 334 本章小结 ............................................................................................................... 339 13 将虚拟机工作负载纳入网格................................................ 340 13.1 Istio 的虚拟机支持 .................................................................................... 341 13.1.1 简化虚拟机中 sidecar 代理的安装与配置 ................................... 341 13.1.2 虚拟机的高可用性 ........................................................................ 343 13.1.3 网格内服务的 DNS 解析 .............................................................. 346 13.2 设置基础设施 ............................................................................................ 348 13.2.1 设置服务网格 ................................................................................ 349 13.2.2 配置虚拟机 .................................................................................... 350 13.3 将网格扩展到虚拟机 ................................................................................ 352 13.3.1 向虚拟机暴露 istiod 和集群服务 ................................................. 352 13.3.2 使用 WorkloadGroup 表示一个工作负载组 ................................ 353 13.3.3 在虚拟机中安装与配置 istio-agent .............................................. 356 13.3.4 将流量路由到集群服务 ................................................................ 359 13.3.5 将流量路由到 WorkloadEntry ....................................................... 360 13.3.6 虚拟机是由控制平面配置的 :强制执行双向认证 .................... 363 13.4 揭开 DNS 代理的神秘面纱 ...................................................................... 364 13.4.1 DNS 代理如何解析集群内主机名 ............................................... 364 13.4.2 DNS 代理知道哪些主机名 ........................................................... 366 13.5 自定义代理的行为 .................................................................................... 367 13.6 将 WorkloadEntry 从网格中删除 .............................................................. 368 本章小结 ............................................................................................................... 369 14 在请求路径上扩展 Istio ..................................................... 370 14.1 Envoy 的扩展能力 ..................................................................................... 371 14.1.1 了解 Envoy 的过滤器链 ................................................................ 371 14.1.2 用于扩展的过滤器 ........................................................................ 374 14.1.3 定制 Istio 的数据平面 ................................................................... 374 14.2 使用 EnvoyFilter 资源配置 Envoy 过滤器 ............................................... 374 14.3 调用外部的限流请求 ................................................................................ 379 14.4 使用 Lua 扩展 Istio 的数据平面 ............................................................... 384 14.5 使用 WebAssembly 扩展 Istio 的数据平面 .............................................. 387 14.5.1 WebAssembly 简介 ........................................................................ 387 14.5.2 为什么使用 WebAssembly ............................................................ 388 14.5.3 使用 WebAssembly 构建新的 Envoy 过滤器 .............................. 389 14.5.4 使用 meshctl 工具构建新的 Envoy 过滤器 ................................. 389 14.5.5 部署新的 WebAssembly Envoy 过滤器 ....................................... 391 本章小结 ............................................................................................................... 393 A 自定义 Istio 安装................................................................394 B Istio 的 sidecar 及其注入选项 ............................................... 401 C Istio 安全——SPIFFE ......................................................... 407 D Istio 故障排查 ....................................................................417 E 如何配置虚拟机接入网格 ..................................................... 425