深入理解 Istio 的工作原理 v1.26.0

解读最新版本的 Istio 源码确实是一项庞大的工程,但我可以为你梳理出一个清晰的脉络,并指出关键模块和代码路径,帮助你深入理解 Istio 的工作原理。

我们主要关注 Istio 的核心组件 Istiod 和数据平面的 Envoy Proxy

前提:

  1. Go 语言基础: Istiod 主要用 Go 编写。

  2. Kubernetes 基础: Istio 深度集成 Kubernetes。

  3. Envoy Proxy 基础: 了解 Listener, Filter, Cluster, Route 等概念对理解数据平面至关重要。

  4. Git & IDE: 方便克隆代码和导航。

Istio 源码结构概览 (以 istio/istio 仓库为例):

  • pilot/: Istio 的核心,负责服务发现、配置分发 (xDS)、流量管理规则转换等。这是 Istiod 的主要代码所在地。

  • pkg/: 包含了很多共享的库和工具函数,被多个组件使用。

  • security/: 负责证书管理 (CA)、安全策略 (认证、授权) 等。现在这部分功能也集成在 Istiod 中。

  • operator/: Istio Operator 的代码,用于简化 Istio 的安装和管理。

  • proxy/: 包含 Envoy 代理的构建脚本、配置,以及 Istio 特有的 Envoy 扩展 (如 Wasm 插件)。

  • manifests/: Helm charts 和 YAML 清单,用于部署 Istio。

  • tools/: 构建、测试、发布相关的工具。

  • istioctl/: istioctl 命令行工具的源码。

  • mixer/ (已废弃,但历史代码可能还在): 老版本的策略和遥测组件,现在推荐使用基于 Wasm 的 Envoy 扩展。

  • galley/ (已废弃,功能并入 Pilot): 老版本的配置验证和分发组件。

核心组件 Istiod 源码解读 (主要在 pilot/ 和 security/ 中)

Istiod 整合了之前 Pilot, Citadel, Galley 的功能,是控制平面的大脑。

  1. 启动入口 (cmd/istiod/main.go 或类似路径):

    • 这是 Istiod 进程的起点。

    • 会初始化各种参数、组件、服务器 (如 xDS gRPC server, metrics server, health check server)。

    • 你会看到它如何加载配置、启动各个内部服务。

  2. Pilot - 服务发现与配置转换 (pilot/pkg/):

    • model/ (pilot/pkg/model/):

      • 定义了 Istio 内部对各种配置对象 (如 VirtualService, DestinationRule, ServiceEntry) 和服务信息的抽象数据结构。

      • 例如 ServiceInstance, Proxy 等。

      • 这是理解 Istio 如何在内部表示和处理配置的关键。

    • Service Registry (pilot/pkg/serviceregistry/):

      • 负责从各种平台 (Kubernetes, Consul, Cloud Foundry, 本地文件等) 发现服务和端点信息。

      • kube/ 子目录是 Kubernetes 服务发现的实现。

      • 它会 watch Kubernetes 的 Service, Endpoints, Pod 等资源。

    • Configuration Store (pilot/pkg/config/):

      • 负责存储和管理 Istio 的配置对象 (CRDs)。

      • kube/crd/ 子目录处理 Kubernetes CRD 的读取、验证和分发。

      • 当用户创建或更新 VirtualService 等 CRD 时,这部分代码会被触发。

    • xDS Server (pilot/pkg/xds/):

      • 这是 Pilot 最核心的部分。

      • 实现了 Envoy 的 xDS (Discovery Service) API 接口 (LDS, RDS, CDS, EDS, SDS等)。

      • 当 Envoy Proxy 连接到 Istiod 时,Istiod 通过这些接口向 Envoy 推送配置。

      • 关键逻辑:

        • discovery.go (或类似文件): xDS 服务器的 gRPC 实现。

        • Generators (例如 lds.go, rds.go, cds.go, eds.go): 这些文件包含了将 Istio 的内部模型 (model/ 中的结构) 转换为 Envoy 具体配置 (Listeners, Routes, Clusters, Endpoints) 的逻辑。

          • 例如,VirtualService 和 DestinationRule 会被这里的代码转换成 Envoy 的 RouteConfiguration 和 Cluster 配置。

        • Push Context: 管理配置的当前状态,当配置或服务发生变化时,触发新的 xDS 推送。

        • Debouncing 和 Aggregation: 优化 xDS 推送,避免频繁更新和合并多个更新。

    • controller/ (pilot/pkg/controller/):

      • 包含各种控制器,用于响应 Kubernetes 资源的变更并更新 Istio 的内部状态。例如,servicecontroller, podcontroller。

  3. Security - 证书管理与安全策略 (security/pkg/ 和 pilot/pkg/security/):

    • CA (Certificate Authority) (security/pkg/pki/ca/):

      • 负责签发和管理工作负载的证书 (SPIFFE SVID)。

      • 实现了 Istio CA 的功能,可以通过 CSR (Certificate Signing Request) API 为 Envoy 和工作负载签发证书。

    • SDS (Secret Discovery Service) Server (pilot/pkg/bootstrap/server.go 中可以看到 SDS 服务的注册):

      • Istiod 内置了 SDS 服务器。Envoy Proxy 通过 SDS API 向 Istiod 请求身份证书和根证书。

      • 这使得证书轮换更加安全和自动化。

    • Authorization Policy (pilot/pkg/security/authz/):

      • 处理 AuthorizationPolicy CRD,将其转换为 Envoy 的 RBAC (Role-Based Access Control) filter 配置或外部授权 (ext_authz) 配置。

    • Authentication Policy (pilot/pkg/security/authn/):

      • 处理 PeerAuthentication 和 RequestAuthentication CRD,将其转换为 Envoy 的 mTLS 配置和 JWT 认证 filter 配置。

