当前位置: 首页 > article >正文

深入理解 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 推送效率、减少资源消耗。

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

相关文章:

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

解读最新版本的 Istio 源码确实是一项庞大的工程&#xff0c;但我可以为你梳理出一个清晰的脉络&#xff0c;并指出关键模块和代码路径&#xff0c;帮助你深入理解 Istio 的工作原理。 我们主要关注 Istio 的核心组件 Istiod 和数据平面的 Envoy Proxy。 前提&#xff1a; Go…...

深入理解卷积神经网络的输入层:数据的起点与预处理核心

内容摘要 本文围绕卷积神经网络输入层展开&#xff0c;详细介绍其在网络中的重要作用&#xff0c;包括接收不同领域数据的形式及传递数据的过程。深入解读数据预处理的关键操作&#xff0c;如去均值、归一化和PCA/白化。助力读者透彻理解输入层&#xff0c;为构建高效卷积神经…...

redis bitmap数据类型调研

一、bitmap是什么&#xff1f; redis原文&#xff1a; Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type . This means that bitmaps can be used with string commands, and most importantly with SET and GET. 翻…...

如何用数学思想填报高考志愿

人一辈子有很多四年&#xff0c;但是很少有哪个四年对你一生的影响能超过大学这四年。 从18岁到22岁的这几年&#xff0c;是一个人真正成年的过程&#xff0c;很多人会在这段时间里认识一生的朋友&#xff0c;谈第一次真正的恋爱&#xff0c;第一次离开父母&#xff0c;自己生…...

LabVIEW 2019 与 NI VISA 20.0 安装及报错处理

在使用 Windows 11 操作系统的电脑上&#xff0c;同时安装了 LabVIEW 2019 32 位和 64 位版本的软件。此前安装的 NI VISA 2024 Q1 版&#xff0c;该版本与 LabVIEW 2019 32 位和 64 位不兼容&#xff0c;之后重新安装了 NI VISA 20.0。从说明书来看&#xff0c;NI VISA 20.0 …...

探索 JWT(JSON Web Token):原理、结构与实践应用对比

目录 前言1. 什么是 JWT&#xff1f;2. JWT 的组成结构详解2.1 Header&#xff08;头部&#xff09;2.2 Payload&#xff08;负载&#xff09;2.3 Signature&#xff08;签名&#xff09; 3. JWT 的实际作用3.1 身份认证3.2 信息传递与授权 4. JWT 与 Cookie、API Key 的比较4.…...

互联网大厂Java求职面试:云原生与AI融合下的系统设计挑战-1

互联网大厂Java求职面试&#xff1a;云原生与AI融合下的系统设计挑战-1 在当今云计算和人工智能迅猛发展的背景下&#xff0c;互联网大厂对Java工程师的要求已从传统的单体架构和业务逻辑处理&#xff0c;转向了更复杂的云原生架构设计、AI模型集成以及高并发系统的性能优化能…...

【Redis进阶】持久化

一、MySQL事务特性及Redis持久化需求 &#xff08;一&#xff09;MySQL事务特性 MySQL的事务具有四大核心特性&#xff0c;这些特性对于保证数据库操作的准确性和可靠性至关重要。 ​​原子性​​&#xff1a;事务中的所有操作要么全部成功&#xff0c;要么全部失败&#xf…...

[docker基础一]docker简介

目录 一 消除恐惧 1) 什么是虚拟化&#xff0c;容器化 2)案例 3)为什么需要虚拟化&#xff0c;容器化 二 虚拟化实现方式 1)应用程序执行环境分层 2)虚拟化常见类别 3)常见虚拟化实现 一&#xff09;主机虚拟化(虚拟机)实现 二&#xff09;容器虚拟化实现 一 消除恐…...

Texify - 数学公式OCR转换工具

文章目录 一、项目概览相关资源核心特性 二、安装指南三、使用示例1、命令行转换2、Python API调用3、交互式应用 四、性能基准运行你自己的基准测试 五、局限性 一、项目概览 Texify 是一个OCR模型&#xff0c;可将包含数学公式的图片或PDF转换为Markdown和LaTeX格式&#xf…...

