Ch14 K8s Istio
# K8s Istio
# Istio整体架构

- Galley 是 Istio 的配置验证、提取、处理和分发组件。它确保 Istio 的配置符合规则,并将正确的配置信息传递给其他组件。
# xDS(eXtensible Discovery Service)简介
- xDS 是一组用于发现和配置代理(如 Istio 中的 Envoy)的协议。它提供了一种标准化的方式来动态地向代理传递配置信息,包括服务发现、路由规则、监听器配置等。这些协议允许控制平面(如 Istio 中的 Pilot)与数据平面代理(Envoy)进行通信,以实现对代理行为的灵活控制。
# Pilot 作为 xDS 服务器的角色
服务发现(LDS - Listener Discovery Service):
- Pilot 作为 xDS 服务器,通过 LDS 向 Envoy 代理提供监听器(Listener)的配置。监听器定义了 Envoy 如何接收和处理传入的网络连接。例如,Pilot 可以告诉 Envoy 在某个特定端口(如 8080 端口)上监听 HTTP 请求,并根据请求的目标服务将其路由到相应的后端服务实例。这种服务发现功能对于动态环境中的微服务架构至关重要,因为服务的位置和端口可能会随着时间变化,Pilot 能够确保 Envoy 始终拥有最新的监听器配置。
路由发现(RDS - Route Discovery Service):
- RDS 协议用于 Pilot 向 Envoy 传递路由规则。这些路由规则决定了如何将传入的请求路由到不同的后端服务。例如,Pilot 可以配置 Envoy 将带有特定 HTTP 头(如/api/v1路径)的请求路由到一个新的服务版本,而将其他请求路由到旧版本。这使得可以在不修改服务代码的情况下实现灰度发布、金丝雀部署等复杂的流量管理策略。Pilot 作为 xDS 服务器,会根据用户定义的流量管理策略和服务发现信息,通过 RDS 向 Envoy 发送精确的路由配置。
集群发现(CDS - Cluster Discovery Service)
- CDS 协议用于 Pilot 向 Envoy 提供集群(Cluster)配置信息。在 Istio 中,集群代表一组具有相同功能的后端服务实例。Pilot 通过 CDS 告诉 Envoy 哪些服务实例属于同一个集群,以及如何与这些集群进行通信。例如,Pilot 可以为 Envoy 配置一个包含多个微服务实例的集群,包括实例的地址、端口、健康检查策略等信息。这有助于 Envoy 进行负载均衡和故障转移操作,确保请求能够被正确地发送到可用的服务实例。
端点发现(EDS - Endpoint Discovery Service)
- EDS 是 Pilot 用于向 Envoy 提供更详细的端点(Endpoint)信息的协议。端点是指具体的服务实例,在集群中可以有多个端点。Pilot 通过 EDS 让 Envoy 了解每个集群中的具体端点位置和状态。例如,当一个新的服务实例被添加到集群或者一个旧的实例出现故障时,Pilot 会通过 EDS 及时更新 Envoy 的端点信息,使得 Envoy 能够调整其负载均衡策略,避免将请求发送到不可用的端点。
# 管理面
# Pilot基本架构

- xDS Generator 是 Pilot 内部的一个重要功能模块。它基于用户定义的各种配置源(如 Istio 的 CRD - Custom Resource Definition,像 VirtualService、DestinationRule 等)和系统的服务发现信息来生成 xDS 协议相关的配置。这些配置是最终通过 xDS Server 发送给 Envoy 代理的内容。
# Citadel基本架构

# Gally基本架构

# Pilot-Agent基本架构

代理应用健康检查是通过app prober来做的,把k8s的一些readness等探针,转发给app,依赖probe的自动重写
为什么要经过代理进行健康检查?因为当sidecar开启严格的健康检查,如果没有代理,会直接被envoy拦截
DNSserver:会降低coreDNS的压力,可以为虚拟机上的应用,解析出k8s的服务
# 透明的sidecar原理

# SideCar基本介绍
手动注入:提供一个pod template模板
自动注入:在应用的pod里面再加一个envoy的pod
# SideCar流量拦截
通过iptable,可以通过init container设置
- 上面入流量,下面出流量

# Envoy流量代理流程

# Envoy流量匹配与转发

# Istio基本功能实现原理
# 流量治理基本API


MCP Server对接其他的注册中心
Aggregater为xDS server提供istio服务的查询功能,有个查询接口

# 路由匹配

# 灰度发布

# 服务网格监控

# Metrics
- envoy中也有一些metrics,但都是连接级别的,没有服务的属性

# Trace调用链
- 需要应用做一点点改动,通过trace后端





# 数据面


# Envoy原理及总体架构



# Envoy启动配置及xDS

# 实操
static_resources是启动的时候手动配置的
dynamic_resources是从istio控制面拿到的配置

# Envoy常用部署模式

# Envoy网络及线程模型

# Envoy网络及线程模型-共享数据同步

# Envoy网络及线程模型-集群信息更新

# Envoy网络及线程模型-网络处理

# Envoy过滤器



# EnvoyHTTP请求流程


# Envoy问题分析方法


# Istio流量治理


# VirtualService


hosts是拦截的目标服务,如果match匹配,转发到match的route里
如果没有匹配到,就根据下面的route的权重来分配
---> 生成envoy的配置

# 故障注入
注入5秒的时延


# Header的更改(包括request和response)
- 比如对header的增删改查

# DestinationRule


一般和virtual service配合使用
virtual service是基于一些策略把流量路由到目标服务
destination rule允许用户针对目标服务做一些配置,见图


每个subset都对应一些标签,也可以对每个subset应用不同的负载均衡策略
可以设置一些连接池配置connectionPool
可以设置outlierDetection,用来故障检测,连续7次5xx错误,就会把某个endpoint驱逐出去,间隔5分钟,基本的注入时间是900秒
# Gateway
在k8s的边缘有独立生成的envoy
外部的服务也可以使用envoy的能力,因为是sidecar





# 服务网格监控

# Metrics

- ALPN(Application - Layer Protocol Negotiation)基本概念
- ALPN 是一种在 TLS(Transport Layer Security)握手过程中协商应用层协议的机制。在网络通信中,当客户端和服务器通过 TLS 建立安全连接时,ALPN 允许双方在 TLS 握手阶段就确定后续要使用的应用层协议,而不是在 TLS 连接建立后再去协商。这样可以提高协议选择的效率,减少额外的往返通信。

# Trace



# AccessLog


# 传统微服务架构接入istio方案
# 微服务架构业务解耦的同时带来了极大的复杂度


# 基于网格的服务治理

# 常用微服务框架对比
# 服务发现 负载均衡

# 服务熔断

# 问题1:微服务SDK多语言问题


# 问题2:基于SDK的微服务在k8s上运行的服务发现延迟和数据不一致问题


- pod在迁移过程中,注册中心来不及删除,导致了不一致问题
# 问题3:基于SDK开发的微服务,SDK逻辑升级,所有业务必须重新编译升级

- 网格升级可以单独升级

# 问题4:在把单体应用微服务化的时候,可能要一把把所有的服务都用sdk重写一遍,不能逐渐升级,否则可能不能服务发现等


# 怎么把微服务框架集成到服务网格


















- springboot的微服务用Istio部署在k8s的情况下,服务发现是用的IstioD,IstioD会与k8s的api server交互,获取K8s中service和endpoint信息,并将这些数据转换为服务网格的配置