WHY Istio
當應用被拆分為多個微服務後,程序內的方法呼叫變成了程序間的遠端呼叫。引入了對大量服務的連線、管理和監控的複雜性。隨著微服務出現,微服務的連線、管理和監控成為難題
該變化帶來了分散式系統的一系列問題,例如:
如何找到服務的提供方?如何保證遠端方法呼叫的可靠性?如何保證服務呼叫的安全性?如何降低服務呼叫的延遲?如何進行端到端的除錯?生產部署中的微服務例項也增加了運維的難度,例如:
如何收集大量微服務的效能指標已進行分析?如何在不影響上線業務的情況下對微服務進行升級?如何測試一個微服務叢集部署的容錯和穩定性?HTTP、gRPC、WebSocket 和 TCP 流量的自動負載均衡。通過豐富的路由規則、重試、故障轉移和故障注入,可以對流量行為進行細粒度控制。可插入的策略層和配置 API,支援訪問控制、速率限制和配額。對出入叢集入口和出口中所有流量的自動度量指標、日誌記錄和跟蹤。通過強大的基於身份的驗證和授權,在叢集中實現安全的服務間通訊。WHAT istioIstio 提供一種簡單的方式來為已部署的服務建立網路,該網路具有負載均衡、服務間認證、監控等功能,而不需要對服務的程式碼做任何改動。想要讓服務支援 Istio,只需要在您的環境中部署一個特殊的 sidecar 代理,使用 Istio 控制平面功能配置和管理代理,攔截微服務之間的所有網路通訊:
一個用來連線、管理和保護微服務的開放平臺
流量管理(Pilot):控制服務之間的流量和API呼叫的流向,使得呼叫更靈活可靠,並使網路在惡劣情況下更加健壯。可觀察性:過整合zipkin等服務,快速了解服務之間的依賴關係,以及它們之間流量的本質和流向,從而提供快速識別問題的能力。策略執行(mixer):將組織策略應用於服務之間的互動,確保訪問策略得以執行,資源在消費者之間良好分配。策略的更改是通過配置網格而不是修改應用程式程式碼。服務身份和安全(Istio-auth):為網格中的服務提供可驗證身份,並提供保護服務流量的能力,使其可以在不同可信度的網路上流轉。1. istio架構Istio 有助於降低這些部署的複雜性,並減輕開發團隊的壓力。它是一個完全開源的服務網格,可以透明地分層到現有的分散式應用程式上。它也是一個平臺,包括允許它整合到任何日誌記錄平臺、遙測或策略系統的 API。Istio 的多樣化功能集使您能夠成功高效地執行分散式微服務架構,並提供保護、連線和監控微服務的統一方法。
Istio 服務網格邏輯上分為資料平面和控制平面。
資料平面由一組以 sidecar 方式部署的智慧代理(Envoy)組成。這些代理可以調節和控制微服務及 Mixer 之間所有的網路通訊。控制平面負責管理和配置代理來路由流量。此外控制平面配置 Mixer 以實施策略和收集遙測資料。1 Envoy
Istio 使用 Envoy 代理的擴充套件版本,Envoy 是以 C++ 開發的高效能代理,用於調解服務網格中所有服務的所有入站和出站流量。Envoy 的許多內建功能被 istio 發揚光大,例如:
動態服務發現負載均衡TLS 終止HTTP/2 & gRPC 代理熔斷器健康檢查、基於百分比流量拆分的灰度釋出故障注入豐富的度量指標1.1 手動注入Envoy 被部署為 sidecar,和對應服務在同一個 Kubernetes pod 中。這允許 Istio 將大量關於流量行為的訊號作為屬性提取出來,而這些屬性又可以在 Mixer 中用於執行策略決策,併發送給監控系統,以提供整個網格行為的資訊。
Sidecar 代理模型還可以將 Istio 的功能新增到現有部署中,而無需重新構建或重寫程式碼。可以閱讀更多來了解為什麼我們在設計目標中選擇這種方式。
1.2 注入後的檔案istioctl命令更改配置檔案
$ istioctl kube-inject -f <your-app>.yaml -o <your-app-addEnvoy>.yaml
部署應用
$ kubectl create -f <your-app-addEnvoy>.yaml
2. MixerAnnotation: 標註了這一部署和pod是否已經被注入,被什麼版本注入
InitContainer: 容器初始化,對iptables做一些配置。使其跳過和proxy程序使用者一致的使用者程序的流量處理,跳過Loopback流量處理,其餘所有流量轉發到15001埠
Envoy 實現了過濾和路由,並在pilot,mixer協助下服務發現、健康檢查,提供了具有彈性的負載均衡。
Mixer 是一個獨立於平臺的元件,負責在服務網格上執行訪問控制和使用策略,並從 Envoy 代理和其他服務收集遙測資料。代理提取請求級屬性,傳送到 Mixer 進行評估。有關屬性提取和策略評估的更多資訊,請參見 Mixer 配置。
Mixer 中包括一個靈活的外掛模型,使其能夠接入到各種主機環境和基礎設施後端,從這些細節中抽象出 Envoy 代理和 Istio 管理的服務。
3. Pilot控制面中負責流量管理的元件為Pilot
Pilot 為 Envoy sidecar 提供服務發現功能,為智慧路由(例如 A/B 測試、金絲雀部署等)和彈性(超時、重試、熔斷器等)提供流量管理功能。它將控制流量行為的高階路由規則轉換為特定於 Envoy 的配置,並在執行時將它們傳播到 sidecar。
Pilot 將平臺特定的服務發現機制抽象化並將其合成為符合 Envoy 資料平面 API 的任何 sidecar 都可以使用的標準格式。這種鬆散耦合使得 Istio 能夠在多種環境下執行(例如,Kubernetes、Consul、Nomad),同時保持用於流量管理的相同操作介面。
Platform Adapter: 平臺介面卡。針對多種叢集管理平臺實現的控制器,得到API server的DNS服務註冊資訊(即service名與podIP的對應表)、入口資源以及儲存流量管理規則的第三方資源Abstract Model:維護了envoy中對service的規範表示。接收上層獲取的service資訊轉化為規範模型Envoy API:下發服務發現、流量規則到envoy上Rules API:由運維人員管理。可通過API配置高階管理規則Pilot Architecture
4. CitadelCitadel 通過內建身份和憑證管理可以提供強大的服務間和終端使用者身份驗證。可用於升級服務網格中未加密的流量,併為運維人員提供基於服務標識而不是網路控制的強制執行策略的能力。從 0.5 版本開始,Istio 支援基於角色的訪問控制,以控制誰可以訪問您的服務。
istio安裝https://github.com/istio/istio,本文使用1.02版本,安裝沒有auth驗證版本
kubectl apply -f install/kubernetes/istio-demo.yaml
示例Bookinfo 應用部署一個樣例應用,它由四個單獨的微服務構成,用來演示多種 Istio 特性。這個應用模仿線上書店的一個分類,顯示一本書的資訊。頁面上會顯示一本書的描述,書籍的細節(ISBN、頁數等),以及關於這本書的一些評論。
Bookinfo 應用分為四個單獨的微服務:productpage :productpage 微服務會呼叫 details 和 reviews 兩個微服務,用來生成頁面。details :這個微服務包含了書籍的資訊。reviews :這個微服務包含了書籍相關的評論。它還會呼叫 ratings 微服務。ratings :ratings 微服務中包含了由書籍評價組成的評級資訊。reviews 微服務有 3 個版本:
v1 版本不會呼叫 ratings 服務。v2 版本會呼叫 ratings 服務,並使用 1 到 5 個黑色星形圖示來顯示評分資訊。v3 版本會呼叫 ratings 服務,並使用 1 到 5 個紅色星形圖示來顯示評分資訊。下圖展示了這個應用的端到端架構。
啟動應用:執行示例samples/bookinfo/platform/kube目錄中 kubectl apply -f <(istioctl kube-inject -f bookinfo.yaml),結果如下:
給應用定義 Ingress gateway:執行示例samples/bookinfo/networking目錄中,kubectl apply -f bookinfo-gateway.yaml