深入理解 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.pswp.cn/bicheng/80426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80426.shtml
英文地址,請注明出處:http://en.pswp.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;直接決定了車輛的安全性、續航里程和使用壽命。電池在充放電過程中會產生大量…