K8S如何基于Istio实现全链路HTTPS
- Istio 简介
- Istio 是什么?
- 为什么选择 Istio?
- Istio 的核心概念
- Service Mesh(服务网格)
- Data Plane(数据平面)
- Sidecar Mode(边车模式)
- Ambient Mode(环境模式)
- Control Plane(控制平面)
- Istio 的架构与组件
- Envoy Proxy
- Istiod
- 其他组件
- Istio 的流量管理
- 核心流量管理功能
- 流量路由
- 负载均衡
- 网关控制
- 重试和熔断
- Istio 资源对象
- Istio 的安全性
- 身份与证书管理
- 认证
- 授权
- 实践:K8s 中开启全链路 HTTPS
- 步骤一:环境准备
- 步骤二:创建 TLS 证书和密钥
- 步骤三:配置 Istio Gateway
- 步骤四:配置 VirtualService
- 步骤五:启用服务间的mTLS
- 步骤六:测试 HTTPS 通信
- 总结与 Q&A
- 参考链接
Istio 简介
Istio 是什么?
- 定义
Istio是一个开源服务网格,可以透明地分层部署在现有的分布式应用程序上。Istio强大的功能提供了一种统一且更高效的方式来保护、连接和监控服务。Istio 是实现负载均衡、服务到服务身份验证和监控的途径——只需更改很少或不需要更改服务代码。
- 功能
简化服务间通信、增强系统的可观察性和安全性。
-
在集群中通过双向 TLS 加密、基于身份的强身份验证和授权实现安全的服务到服务通信;
-
HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡;
-
通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行精细控制;
-
支持访问控制、速率限制和配额的可插拔策略层和配置 API;
-
集群内所有流量的自动指标、日志和跟踪,包括集群入口和出口。
为什么选择 Istio?
- 简单而强大
Kubernetes 具有数百种功能和数十个 API,但您只需一个命令即可开始使用它。我们以相同的方式构建了 Istio。渐进式披露意味着您可以使用一小部分 API,并且仅在需要时转动更强大的旋钮。
而其他"simple service meshes"花了数年时间赶上 Istio 第一天就拥有的功能集。
- Envoy 代理
Istio 继承了 Envoy 的所有功能和灵活性(流量管理与控制、监控跟踪、安全性和扩展等),包括使用 Istio 团队在 Envoy 中开发的 WebAssembly 的世界级可扩展性。
- 其他
社区强大、定期发布安全补丁等。
Istio 的核心概念
Service Mesh(服务网格)
管理微服务之间的复杂通信。
Data Plane(数据平面)
数据平面是一组代理,用于调解和控制微服务之间的所有网络通信。它们还收集和报告所有网状流量的遥测数据。
Sidecar Mode(边车模式)
将 Sidecar Proxy(如:Envoy 代理) 与在集群中启动的每个 Pod 一起部署,或者与虚拟机上运行的服务一起运行。以捕获流量并提供可观察性和控制能力。
Ambient Mode(环境模式)
使用每个节点的第 4 层代理,以及可选的每个命名空间的 Envoy 代理来实现第 7 层功能。
Ztunnel(Zero Trust Tunnel):负责所有 L4 层的网络流量,将服务之间的流量进行加密和认证。它是一种“零信任”的隧道,确保服务间流量安全。所有 Pod 会自动将流量导向 Ztunnel。
Waypoint Proxy:可选的 L7 层代理,负责服务的 HTTP 路由、负载均衡、鉴权等操作。它的使用是可选的,只有在需要 L7 功能时才会启用。
Control Plane(控制平面)
控制平面管理和配置数据平面中的代理,如 Istiod。
Istio 的架构与组件
- 架构
Istio 会拦截所有的网络流量,并且会在每个 pod 上以 sidecar 的形式注入一个智能代理,从而能够应用一组特定的规则。让所有特性生效的代理是由**数据平面(Data Plane)组成的,而数据平面是由控制平面(Control Plane)**动态配置的。
Envoy Proxy
执行数据平面功能,为每个微服务分发的代理。Envoy 代理是唯一与数据平面流量交互的 Istio 组件。
流程说明:
- 服务 A 发送请求给服务 B 的第一个实例,不过调用失败了;
- Envoy Sidecar 会进行重试;(1)
- 失败的请求返回发起调用的代理;
- 开启断路器并在随后的请求中调用下一个服务。(2)
Istiod
控制平面的核心组件,Istiod 提供服务发现、配置和证书管理。负责配置和管理数据平面的 Envoy。
- Pilot
负责 Istio 数据平面的 xDS 配置管理,具体包括:
服务、配置规则发现
为 Sidecar 提供服务发现、用于智能路由的流量管理功能(例如,A/B 测试、金丝雀发布等)以及弹性功能(超时、重试、熔断器等)。通过提供通用的流量管理模型和服务发现适配器(Service Discovery Adapter),来对接不同平台的适配层。
xDS 配置下发
提供统一的 xDS API,供 Sidecar 调用。将路由规则等配置信息转换为 Sidecar 可以识别的信息,并下发给数据平面。
- Citadel
负责安全证书的管理和发放,可以实现授权和认证等操作。
Citadel 并不是唯一的证书管理方式,Istio 当前支持 Citadel、Vault 和 Google 等多种证书管理方式,Citadel 是当前默认的证书管理方式。
- Galley
Galley 是 Istio 1.1 版本中新引入的配置管理组件,主要负责配置的验证、提取和处理等功能。其目的是将 Istio 和底层平台(如 Kubernetes)进行解耦。
在引入 Galley 之前,Istio 控制平面的各个组件需要分别对 Kubernetes 资源进行管理,包括资源的配置验证,监控资源配置变化,并针对配置变更采取相应的处理等。
其他组件
Gateway、VirtualService、DestinationRule 等。
Gateway:控制外部流量进入服务网格的入口点,并负责协议、端口及 TLS 等基本设置。
VirtualService:定义流量的路由规则,控制流量如何从 Gateway 或服务之间路由到特定的服务和服务版本。
DestinationRule:定义路由目标的策略和配置,例如负载均衡、连接池、断路器及 mTLS 等,用于流量到达目标服务后进行更细粒度的控制。
Istio 的流量管理
核心流量管理功能
- 概述
Istio 的流量管理模型源于和服务一起部署的 Envoy 代理。 网格内服务发送和接收的所有 data plane 流量都经由 Envoy 代理, 这让控制网格内的流量变得异常简单,而且不需要对服务做任何的更改。
流量路由
- 概述
流量路由功能允许 Istio 根据流量属性(如请求路径、HTTP 头、Cookie 等)将流量引导至特定的服务版本。主要功能包括:
条件路由:可以基于请求内容(如路径、头信息、Cookie)或用户属性,将流量引导到不同的服务版本,实现路径分离和定制化服务体验。
权重路由:可以按比例将流量分配到多个服务版本,支持金丝雀发布、蓝绿部署等场景。
流量镜像:将一部分流量克隆到新的服务版本上,用于测试和监控,但不影响实际用户。
- 示例
通过 VirtualService 配置 80% 的流量到 v1,20% 到 v2 版本
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: weighted-routing
spec:hosts:- my-servicehttp:- route:- destination:host: my-servicesubset: v1weight: 80- destination:host: my-servicesubset: v2weight: 20
负载均衡
- 概述
Istio 支持如下的负载均衡模型, 可以在 DestinationRule 中为流向某个特定服务或服务子集的流量指定这些模型:
轮询 (Round Robin):将流量按顺序轮流分配给不同实例,简单高效(默认)。
最小连接数 (Least Connection):优先选择连接数最少的实例,适用于高并发环境。
随机选择 (Random):随机选择实例,避免热点服务。
权重(Weight):请求根据指定的百分比转发到池中的实例。<