RISC-V CLINT、PLIC及芯来ECLIC中断机制分析 —— RISC-V中断机制(一)

在长期的嵌入式开发实践中&#xff0c;对中断机制的理解始终停留在表面层次&#xff0c;特别当开发者长期局限于纯软件抽象层面时&#xff0c;对中断机制的理解极易陷入"知其然而不知其所以然"的困境&#xff0c;这种认知的局限更为明显&#xff1b;随着工作需要不断…...

时钟晶振锁相环pll方向技术要点和大厂题目解析

本专栏预计更新60期左右。当前第9期。 本专栏不仅适用于硬件的笔试面试,同样也适用于梳理硬件核心的知识点。 通过本文能得到什么? 首先,根据实战经验总结时钟晶振,锁相环的主要知识点,技术要点,面试考点; 然后,列出时钟晶振,锁相环的笔试面试的主要题型真题和模拟题,…...

图像处理篇--- HTTP|RTSP|MJPEG视频流格式

文章目录 前言一、MJPEG (Motion JPEG)基本概念技术特点编码方式传输协议数据格式 优势实现简单低延迟兼容性好容错性强 劣势带宽效率低不支持音频缺乏标准控制 典型应用 二、RTSP (Real Time Streaming Protocol)基本概念技术特点协议栈工作流程传输模式 优势专业流媒体支持高…...

【Harbor v2.13.0 详细安装步骤 安装证书启用 HTTPS】

Harbor v2.13.0 详细安装步骤&#xff08;启用 HTTPS&#xff09; 1. 环境准备 系统要求&#xff1a;至少 4GB 内存&#xff0c;100GB 磁盘空间。 已安装组件&#xff1a; Docker&#xff08;版本 ≥ 20.10&#xff09;Docker Compose&#xff08;版本 ≥ v2.0&#xff09; 域…...

C++中的static_cast:类型转换的安全卫士

C中的static_cast&#xff1a;类型转换的安全卫士 在C编程中&#xff0c;类型转换是不可避免的操作&#xff0c;而static_cast作为C四大强制类型转换运算符之一&#xff0c;是最常用且相对安全的一种转换方式。今天我们就来深入探讨一下这个重要的类型转换工具。 一、static_…...

开源与商业:图形化编程工具的博弈与共生

一、开源生态的破局之路&#xff1a;从技术实验到行业标准 在 2025 年全球开发者生态大会上&#xff0c;iVX 凭借 “全栈代码生成 AI 驱动开发” 的技术架构&#xff0c;被行业权威机构评选为 “年度技术创新典范”。作为 2012 年启动的开源项目&#xff0c;iVX 历经 17 年技…...

Docker + Watchtower 实现容器自动更新:高效运维的终极方案

文章目录 前言一、Watchtower 简介二、Watchtower 安装与基本使用1. 快速安装 Watchtower2. 监控特定容器 三、Watchtower 高级配置1. 设置检查间隔2. 配置更新策略3. 清理旧镜像4. 通知设置 四、生产环境最佳实践1. 使用标签控制更新2. 更新前执行健康检查3. 结合CI/CD流水线 …...

(二)Linux下基本指令 2

【知识预告】 16. date 指令 17. cal 指令 18. find 指令 19. which指令 20. whereis 指令 21. alias 指令 22. grep 指令 23. zip/unzip 指令 24. tar 指令 25. bc 指令 26. uname ‒r 指令 27. 重要的⼏个热键 28. 关机 16 date 指令 指定格式显⽰时间&#xff1a;date %Y-…...

1 2 3 4 5顺序插入,形成一个红黑树

红黑树的特性与优点 红黑树是一种自平衡的二叉搜索树&#xff0c;通过额外的颜色标记和平衡性约束&#xff0c;确保树的高度始终保持在 O(log n)。其核心特性如下&#xff1a; 每个节点要么是红色&#xff0c;要么是黑色。根节点和叶子节点&#xff08;NIL节点&#xff09;是…...

无线网络设备中AP和AC是什么?有什么区别?