数据平面 Envoy Proxy 的交互

  • proxy/ 目录:

    • 虽然 Envoy 本身是 C++ 编写的,但 proxy/ 目录包含了 Istio 如何构建和定制 Envoy 的信息。

    • Wasm 插件 (proxy/extensions/ 或 extensions/): Istio 正在将越来越多的自定义逻辑 (如遥测、复杂策略) 通过 WebAssembly (Wasm) 插件的形式加载到 Envoy 中。这里可以找到这些 Wasm 插件的源码 (通常是 C++ 或 Rust)。

  • Envoy 的配置:

    • Envoy 启动时会通过 -c 参数指定一个初始的 bootstrap 配置文件,或者通过 xDS 从 Istiod 动态获取所有配置。

    • 在 Istio 中,Envoy 通常会有一个最小的 bootstrap 配置,告诉它 Istiod 的地址,然后通过 xDS API 获取完整的动态配置。

    • 你可以通过 istioctl proxy-config <pod-name> -o json 查看某个 Pod 的 Envoy 的实际配置,这对于理解 Istio 如何将 CRD 转换为 Envoy 配置非常有帮助。

一个典型的配置下发流程:

  1. 用户操作: 用户通过 kubectl apply -f virtualservice.yaml 创建或更新一个 VirtualService。

  2. K8s API Server: VirtualService CRD 对象被存储在 etcd 中。

  3. Istiod (Config Controller):

    • Istiod 中的配置控制器 (pilot/pkg/config/kube/crd/) watch VirtualService 类型的 CRD。

    • 检测到变更后,读取新的 VirtualService 定义。

    • 进行合法性校验。

    • 将其转换为 Istio 内部的 model.Config 结构。

  4. Istiod (xDS Generator):

    • 当 Pilot 准备推送配置时 (可能因为 VirtualService 变化,或者服务发现信息变化),xDS 生成器 (pilot/pkg/xDS/) 会被调用。

    • 例如,RDS (Route Discovery Service) 生成器会根据所有相关的 VirtualService 和 DestinationRule 为特定的 Envoy 代理生成路由配置 (RouteConfiguration)。

    • LDS (Listener Discovery Service) 生成器会生成监听器配置。

    • CDS (Cluster Discovery Service) 生成器会生成集群配置。

    • EDS (Endpoint Discovery Service) 生成器会根据服务发现的结果生成端点配置。

  5. Istiod (xDS Server):

    • 将生成的 Envoy 配置通过 xDS gRPC 流推送给已连接的 Envoy 代理。

  6. Envoy Proxy:

    • 接收到新的配置。

    • 动态地、无中断地应用新的配置 (热更新)。例如,更新路由规则、目标集群、TLS 上下文等。

