#istio #mesh # Traffic Management ^ebc917 - https://istio.io/latest/docs/concepts/traffic-management/ - traffic routing rules:轻松控制服务间 traffic 和 API calls 的流向。 - 简化了 service-level 的属性配置,如 - 熔断 - 超时 - 重试 可以轻松设置重要任务如 A/B 测试、canary rollouts; 也提供了可靠性功能,对抗服务和网络故障。 - Istio 的流量管理模型依赖 Envoy proxies。Envoy 跟服务一起部署,服务发送和接收的流量都经过 Envoy 代理,不需要改动服务就可以控制流量。 - ![](https://istio.io/latest/docs/ops/deployment/architecture/arch.svg) ## Introducing Istio traffic management - 为了引导流量,Istio 需要知道你所有的 endpoints,以及它们属于哪些 services。因此 Istio 需要链接到一个 **service discovery system** 作为 service registry。 - 例如如果在 k8s 中安装 istio,它会自动检测集群中的 services 和 endpoints. - 使用 service registry,Envoy 可以将流量引导到相关的 services. - Istio 基本的 service discovery 和 负载均衡 可以构建一个 service mesh,但它的功能不仅仅如此,可以有更多细粒度的控制。 - A/B 测试,为某个服务子集定制 LB - 可以通过 Istio 的 traffic management API 添加自己的流量配置。API 使用 k8s **CRDs** 来定义,通过 YAML 文件配置。 - 跟流量管理相关的 resources: - Virtual services - Destination rules - Gateways - Service entries - Sidercars ## Virtual services - virtual services 和 destination rules 是 Istio 流量路由功能的关键模块。 - 一个 virtual service 可以让你配置请求如何路由到服务,每个 virtual service 包含了一组 **routing rules**, 依次估值,请求匹配到规则后转发到相应的目的地。 ### Why use - 基于 virtual service,你可以使用 routing rules 告诉 Envoy 如何将 virtual service 的流量发送到合适的目的地。路由目的可以是相同服务的不同版本 或者 不同的服务。 - 典型案例:将不同版本的服务定义为一个 subset, 将 20% 的流量转发到新版本。 - virtual service 可以做到: - 通过一个 virtual service 处理多个应用服务。一个 virtual service 映射为多个真正的服务,将一个 monolithic application ==分解==为多个微服务。 - 例如将`monolith.com`的某些 URI 路由到微服务 A,依次类推。 - 跟 gateways 一起配置流量规则,控制出入流量(ingress and egress traffic)。 ### Example ```yaml 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 ``` - **hosts**:用户发送请求时的地址,可以是 IP 地址、DNS name、k8s service short name 等。 - **http**:http section 包含了 routing rules,描述了匹配条件和动作,适用于 HTTP/1.1,HTTP2 和 gRPC。(TCP 和 TLS 使用 tcp 和 tls slections)。 - **destination** 必须是**真实**的目的,存在于 Istio 的 service registry,否则 Envoy 无法转发。 - 第二条 route 规则没有 match 条件,表示默认目的地。 ## Destination rules - virtual services 负责管理如何路由流量到一个给定的目的地。 - destination rules 配置针对该目的地的流量发生了什么。 - 特别地,可以destination rules 来定义 service subsets,比如按版本划分。 - destination rules 也可以允许你定义 Envoy 的流量策略,当转发到整个 destination service 或者 subset 时。这些策略包含负载均衡模型、TLS 安全模式、熔断设置等。 ### Example ```yaml apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: my-destination-rule spec: host: my-svc trafficPolicy: loadBalancer: simple: RANDOM subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 trafficPolicy: loadBalancer: simple: ROUND_ROBIN - name: v3 labels: version: v3 ``` - 定义了不同服务子集 v1,v2, v3 的策略。基于 k8s labels 来划分子集。 ## Gateways - 可以使用 gateway 来管理到 mesh 的 inbound 和 outbound 流量,运行你指定进入和离开 mesh 的流量。 - gateway 配置只适用于运行在 mesh edge 的 Envoy proxies,而非 sidercar proxies。 - Istio 的 gateway resources 只允许配置 L4-6 的负载均衡属性(例如端口暴露、TLS设置等),然后给 gateway 绑定一个常规的 virtual service. - gateway 主要用于管理入流量,但也可以配置 **egress** gateways。例如你可以配置一个专门的节点用于出流量,可以管理哪些服务允许访问外部网络。 ## Service entries - 可以使用 service entry 来向 Istio 内部管理的 service registry 添加一个 entry。添加后,Envoy proxy 就可以像这个 service 发送流量,就像你自己 mesh 中的 service 一样。 - 配置 service entries 允许你管理 mesh 之外的流量,包含以下任务: - 重定向和转发到外部目的地(external destinations) 的流量 - 为外部目的地定义重试、超时和错误注入策略 - Run a mesh service in a Virtual Machine (VM) by [adding VMs to your mesh](https://istio.io/latest/docs/examples/virtual-machines/). > [!NOTE] > 默认 Istio 对于未注册的外部 service 流量,Envoy 会 passthrough - 定义外部资源: ```yaml apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: svc-entry spec: hosts: - ext-svc.example.com ports: - number: 443 name: https protocol: HTTPS location: MESH_EXTERNAL resolution: DNS ``` - 使用 hosts 字段指定 external resource. - 为外部资源配置超时 ```yaml apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: ext-res-dr spec: host: ext-svc.example.com trafficPolicy: connectionPool: tcp: connectTimeout: 1s ``` ## Sidecars - 默认情况下,Istio 配置 Envoy 接受它关联 workload 的所有端口上的流量,转发流量时可以 reach 到 mesh 中的每一个 workload。 - 使用 sidecar 配置可以做到: - 细粒度控制 Envoy proxy 可以接受的端口和协议。 - 限制 Envoy proxy 可以 reach 到的 services. - 限制 sidecar reachability 的好处:避免因为内存使用过高而影响 mesh 性能。 - 可以配置 sidecar 只应用于特定 namespace 的所有 workloads 或者某些 workloads(使用 `worloadSelector`)。 ```yaml apiVersion: networking.istio.io/v1alpha3 kind: Sidecar metadata: name: default namespace: bookinfo spec: egress: - hosts: - "./*" - "istio-system/*" ``` - 配置 `bookinfo` namespace 下的所有 services 只能 reach 相同 namespace 的 services 以及 Istio control plane. ## Network resilience and testing - Istio 提供了可选的容错和错误注入特性,可以在运行时动态配置。 - **Timeouts**:配置 Envoy 等待的超时(Istio 默认禁用)。可以通过 virtual services 动态为每个 service 进行配置。 - **Retries**:为请求配置重试策略(次数、每次间隔等)。通过 virtual services 配置。 - **Circuit breakers**: 应用于真实的 mesh 目的地,需要使用 destination rules 配置。达到配置后(并发连接数、失败请求数),停止向其发送新请求。 - **Fault injection**:在应用层注入(而非在网络层)。通过 virtual services 配置。两种类型错误: - Delays:延迟请求 - Aborts:返回 HTTP error codes 或者 TCP 连接错误。 - 虽然 Istio 的故障恢复特性可以提升 mesh 中服务的可达性和可用性。但**仍然**需要应用层处理故障或错误,并采取适当的回退操作。 - 例如,当负载均衡池中的所有实例都失败时,Envoy 返回 HTTP 503 状态码。应用程序必须实现任何所需的回退逻辑来处理 HTTP 503 错误代码。 ## 总结 > [!Summary] Virtual Service > - 称为 virtual 是因为它不是真实的 service ,比如一个 virtual service 可以分解映射多个真实 service。 > - 它可以实现到 services 的路由功能,例如实现 AB测试。 > [!Summary] Destination rules > - 为路由的目的地(services) 划分不同的子集、配置不同的策略(负载均衡等)。 > [!Summary] Service entries > - 为外部资源(mesh 之外的流量)赋能,例如为它们配置超时、重试等。 > [!Summary] Sidercars > - 限制 sidecar 到 services 的可达性。 -------------- # Security - https://istio.io/latest/docs/concepts/security/ - 微服务特有的安全需求: - 为了对抗中间人攻击,需要**流量加密** - 为了提供灵活的服务访问控制,需要**双向 TLS** 和 细粒度的**访问策略** - 为了确定谁在什么时候做了什么事情,需要**审计工具**。 - Istio Security为解决这些问题提供了全面的安全解决方案。 - ![](https://istio.io/latest/docs/concepts/security/overview.svg) -------- # Observabilty - https://istio.io/latest/docs/concepts/observability/ - Istio 为网格内的所有 service 通信生成了详细的 telemetry,提供了服务行为的可观测性。 - 三类 telemetry: - **Metrics**:Istio 根据监控的四个“黄金信号”(延迟、流量、错误和饱和度)生成一组服务指标。也为 mesh control plane 提供了详细的 metrics. - **Distributed Traces**:为每个服务生成 distributed trace spans,展示了 mesh 中的 call flows 和 服务依赖。 - **Access Logs**:为每次请求生成访问记录,包括源和目的地元数据。 ------- # Extensibility - https://istio.io/latest/docs/concepts/wasm/ - WebAssembly 是一个用于扩展 Istio proxy(Envoy) 的沙盒技术。Proxy-Wasm sandbox API取代了 Mixer 作为 Istio 中的主要扩展机制。 - WebAssembly sandbox 的目标: - **Efficiency**:扩展带来的延迟、CPU 和 内存开销要低 - **Function**:An extension can enforce policy, collect telemetry, and perform payload mutations. - **Isolation**:一个插件的程序错误和 crash 不会影响其他插件。 - **Configuration**:使用跟其他 Istio API 一致的 API 来动态配置插件。 - **Operator**:An extension can be canaried and deployed as log-only, fail-open or fail-close. - **Extension developer**:插件可以使用多种编程语言。 ## High-level architecture - Istio 扩展(Proxy-Wasm plugins)有几个组件: - **Filter Service Provider Interface(SPI)**:用于构建 filters 插件 - **Sandbox**:内嵌在 Envoy 中的 V8 Wasm Runtime - **Host APIs**:处理 headers、trailers 和 metadata - **Call out APIs**:用于 gRPC 和 HTTP calls - **Stats 和 Logging APIs**:用于 metrics 和 monitoring - ![](https://istio.io/latest/docs/concepts/wasm/extending.svg) ## Example - C++ Proxy-Wasm filter 插件示例:[Example](https://github.com/istio-ecosystem/wasm-extensions/tree/master/example) - [Guide](https://github.com/istio-ecosystem/wasm-extensions/blob/master/doc/write-a-wasm-extension-with-cpp.md) ## Ecosystem - [Istio Ecosystem Wasm Extensions](https://github.com/istio-ecosystem/wasm-extensions) - [Proxy-Wasm ABI specification](https://github.com/proxy-wasm/spec) - [Proxy-Wasm C++ SDK](https://github.com/proxy-wasm/proxy-wasm-cpp-sdk) - [Proxy-Wasm Rust SDK](https://github.com/proxy-wasm/proxy-wasm-rust-sdk) - [Proxy-Wasm AssemblyScript SDK](https://github.com/solo-io/proxy-runtime) - [WebAssembly Hub](https://docs.solo.io/web-assembly-hub/latest/tutorial_code/) - [WebAssembly Extensions For Network Proxies (video)](https://www.youtube.com/watch?v=OIUPf8m7CGA)