Istio作為服務網格技術最具代表性的產品,歷經多年發展已日漸成熟,并受到越來越多開發者的青睞。本書以 Istio 服務網格為核心,內容包括基本概念、核心功能、運維、企業級落地四大部分,從基本的安裝部署到功能實踐,從底層原理分析到故障排查,從進階操作到企業級實戰,由淺入深地介紹了 Istio 服務網格的各個方面。本書適合正在使用或關注 Istio 的開發工程師、運維工程師、架構師等云原生領域從業者閱讀。無論你是服務網格技術的初學者,還是該領域的專家,都能從本書中尋找到有借鑒意義的理論及實踐指導。
Christian Posta(@christianposta)是 Solo.io 公司副總裁,全球領域首席技術官。他在云原生社區中以作家、博主、演說家,以及服務網格和云原生生態中各種開源項目的貢獻者身份而聞名。Christian 曾在傳統企業和大型互聯網公司工作過,現在幫助組織創建和部署大規模的、云原生的、彈性的分布式架構。他擅長指導、培訓和領導團隊在分布式系統概念、微服務、DevOps 和云原生應用程序設計方面取得成功。Rinor Maloku(@rinormaloku)是 Solo.io 公司的工程師。他為采用應用網絡解決方案(如服務網格)的客戶提供咨詢服務。此前,他在 Red Hat 公司工作,在那里,他開發了中間件軟件,使研發團隊能夠確保其服務的高可用性。作為一名自由職業者,他服務了多位 DAX 30 成員,以充分利用云計算技術的潛力。
馬若飛,就職于飛維美地(FreeWheel)北京研發中心,擔任首席工程師,主要負責微服務架構設計和云原生落地工作。《Istio實戰指南》作者,極客時間《Service Mesh實戰》專欄作者,《云原生應用架構:微服務開發最佳實踐》主要作者,人民郵電出版社IT專業圖書專家顧問,ServiceMesher技術社區和云原生社區管理委員會成員。發表、翻譯多篇云原生領域前沿技術文章,熱衷于技術分享。宋凈超(Jimmy Song),Tetrate 布道師,云原生社區創始人,螞蟻集團前云原生布道師及開源管理負責人,電子工業出版社圖書出品人,獨立撰稿人。Kubernetes 、Istio 等開源技術的早期使用及推廣者。著有《未來架構:從服務化到云原生》《深入理解Istio:云原生服務網格進階實戰》,參與過多部作品的翻譯工作。羅廣明,字節跳動服務框架團隊架構師,云原生社區管理委員會成員、北京站站長。先后在愛立信、百度從事云原生、微服務及開源相關工作,后加入字節跳動,負責 CloudWeGo 等微服務項目開源相關工作。長期關注云原生 & 微服務領域前沿技術、架構演進及標準化進程。
第 1 部分 理解 Istio
1 Istio 服務網格......................................................................... 2
1.1 快速迭代帶來的挑戰 ...................................................................................... 3
1.1.1 不可靠的云基礎設施 .......................................................................... 5
1.1.2 服務通信需要彈性 .............................................................................. 6
1.1.3 實時可觀測性 ...................................................................................... 6
1.2 使用應用程序庫解決問題 .............................................................................. 7
1.3 基礎設施的解決思路 ...................................................................................... 9
1.3.1 應用程序感知服務代理 ...................................................................... 9
1.3.2 認識 Envoy 代理 ................................................................................ 10
1.4 什么是服務網格 ............................................................................................ 11
1.5 Istio 服務網格簡介 ........................................................................................ 13
1.5.1 服務網格與企業服務總線的關系 .................................................... 14
1.5.2 服務網格與 API 網關的關系 ............................................................ 16
1.5.3 在非微服務架構中使用 Istio ............................................................ 17
1.5.4 在分布式架構中使用 Istio ................................................................ 18
1.5.5 使用服務網格的缺點 ........................................................................ 19
本章小結 ................................................................................................................. 19
2 Istio 的第一步.......................................................................21
2.1 在 Kubernetes 上部署 Istio ............................................................................ 21
2.1.1 使用 Docker Desktop 來演示樣例 .................................................... 22
2.1.2 獲取 Istio 發行版 ............................................................................... 22
2.1.3 將 Istio 組件安裝到 Kubernetes 中 ................................................... 24
2.2 了解 Istio 控制平面 ....................................................................................... 25
2.2.1 istiod 簡介 .......................................................................................... 26
2.2.2 入口網關和出口網關 ........................................................................ 30
2.3 在服務網格中部署你的第一個應用程序 .................................................... 31
2.4 Istio 的可觀測性、彈性和流量路由 ............................................................ 36
2.4.1 Istio 與可觀測性 ................................................................................ 37
2.4.2 Istio 與彈性 ........................................................................................ 44
2.4.3 Istio 與流量路由 ................................................................................ 46
本章小結 ................................................................................................................. 50
3 Istio 的數據平面 :Envoy .......................................................51
3.1 什么是 Envoy 代理 ........................................................................................ 51
3.1.1 Envoy 的核心功能 ............................................................................. 53
3.1.2 Envoy 與其他代理的比較 ................................................................. 58
3.2 配置 Envoy ..................................................................................................... 58
3.2.1 靜態配置 ............................................................................................ 58
3.2.2 動態配置 ............................................................................................ 60
3.3 Envoy 實戰 ..................................................................................................... 61
3.3.1 Envoy 的 Admin API ......................................................................... 65
3.3.2 Envoy 的請求重試 ............................................................................. 66
3.4 Envoy 與 Istio 的融合 .................................................................................... 67
本章小結 ................................................................................................................. 69
第 2 部分 保護、觀察和控制服務網格中的流量
4 Istio 網關 :將流量導入集群....................................................72
4.1 流量入口概念 ................................................................................................ 73
4.1.1 虛擬 IP 地址 :簡化服務訪問 ........................................................... 73
4.1.2 虛擬主機 :來自單個接入點的多個服務 ........................................ 75
4.2 Istio 入口網關 ................................................................................................ 75
4.2.1 聲明 Gateway 資源 ............................................................................ 77
4.2.2 虛擬服務的網關路由 ........................................................................ 79
4.2.3 流量整體視圖 .................................................................................... 82
4.2.4 對比 Istio 入口網關與 Kubernetes Ingress ....................................... 82
4.2.5 對比 Istio 入口網關與 API 網關 ....................................................... 83
4.3 保護網關流量 ................................................................................................ 83
4.3.1 使用 TLS 的 HTTP 流量 ................................................................... 84
4.3.2 將 HTTP 重定向到 HTTPS ............................................................... 88
4.3.3 使用 mTLS 的 HTTP 通信 ................................................................ 89
4.3.4 為多個虛擬主機提供 TLS 服務 ....................................................... 92
4.4 TCP 流量 ........................................................................................................ 93
4.4.1 在 Istio 網關上暴露 TCP 端口 .......................................................... 94
4.4.2 使用 SNI 直通的流量路由 ................................................................ 96
4.5 網關使用建議 ................................................................................................ 99
4.5.1 拆分網關的職能 ................................................................................ 99
4.5.2 網關注入 .......................................................................................... 101
4.5.3 入口網關訪問日志 .......................................................................... 102
4.5.4 減少網關配置 .................................................................................. 103
本章小結 ............................................................................................................... 104
5 流量控制 :細粒度流量路由 .................................................. 105
5.1 減少部署新代碼帶來的風險 ...................................................................... 105
5.2 Istio 的請求路由 .......................................................................................... 109
5.2.1 清理工作空間 .................................................................................. 109
5.2.2 部署 catalog 服務的 v1 版本 ........................................................... 110
5.2.3 部署 catalog 服務的 v2 版本 ............................................................111
5.2.4 將所有流量路由到 catalog 服務的 v1 版本 ................................... 112
5.2.5 將特定請求路由到 v2 版本 ............................................................ 114
5.2.6 在調用鏈路內部進行路由 .............................................................. 115
5.3 流量遷移 ...................................................................................................... 117
5.4 進一步降低風險 :流量鏡像 ...................................................................... 125
5.5 使用 Istio 的服務發現路由到集群外部的服務 ......................................... 127
本章小結 ............................................................................................................... 131
6 彈性 :應對應用程序的網絡挑戰............................................ 132
6.1 實現應用程序的彈性 .................................................................................. 132
6.1.1 為應用程序庫構建彈性能力 .......................................................... 133
6.1.2 使用 Istio 解決彈性問題 ................................................................. 134
6.1.3 實現去中心化的彈性能力 .............................................................. 134
6.2 客戶端負載均衡 .......................................................................................... 135
6.2.1 開始使用客戶端負載均衡 .............................................................. 136
6.2.2 構建應用場景 .................................................................................. 138
6.2.3 測試不同的客戶端負載均衡策略 .................................................. 139
6.2.4 理解負載均衡算法的差異 .............................................................. 144
6.3 位置感知負載均衡 ...................................................................................... 144
6.3.1 位置感知負載均衡實驗 .................................................................. 145
6.3.2 利用加權分布對位置感知負載均衡進行更多的控制 .................. 149
6.4 透明的超時和重試 ...................................................................................... 152
6.4.1 超時 .................................................................................................. 152
6.4.2 重試 .................................................................................................. 154
6.4.3 高級重試 .......................................................................................... 160
6.5 Istio 中的熔斷 .............................................................................................. 162
6.5.1 利用連接池設置防止服務過慢 ...................................................... 163
6.5.2 利用異常點檢測剔除不健康的服務 .............................................. 169
本章小結 ............................................................................................................... 172
7 可觀測性 :理解服務的行為 .................................................. 174
7.1 什么是可觀測性 .......................................................................................... 175
7.1.1 可觀測性與監控 .............................................................................. 175
7.1.2 Istio 如何幫助實現可觀測性 .......................................................... 176
7.2 探索 Istio 的指標 ......................................................................................... 176
7.2.1 數據平面指標 .................................................................................. 177
7.2.2 控制平面指標 .................................................................................. 182
7.3 使用 Prometheus 抓取 Istio 指標 ................................................................ 184
7.3.1 安裝 Prometheus 和 Grafana ........................................................... 186
7.3.2 配置 Prometheus Operator 抓取 Istio 控制平面和工作負載的指標 ... 187
7.4 自定義 Istio 標準指標 ................................................................................. 190
7.4.1 配置現有的指標 .............................................................................. 193
7.4.2 創建新指標 ...................................................................................... 197
7.4.3 使用新屬性分組調用 ...................................................................... 199
本章小結 ............................................................................................................... 201
8 可觀測性 :使用 Grafana、Jaeger 和 Kiali 觀察網絡行為........... 202
8.1 使用 Grafana 觀察 Istio 服務和控制平面指標 .......................................... 202
8.1.1 安裝 Istio 的 Grafana 儀表板 .......................................................... 203
8.1.2 查看控制平面指標 .......................................................................... 205
8.1.3 查看數據平面指標 .......................................................................... 206
8.2 分布式追蹤 .................................................................................................. 206
8.2.1 分布式追蹤是怎么工作的 .............................................................. 207
8.2.2 安裝分布式追蹤系統 ...................................................................... 209
8.2.3 配置 Istio 實現分布式追蹤 ............................................................. 210
8.2.4 查看分布式追蹤數據 ...................................................................... 213
8.2.5 追蹤采樣、強制追蹤和自定義標簽 .............................................. 214
8.3 使用 Kiali 觀察服務網格 ............................................................................ 220
8.3.1 安裝 Kiali ......................................................................................... 220
8.3.2 結論 .................................................................................................. 225
本章小結 ............................................................................................................... 225
9 確保微服務通信安全............................................................227
9.1 應用程序網絡安全需求 .............................................................................. 227
9.1.1 服務間認證 ...................................................................................... 228
9.1.2 終端用戶認證 .................................................................................. 228
9.1.3 授權 .................................................................................................. 228
9.1.4 單體和微服務應用的安全比較 ...................................................... 228
9.1.5 Istio 如何實現 SPIFFE .................................................................... 230
9.1.6 Istio 安全簡述 .................................................................................. 230
9.2 自動 mTLS ................................................................................................... 231
9.2.1 安裝環境 .......................................................................................... 232
9.2.2 理解 Istio 的對等認證 ..................................................................... 233
9.3 授權服務間流量 .......................................................................................... 238
9.3.1 了解 Istio 中的授權 ......................................................................... 239
9.3.2 設置工作區 ...................................................................................... 240
9.3.3 當策略被應用于工作負載時行為的變化 ...................................... 241
9.3.4 默認使用一個全局策略拒絕所有請求 .......................................... 242
9.3.5 允許來自單一命名空間的請求 ...................................................... 243
9.3.6 允許來自非認證的工作負載的請求 .............................................. 244
9.3.7 允許來自單一服務賬戶的請求 ...................................................... 245
9.3.8 策略的條件匹配 .............................................................................. 246
9.3.9 了解值匹配表達式 .......................................................................... 246
9.3.10 了解評估授權策略的順序 ............................................................ 248
9.4 終端用戶的認證和授權 .............................................................................. 249
9.4.1 什么是 JWT ..................................................................................... 249
9.4.2 入口網關的終端用戶認證和授權 .................................................. 251
9.4.3 使用 RequestAuthentication 驗證 JWT ........................................... 252
9.5 與自定義的外部授權服務集成 .................................................................. 256
9.5.1 外部授權實踐 .................................................................................. 257
9.5.2 配置 ExtAuthz .................................................................................. 258
9.5.3 使用自定義的 AuthorizationPolicy 資源 ........................................ 259
本章小結 ............................................................................................................... 260
第 3 部分 Istio 運維
10 數據平面的故障排查......................................................... 262
10.1 最常見錯誤 :數據平面配置錯誤 ............................................................ 263
10.2 識別數據平面的問題 ................................................................................ 265
10.2.1 如何驗證數據平面是最新的 ........................................................ 265
10.2.2 使用 Kiali 發現配置錯誤 .............................................................. 266
10.2.3 通過 istioctl 發現配置錯誤 ........................................................... 268
10.3 從 Envoy 配置中發現錯誤 ........................................................................ 270
10.3.1 Envoy 管理界面 ............................................................................. 270
10.3.2 使用 istioctl 查詢代理配置 ........................................................... 270
10.3.3 應用程序的故障排查 .................................................................... 276
10.3.4 使用 ksniff 檢查網絡流量 ............................................................. 282
10.4 通過 Envoy 的遙測能力了解應用程序 .................................................... 285
10.4.1 在 Grafana 中查看請求失敗率 ..................................................... 286
10.4.2 使用 Prometheus 查詢受影響的 Pod ............................................ 287
本章小結 ............................................................................................................... 288
11 控制平面性能優化 .............................................................290
11.1 控制平面的主要目標 ................................................................................ 290
11.1.1 了解數據平面同步的步驟 ............................................................ 291
11.1.2 決定性能的因素 ............................................................................ 292
11.2 監控控制平面 ............................................................................................ 293
11.3 性能調整 .................................................................................................... 298
11.3.1 設置工作區 .................................................................................... 299
11.3.2 測量優化前的性能 ........................................................................ 299
11.3.3 忽略事件 :使用發現選擇器縮小發現的范圍 ............................ 303
11.3.4 事件批處理和推送節流特性 ........................................................ 305
11.4 性能優化準則 ............................................................................................ 308
本章小結 ............................................................................................................... 310
第 4 部分 在組織中落地 Istio
12 在組織中擴展 Istio............................................................312
12.1 多集群服務網格的好處 ............................................................................ 312
12.2 多集群服務網格概述 ................................................................................ 313
12.2.1 Istio 多集群部署模型 .................................................................... 314
12.2.2 在多集群部署中如何發現工作負載 ............................................ 316
12.2.3 跨集群的工作負載連接 ................................................................ 317
12.2.4 集群間互信 .................................................................................... 318
12.3 多集群、多網絡、多控制平面的服務網格 ............................................ 319
12.3.1 選擇多集群部署模型 .................................................................... 320
12.3.2 建立云基礎設施 ............................................................................ 320
12.3.3 配置插件式 CA 證書 ..................................................................... 321
12.3.4 在每個集群中安裝控制平面 ........................................................ 322
12.3.5 啟用跨集群的工作負載發現 ........................................................ 325
12.3.6 設置跨集群連接 ............................................................................ 327
12.3.7 跨集群的負載均衡 ........................................................................ 334
本章小結 ............................................................................................................... 339
13 將虛擬機工作負載納入網格................................................ 340
13.1 Istio 的虛擬機支持 .................................................................................... 341
13.1.1 簡化虛擬機中 sidecar 代理的安裝與配置 ................................... 341
13.1.2 虛擬機的高可用性 ........................................................................ 343
13.1.3 網格內服務的 DNS 解析 .............................................................. 346
13.2 設置基礎設施 ............................................................................................ 348
13.2.1 設置服務網格 ................................................................................ 349
13.2.2 配置虛擬機 .................................................................................... 350
13.3 將網格擴展到虛擬機 ................................................................................ 352
13.3.1 向虛擬機暴露 istiod 和集群服務 ................................................. 352
13.3.2 使用 WorkloadGroup 表示一個工作負載組 ................................ 353
13.3.3 在虛擬機中安裝與配置 istio-agent .............................................. 356
13.3.4 將流量路由到集群服務 ................................................................ 359
13.3.5 將流量路由到 WorkloadEntry ....................................................... 360
13.3.6 虛擬機是由控制平面配置的 :強制執行雙向認證 .................... 363
13.4 揭開 DNS 代理的神秘面紗 ...................................................................... 364
13.4.1 DNS 代理如何解析集群內主機名 ............................................... 364
13.4.2 DNS 代理知道哪些主機名 ........................................................... 366
13.5 自定義代理的行為 .................................................................................... 367
13.6 將 WorkloadEntry 從網格中刪除 .............................................................. 368
本章小結 ............................................................................................................... 369
14 在請求路徑上擴展 Istio ..................................................... 370
14.1 Envoy 的擴展能力 ..................................................................................... 371
14.1.1 了解 Envoy 的過濾器鏈 ................................................................ 371
14.1.2 用于擴展的過濾器 ........................................................................ 374
14.1.3 定制 Istio 的數據平面 ................................................................... 374
14.2 使用 EnvoyFilter 資源配置 Envoy 過濾器 ............................................... 374
14.3 調用外部的限流請求 ................................................................................ 379
14.4 使用 Lua 擴展 Istio 的數據平面 ............................................................... 384
14.5 使用 WebAssembly 擴展 Istio 的數據平面 .............................................. 387
14.5.1 WebAssembly 簡介 ........................................................................ 387
14.5.2 為什么使用 WebAssembly ............................................................ 388
14.5.3 使用 WebAssembly 構建新的 Envoy 過濾器 .............................. 389
14.5.4 使用 meshctl 工具構建新的 Envoy 過濾器 ................................. 389
14.5.5 部署新的 WebAssembly Envoy 過濾器 ....................................... 391
本章小結 ............................................................................................................... 393
A 自定義 Istio 安裝................................................................394
B Istio 的 sidecar 及其注入選項 ............................................... 401
C Istio 安全——SPIFFE ......................................................... 407
D Istio 故障排查 ....................................................................417
E 如何配置虛擬機接入網格 ..................................................... 425