如何开始阅读源码:

  1. 克隆代码库: git clone https://github.com/istio/istio.git

  2. 选择一个切入点:

    • 从 istiod 启动开始: cmd/istiod/main.go,看它如何初始化各个组件。

    • 从一个 CRD 处理开始: 比如 VirtualService,找到 pilot/pkg/config/kube/crd/ 中处理 VirtualService 的代码,然后跟踪它如何被转换为内部模型,再到 pilot/pkg/xds/ 中的 RDS 生成器如何使用它。

    • 从 xDS API 实现开始: 查看 pilot/pkg/xds/discovery.go (或类似文件),看 gRPC 服务是如何实现的。

  3. 使用 IDE: GoLand 或 VS Code 与 Go 插件可以帮助你进行代码导航、查找引用、理解类型等。

  4. 关注核心数据结构: pilot/pkg/model/ 中的定义非常重要。

  5. 阅读测试代码: 测试代码通常会展示某个模块或函数的预期行为和用法。

  6. 从小处着手: 不要试图一次理解所有东西。选择一个小功能点,比如一个 VirtualService 的 match 条件是如何被翻译成 Envoy 的路由匹配规则的。

  7. 利用调试器: 如果可能,本地运行一个精简版的 Istio (如 kind 集群),并尝试用调试器 attach 到 istiod 进程,单步跟踪代码执行。

  8. 参考官方文档和设计文档: Istio 官网有很多关于架构和设计理念的文档,可以帮助你理解代码背后的意图。

  9. 注意日志: Istiod 的日志包含了大量关于配置处理、xDS 推送的信息,可以帮助你理解其内部状态。你可以提高 istiod 的日志级别来获取更详细的信息。

最新版本的一些趋势和重点:

  • Ambient Mesh (无 Sidecar 模式): 这是 Istio 的一个重大演进方向。如果想了解最新进展,可以关注相关的设计文档和代码提交。它引入了 ztunnel (节点代理) 和 waypoint proxy (L7 代理) 的概念。相关代码可能在新的目录或 pilot/ 的特定模块下。

  • Wasm 扩展性: 更多功能通过 Wasm 实现,以提供更好的灵活性和性能。

  • API 演进: Gateway API 的支持和演进。

  • 性能优化: 持续优化 xDS 推送效率、减少资源消耗。

  • 安全性增强: 更细粒度的安全策略、更强的身份认证机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flask 调试的时候进入main函数两次

在 Flask 开启 Debug 模式时&#xff0c;程序会因为自动重载&#xff08;reloader&#xff09;的机制而启动两个进程&#xff0c;导致if __name__ __main__底层的程序代码被执行两次。以下说明其原理与常见解法。 Flask Debug 模式下自动重载机制 Flask 使用的底层服务器 Wer…

CSS--图片链接垂直居中展示的方法

原文网址&#xff1a;CSS--图片链接垂直居中展示的方法-CSDN博客 简介 本文介绍CSS图片链接垂直居中展示的方法。 图片链接 问题复现 源码 <html xml:lang"cn" lang"cn"><head><meta http-equiv"Content-Type" content&quo…

雷赛伺服L7-EC

1电子齿轮比&#xff1a; 0x608F-01 只读&#xff0c;编码器圈脉冲【0x20000】【131072】 //Er1B1齿轮比错误 ----------------------------------- 0x6092-01 圈脉冲 //重新使能生效【pa008必须是0】值越小&#xff0c;转的越多 -----------------------…

在js中大量接口调用并发批量请求处理器

并发批量请求处理器 ✨ 设计目标 该类用于批量异步请求处理&#xff0c;支持&#xff1a; 自定义并发数请求节拍控制&#xff08;延时&#xff09;失败重试机制进度回调通知 &#x1f527; 构造函数参数 new BulkRequestHandler({dataList, // 要处理的数据列表r…

K8S扩缩容及滚动更新和回滚

目录&#xff1a; 1、滚动更新1、定义Deployment配置2、应用更新 2、版本回滚1. 使用kubectl rollout undo命令 3、更新暂停与恢复1、暂停更新2、更新镜像&#xff08;例如&#xff0c;使用kubectl set image命令&#xff09;3、恢复更新 4、弹性扩缩容1、扩容命令2、缩容命令3…

力扣-24.两两交换链表中的结点

