Istio 1.5 发布——拥抱变化,爱上单体
北京時間 2020 年 3 月 6 日凌晨,我們期待已久的 Istio 1.5 發(fā)布了,發(fā)布公告見?https://istio.io/news/releases/1.5.x/announcing-1.5/。由 ServiceMesher 社區(qū)組織翻譯的 Istio 官方文檔同時發(fā)布,見 https://istio.io/zh。
Istio 1.5 是一個具有重大變革的版本。長久以來,面對社區(qū)對 Istio 的性能和易用性的詬病,Istio 團隊終于正視自身的問題,在當(dāng)前版本中徹底推翻了原有控制平面的架構(gòu),完成了重建。正如 Simplified Istio 文中所說:
復(fù)雜是萬惡之源,讓我們停止焦慮,愛上單體。
Istio 1.5 回歸單體,無論架構(gòu)和使用方式都發(fā)生了巨大變化。因此筆者決定對 1.5 的變化內(nèi)容做深入解讀,以便開發(fā)者可以更好的理解和學(xué)習(xí)新版本,為使用和升級提供參考。
架構(gòu)調(diào)整
這部分主要分析 Istio 1.5 在架構(gòu)上的調(diào)整,這也是該版本最核心的變化。主要包括重建了控制平面,將原有的多個組件整合為一個單體結(jié)構(gòu) istiod;同時廢棄了被詬病已久的 Mixer 組件。還對是否向后兼容的部分也做了說明,如果你要從 1.4.x 版本升級到 1.5 必須知道這些變化。
重建控制平面
官方使用的是重建(Restructuring)而不是重構(gòu)(Refactoring)一詞,可見其變化之大。在 Istio 1.5 中,控制平面將使用新的部署模式,將原有的各個組件整合在一起。
Istiod
Istio 1.5 中會使用一個全新的部署模式:istiod。這個組件是控制平面的核心,負責(zé)處理配置、證書分發(fā)、sidecar 注入等各種功能。istiod 是新版本中最大的變化,以一個單體組件替代了原有的架構(gòu),在降低復(fù)雜度和維護難度的同時,也讓易用性得到提升。需要注意的一點是,原有的多組件并不是被完全移除,而是在重構(gòu)后以模塊的形式整合在一起組成了 istiod。
Sidecar 注入
以前版本的 sidecar 注入是由 istio-sidecar-injector webhook 實現(xiàn)的。在新版本中 webhook 保留了下來,但整合進了 istiod 中,注入邏輯保持不變。
Galley
配置驗證 - 功能保留,并入 istiod。
MCP Server - 改為默認(rèn)關(guān)閉。對于大多數(shù)用戶來說只是一個實現(xiàn)細節(jié)。如果確定依賴它,需要部署 istio-galley 并啟動其進程。
實驗特性(例如配置分析)- 也需要部署 istio-galley。
Citadel
以前 Citadel 的 2 個功能是生成證書以及 SDS 開啟時以 gRPC 方式向 nodeagent 提供密鑰。1.5 版本中密鑰不再寫入每個命名空間,只通過 gRPC 提供。這一功能也被并入 istiod。
SDS 節(jié)點代理
nodeagent 被移除。
Sidecar
以前,sidecar 能以兩種方式訪問證書:以文件掛載的密鑰;SDS。新版本中所有密鑰都存在本地運行的 SDS 服務(wù)器上。對絕大部分用戶來說只需要從 istiod 中獲取。對于自定義 CA 的用戶,仍然可以掛載文件密鑰,不過仍然由本地 SDS 服務(wù)器提供。這意味著證書輪詢將不再需要 Envoy 重啟。
CNI
CNI 沒有改變,仍在 istio-cni 中。
Pilot
istio-pilot 的獨立組件和進程被移除,由包含了它全部功能的 istiod 取而代之。為了向后兼容,仍有少許對 Pilot 的引用。
廢棄 Mixer
在 Istio 1.5 中 Mixer 被廢棄了。默認(rèn)情況下 mixer 完全關(guān)閉。遙測的 V2 版本在新版本中是默認(rèn)特性且不需要 mixer。如果你對 Mixer 的特殊功能有依賴,比如進程外適配器,需要重新開啟 Mixer。Mixer 還會持續(xù)修復(fù) bug 和安全漏洞直到 Istio 1.7 版本。mixer 的許多功能在 Mixer Deprecation 文檔中都描述了替代方案,包括基于 Wasm sandbox API 的 in-proxy 擴展.
新版本中 HTTP 遙測默認(rèn)基于 in-proxy Stats filter。這節(jié)省了 50% 的 CPU 使用量。1.5 中的遙測 V2 和老版本主要有以下幾點不同:
流量的源和目標(biāo)如果沒有注入 sidecar,部分遙測信息將無法收集。
Egress 遙測不再支持。
Histogram bucketization 和 V1 版本有很大不同。
TCP 遙測只支持 mTLS。
需要更多的 Prometheus 實例來伺服所有的代理。
如果開發(fā)者之前使用的是 Istio 默認(rèn)的 HTTP 遙測,遷移到新版本是沒問題的。可以直接通過 istioctl upgrade 自動升級到 V2。
最被社區(qū)開發(fā)者唾棄的 Mixer 終于被廢棄,可以說它是影響老版本性能的罪魁禍?zhǔn)住,F(xiàn)在皆大歡喜,甚至呼聲最高的 Wasm 方案也提上日程。當(dāng)然我們也能看出 Istio 團隊為了保證老版本的升級依賴并沒有一刀切的干掉 Mixer,持續(xù)修復(fù) bug 到 1.7 版本的深層含義是它會在 1.7 的時候被徹底移除?
控制平面安全
老版本中,當(dāng)設(shè)置了 values.global.controlPlaneSecurityEnabled=true 時,代理將安全地與控制平面交互,這是 1.4 版本的默認(rèn)配置。每個控制平面組件都有一個帶有 Citadel 證書的 sidecar,代理通過端口 15011 連接到 Pilot。
新版本中,不再推薦或以默認(rèn)方式將代理連接到控制平面。作為替代,使用由 Kubernetes 或 Istiod 簽發(fā)的 DNS 證書。代理通過端口 15012 連接到 Pilot。
功能更新
Istio 1.5 不僅僅做了減法,也做了很多加法,包括添加了新的功能,性能優(yōu)化和 Bug 修復(fù)。這一部分列舉了新版本中在流量管理、安全、遙測等多個功能方面的改進。
流量管理
提升了 ServiceEntry 的性能。
修復(fù)了 readiness 探針不一致問題。
通過定向局部更新的方式改善了配置更新的性能。
添加了為 host 設(shè)置所在負載均衡器設(shè)置的選項。
修復(fù)了 Pod 崩潰會觸發(fā)過度配置推送的問題。
修復(fù)了應(yīng)用調(diào)用自己的問題。
添加了使用 Istio CNI 時對 iptables 的探測。
添加了 consecutive_5xx 和 gateway_errors 作為離群值探測選項。
提升了 EnvoyFilter 匹配性能優(yōu)化。
添加了對 HTTP_PROXY 協(xié)議的支持。
改進了 iptables 設(shè)置,默認(rèn)使用 iptables-restore。
默認(rèn)開啟自動協(xié)議探測。
安全
添加 Beta 認(rèn)證 API。新 API 分為 PeerAuthentication 和 RequestAuthenticaiton,面向工作負載。
添加認(rèn)證策略,支持 deny 操作和語義排除。
Beta 版本默認(rèn)開啟自動 mTLS。
穩(wěn)定版添加 SDS。
Node agent 和 Pilot agent 合并,移除了 Pod 安全策略的需要,提升了安全性。
合并 Citadel 證書發(fā)放功能到 Pilot。
支持 Kubernetes first-party-jwt 作為集群中 CSR 認(rèn)證的備用 token。
通過 Istio Agent 向 Prometheus 提供密鑰和證書。
支持 Citadel 提供證書給控制平面。
遙測
為 v2 版本的遙測添加 TCP 協(xié)議支持。
在指標(biāo)和日志中支持添加 gRPC 響應(yīng)狀態(tài)碼。
支持 Istio Canonical Service
改進 v2 遙測流程的穩(wěn)定性。
為 v2 遙測的可配置性提供 alpha 級別的支持。
支持在 Envoy 節(jié)點的元數(shù)據(jù)中添加 AWS 平臺的元數(shù)據(jù)。
更新了 Mixer 的 Stackdriver 適配器,以支持可配置的刷新間隔來跟蹤數(shù)據(jù)。
支持對 Jaeger 插件的 headless 收集服務(wù)。
修復(fù)了 kubernetesenv 適配器以提供對名字中有.的 Pod 的支持。
改進了 Fluentd 適配器,在導(dǎo)出的時間戳中提供毫秒級輸出。
Operator
用 IstioOperator API 替代了 IstioControlPlane API。
添加了 istioctl operator init 和 istioctl operator remove 命令。
添加緩存改善了調(diào)和速度。
性能和擴展性
為網(wǎng)關(guān)生成集群時忽略沒用的服務(wù)。
為 headless 服務(wù)略過調(diào)用 updateEDS。
在 ingress 網(wǎng)關(guān)中默認(rèn)關(guān)閉 SNI-DNAT 。
錯誤覆蓋聲明。
容量已知時,基于容量創(chuàng)建切片。
測試和發(fā)布
為 istioctl 創(chuàng)建了Docker鏡像。
istioctl
添加 mTLS 分析器。
添加 JwtAnalyzer。
添加 ServiceAssociationAnalyzer。
添加 SercretAnalyaer。
添加 sidecar ImageAnalyzer。
添加 PortNameAnalyzer。
添加 Policy DeprecatedAnalyzer。
為 RequestAuthentication 添加了更多的驗證規(guī)則。
istioctl analyze 從實驗特性轉(zhuǎn)為正式特性。
添加新標(biāo)記 -A|--all-namespaces 給 istioctl analyze,來分析整個集群。
添加通過 stdin 到 istioctl analyze 的內(nèi)容分析。
添加 istioctl analyze -L 顯示所有可用分析列表。
添加從 istioctl analyze 抑制信息的能力。
為 istioctl analyze 添加結(jié)構(gòu)化格式選項。
為 istioctl analyze 的輸出添加對應(yīng)的文檔鏈接。
通過 Istio API 在分析器中提供標(biāo)注方法。
istioctl analyze 可以基于目錄加載文件。
istioctl analyze 嘗試將消息與它們的源文件名關(guān)聯(lián)。
istioctl analyze 可打印命名空間。
istioctl analyze 默認(rèn)分析集群內(nèi)資源。
修復(fù)分析器抑制集群級別資源消息的 bug。
為 istioctl manifest 添加多文件支持。
替換 IstioControlPlane API 為 IstioOperator API。
為 istioctl dashboard 添加選擇器.
為 istioctl manifest --set 標(biāo)記添加切片和列表支持。
總結(jié)
Istio 1.5 是全面擁抱變化的一個版本。重建整個控制平面,打造了全新的部署模式 istiod;摒棄了拖累系統(tǒng)性能的 Mixer;保證兼容性也不忘持續(xù)優(yōu)化和引入新的功能。在徹底拋棄歷史包袱的同時,Istio團隊也用他們的勇氣踐行了敏捷開發(fā)的真諦。隨著穩(wěn)定的季度發(fā)布,相信未來的 Istio 會越加成熟。讓我們拭目以待。
?推薦閱讀?
Service Mesh 通用數(shù)據(jù)平面 API(UDPA)最新進展深度介紹
Istio Handbook 重啟寫作邀請
使用了 Service Mesh 后我還需要 API 網(wǎng)關(guān)嗎?
Service Mesh 終端用戶調(diào)查報告
螞蟻金服 Service Mesh 技術(shù)風(fēng)險思考和實踐
回歸單體 —— Istio的自我救贖?
總結(jié)
以上是生活随笔為你收集整理的Istio 1.5 发布——拥抱变化,爱上单体的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core开发实战(第18课:日
- 下一篇: 业务模块化打造单体和分布式部署同步支持方