无线网络设备中AP和AC是什么&#xff1f;有什么区别&#xff1f; 一. 什么是AP&#xff1f;二. 什么是AC&#xff1f;三. AP与AC的关系 前言 肝文不易&#xff0c;点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都…...

Web自动化测试入门详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”&#xff0c;通常都会作为广大测试从业者的首选学习对象&#xff0c;相较于C/S架…...

WHAT - 简单服务发现

文章目录 简单理解举个例子简单服务发现方式1. 静态配置&#xff08;最简单&#xff0c;但不灵活&#xff09;2. DNS 发现3. 使用服务注册中心&#xff08;稍高级&#xff09; 总结 “简单服务发现”&#xff08;Simple Service Discovery&#xff09;通常指的是一种让系统中的…...

uniapp+vue3+firstUI时间轴 提现进度样式

展示 说明&#xff1a;“status”: 0, //状态:0待审核,1审核通过,2审核驳回,3提现成功,4提现失败 第一种&#xff1a;5种类型归纳为三种显示样式 <fui-timeaxis background"#fff" :padding"[10rpx,16rpx,0]"><!-- 动态生成步骤节点 --><f…...

【日撸 Java 三百行】Day 10(综合任务 1)

目录 Day 10&#xff1a;综合任务 1 一、题目分析 1. 数据结构 2. 相关函数基本知识 二、模块介绍 1. 初始化与成绩矩阵的构建 2. 创建总成绩数组 3. 寻找成绩极值 三、代码与测试 小结 拓展&#xff1a;关于求极值的相关算法 Day 10&#xff1a;综合任务 1 Task&…...

VR 南锣鼓巷:古老街区的数字化绘卷与沉浸式遨游​

VR 技术&#xff0c;即虚拟现实技术&#xff0c;是一种能够创建和体验虚拟世界的计算机仿真系统。它利用计算机生成一种模拟环境&#xff0c;通过多源信息融合的交互式三维动态视景和实体行为的系统仿真&#xff0c;使用户沉浸到该环境中&#xff0c;产生身临其境的感受 。简单…...

使用Java NIO 实现一个socket通信框架

使用Java NIO(非阻塞I/O)实现一个Socket通信框架,可以让你构建高性能的网络应用。NIO提供了Channel、Buffer和Selector等核心组件,支持非阻塞模式下的网络编程。下面是一个简单的例子,展示了如何使用Java NIO创建一个基本的服务器端和客户端进行Socket通信。 1.服务器端 …...

Android开发-常用布局

在Android应用开发中&#xff0c;布局决定了用户界面的结构和元素之间的相对位置。选择合适的布局不仅能够提升用户体验&#xff0c;还能提高代码的可维护性和灵活性。本文将介绍几种最常用的Android布局方式&#xff0c;包括LinearLayout、RelativeLayout、ConstraintLayout以…...

macOS 15.4.1 Chrome不能访问本地网络

前言 最近使用macmini m4&#xff0c;自带macOS15系统&#xff0c;对于开发者简直是一言难尽&#xff0c;Chrome浏览器的本地网络有bug&#xff0c;可以访问本机&#xff0c;但是不能访问路由器上的其他机器&#xff0c;路由器提供的页面也不能访问&#xff0c;如下是折腾解决…...

【Hive入门】Hive增量数据导入:基于Sqoop的关系型数据库同步方案深度解析

目录 引言 1 增量数据导入概述 1.1 增量同步与全量同步对比 1.2 增量同步技术选型矩阵 2 Sqoop增量导入原理剖析 2.1 Sqoop架构设计 2.2 增量同步核心机制 3 Sqoop增量模式详解 3.1 append模式&#xff08;基于自增ID&#xff09; 3.2 lastmodified模式&#xff08;基…...

Dify使用总结

最近完成了一个Dify的项目简单进行总结下搭建服务按照官方文档操作就行就不写了。 进入首页之后由以下组成&#xff1a; 探索、工作室、知识库、工具 探索&#xff1a; 可以展示自己创建的所有应用&#xff0c;一个应用就是一个APP&#xff0c;可以进行测试使用 工作室包含…...