题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 class Solution { public:ListNode* swapPairs(ListNode* head) {i…

对遗传算法思想的理解与实例详解

目录 一、概述 二、实例详解 1&#xff09;问题描述与分析 2&#xff09;初始化种群 3&#xff09;计算种群适应度 4&#xff09;遗传操作 5&#xff09;基因交叉操作 6&#xff09;变异操作 三、计算结果 四、总结 一、概述 遗传算法在求解最优解的问题中最为常用&a…

计算机图形学编程(使用OpenGL和C++)(第2版) 学习笔记 07.光照

1. 光照 1.1. 光源 光源类型特点优点缺点环境光整个场景均匀受光&#xff0c;无方向和位置。模拟全局光照&#xff0c;避免完全黑暗的区域。缺乏方向性和真实感&#xff0c;无法产生阴影。平行光光线方向平行&#xff0c;无位置&#xff0c;仅有方向。计算简单&#xff0c;适…

Python在大数据机器学习模型的多模态融合:深入探索与实践指南

一、多模态融合的全面概述 1.1 多模态融合的核心概念 多模态融合(Multimodal Fusion)是指将来自不同传感器或数据源(如图像、文本、音频、视频、传感器数据等)的信息进行有效整合,以提升机器学习模型的性能和鲁棒性。在大数据环境下,多模态融合面临着独特的挑战和机遇: 数…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】6.4 时间序列分析(窗口函数处理时间数据)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL时间序列分析&#xff1a;窗口函数处理时间数据实战一、时间序列分析核心场景与窗口函数优势1.1 业务场景需求1.2 窗口函数核心优势 二、窗口函数基础&#xff1a…

window 显示驱动开发-配置内存段类型

视频内存管理器&#xff08;VidMm&#xff09;和显示硬件仅支持某些类型的内存段。 因此&#xff0c;内核模式显示微型端口驱动程序&#xff08;KMD&#xff09;只能配置这些类型的段。 KMD 可以配置内存空间段和光圈空间段&#xff0c;其中不同&#xff1a; 内存空间段由保存…

笔记,麦克风的灵敏度

麦克风的“灵敏度&#xff08;Sensitivity&#xff09;”决定了它捕捉声音细节的能力。想象麦克风是一只有耳朵的生物。高灵敏度麦克风像长着“超级顺风耳”的精灵&#xff0c;能听见花瓣飘落的声音、远处树叶的沙沙声&#xff0c;甚至你心跳的微弱震动。适合录音棚里捕捉歌手的…

lvm详细笔记

LVM简介 逻辑卷管理器&#xff0c;是Linux 系统中用于管理磁盘储存的关键技术。 LVM 则打破了磁盘分区一旦确定&#xff0c;其大小调整往往较为复杂&#xff0c;且难以灵活应对业务变化这种限制&#xff0c;它允许用户将多个物理分区组合卷组。例如&#xff0c;系统中的多个物…

rust-candle学习笔记10-使用Embedding

参考&#xff1a;about-pytorch candle-nn提供embedding()初始化Embedding方法: pub fn embedding(in_size: usize, out_size: usize, vb: crate::VarBuilder) -> Result<Embedding> {let embeddings vb.get_with_hints((in_size, out_size),"weight",cr…

Python小酷库系列:Munch,用对象的访问方式访问dict

Munch&#xff0c;用对象的访问方式访问dict 基本使用1、创建一个 Munch 对象2、使用字典初始化3、访问不存在的字段4、嵌套结构支持5、合并操作6、应用场景说明 进阶功能1、嵌套写入&#xff1a;创建不存在的子对象2、序列化&#xff08;转回 dict&#xff09;3、深度拷贝结构…

对称加密以及非对称加密

对称加密和非对称加密是两种不同的加密方式&#xff0c;它们在加密原理、密钥管理、安全性和性能等方面存在区别&#xff0c;以下是具体分析&#xff1a; 加密原理 对称加密&#xff1a;通信双方使用同一把密钥进行加密和解密。就像两个人共用一把钥匙&#xff0c;用这把钥匙锁…

[JAVAEE]HTTP协议(2.0)

响应报文格式 响应报文格式由首行&#xff0c;响应头&#xff08;header&#xff09;&#xff0c;空行&#xff0c;正文&#xff08;body&#xff09; 组成 响应报文首行包括 1.版本号 如HTTP/1.1 2.状态码(如200) 描述了请求的结果 3.状态码描述(如OK) 首行——状态码…

Spring Boot 之MCP Server开发全介绍

Spring AI 的 MCP(模型上下文协议,Model Context Protocol)服务器启动器为在 Spring Boot 应用程序中设置 MCP 服务器提供了自动配置功能。它使得 MCP 服务器功能能够与 Spring Boot 的自动配置系统实现无缝集成。 MCP 服务器启动器具备以下特性: MCP 服务器组件的自动配置…

YOLOv8 对象检测任务的标注、训练和部署过程

YOLOv8 对象检测任务的标注、训练和部署过程 在计算机视觉领域&#xff0c;对象检测是一项基础且重要的任务&#xff0c;YOLOv8 作为当前先进的实时对象检测模型&#xff0c;以其高效性和准确性受到广泛关注。从数据准备到最终模型部署&#xff0c;整个流程包含多个关键环节&a…

电池热管理CFD解决方案,为新能源汽车筑安全防线

在全球能源结构加速转型的大背景下&#xff0c;新能源汽车产业异军突起&#xff0c;成为可持续发展的重要驱动力。而作为新能源汽车 “心脏” 的电池系统&#xff0c;其热管理技术的优劣&#xff0c;直接决定了车辆的安全性、续航里程和使用寿命。电池在充放电过程中会产生大量…