k8s概念」istio 原理與架構

WHY Istio

當應用被拆分為多個微服務後,進程內的方法調用變成了進程間的遠程調用。引入了對大量服務的連接、管理和監控的複雜性。隨著微服務出現,微服務的連接、管理和監控成為難題

該變化帶來了分佈式系統的一系列問題,例如:

  • 如何找到服務的提供方?
  • 如何保證遠程方法調用的可靠性?
  • 如何保證服務調用的安全性?
  • 如何降低服務調用的延遲?
  • 如何進行端到端的調試?
  • 生產部署中的微服務實例也增加了運維的難度,例如:

  • 如何收集大量微服務的性能指標已進行分析?
  • 如何在不影響上線業務的情況下對微服務進行升級?
  • 如何測試一個微服務集群部署的容錯和穩定性?
  • Istio 提供一種簡單的方式來為已部署的服務建立網絡,該網絡具有負載均衡、服務間認證、監控等功能,而不需要對服務的代碼做任何改動。想要讓服務支持 Istio,只需要在您的環境中部署一個特殊的 sidecar 代理,使用 Istio 控制平面功能配置和管理代理,攔截微服務之間的所有網絡通信:

    • HTTP、gRPC、WebSocket 和 TCP 流量的自動負載均衡。
    • 通過豐富的路由規則、重試、故障轉移和故障注入,可以對流量行為進行細粒度控制。
    • 可插入的策略層和配置 API,支持訪問控制、速率限制和配額。
    • 對出入集群入口和出口中所有流量的自動度量指標、日誌記錄和跟蹤。
    • 通過強大的基於身份的驗證和授權,在集群中實現安全的服務間通信。

    WHAT istio

    一個用來連接、管理和保護微服務的開放平臺

    Istio 有助於降低這些部署的複雜性,並減輕開發團隊的壓力。它是一個完全開源的服務網格,可以透明地分層到現有的分佈式應用程序上。它也是一個平臺,包括允許它集成到任何日誌記錄平臺、遙測或策略系統的 API。Istio 的多樣化功能集使您能夠成功高效地運行分佈式微服務架構,並提供保護、連接和監控微服務的統一方法。

    • 流量管理(Pilot):控制服務之間的流量和API調用的流向,使得調用更靈活可靠,並使網絡在惡劣情況下更加健壯。
    • 可觀察性:過集成zipkin等服務,快速瞭解服務之間的依賴關係,以及它們之間流量的本質和流向,從而提供快速識別問題的能力。
    • 策略執行(mixer):將組織策略應用於服務之間的互動,確保訪問策略得以執行,資源在消費者之間良好分配。策略的更改是通過配置網格而不是修改應用程序代碼。
    • 服務身份和安全(Istio-auth):為網格中的服務提供可驗證身份,並提供保護服務流量的能力,使其可以在不同可信度的網絡上流轉。

    1. istio架構

    Istio 服務網格邏輯上分為數據平面控制平面

  • 數據平面由一組以 sidecar 方式部署的智能代理(Envoy)組成。這些代理可以調節和控制微服務及 Mixer 之間所有的網絡通信。
  • 控制平面負責管理和配置代理來路由流量。此外控制平面配置 Mixer 以實施策略和收集遙測數據。
  • 「kubernetes/k8s概念」istio 原理與架構

    1 Envoy

    Istio 使用 Envoy 代理的擴展版本,Envoy 是以 C++ 開發的高性能代理,用於調解服務網格中所有服務的所有入站和出站流量。Envoy 的許多內置功能被 istio 發揚光大,例如:

  • 動態服務發現
  • 負載均衡
  • TLS 終止
  • HTTP/2 & gRPC 代理
  • 熔斷器
  • 健康檢查、基於百分比流量拆分的灰度發佈
  • 故障注入
  • 豐富的度量指標
  • Envoy 被部署為 sidecar,和對應服務在同一個 Kubernetes pod 中。這允許 Istio 將大量關於流量行為的信號作為屬性提取出來,而這些屬性又可以在 Mixer 中用於執行策略決策,併發送給監控系統,以提供整個網格行為的信息。

    Sidecar 代理模型還可以將 Istio 的功能添加到現有部署中,而無需重新構建或重寫代碼。可以閱讀更多來了解為什麼我們在設計目標中選擇這種方式。

    1.1 手動注入

    istioctl命令更改配置文件

    $ istioctl kube-inject -f <your-app>.yaml -o <your-app-addenvoy>.yaml/<your-app-addenvoy>/<your-app>

    部署應用

    $ kubectl create -f <your-app-addenvoy>.yaml/<your-app-addenvoy>

    1.2 注入後的文件

    Annotation: 標註了這一部署和pod是否已經被注入,被什麼版本注入

    proxy container :容器是envoy代理容器。容器兩個進程,父進程為守護進程傳入啟動參數給子進程。子進程proxy負責轉發流量

    InitContainer: 容器初始化,對iptables做一些配置。使其跳過和proxy進程用戶一致的用戶進程的流量處理,跳過Loopback流量處理,其餘所有流量轉發到15001端口

    Envoy 實現了過濾和路由,並在pilot,mixer協助下服務發現、健康檢查,提供了具有彈性的負載均衡。

    2. 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配置高級管理規則
    「kubernetes/k8s概念」istio 原理與架構

    Pilot Architecture

    4. Citadel

    Citadel 通過內置身份和憑證管理可以提供強大的服務間和最終用戶身份驗證。可用於升級服務網格中未加密的流量,併為運維人員提供基於服務標識而不是網絡控制的強制執行策略的能力。從 0.5 版本開始,Istio 支持基於角色的訪問控制,以控制誰可以訪問您的服務。

    istio安裝

    https://github.com/istio/istio,本文使用1.02版本,安裝沒有auth驗證版本

    kubectl apply -f install/kubernetes/istio-demo.yaml

    「kubernetes/k8s概念」istio 原理與架構

    示例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 個紅色星形圖標來顯示評分信息。
  • 下圖展示了這個應用的端到端架構。

    「kubernetes/k8s概念」istio 原理與架構

    啟動應用:

    運行示例samples/bookinfo/platform/kube目錄中 kubectl apply -f

    「kubernetes/k8s概念」istio 原理與架構

    給應用定義 Ingress gateway:

    運行示例samples/bookinfo/networking目錄中,kubectl apply -f bookinfo-gateway.yaml


    專注於技術熱點大數據,人工智能,JAVA、Python、 C 、GO、Javascript等語言最新前言技術,及業務痛點問題分析,請關注【編程我最懂】共同交流學習。


    分享到:


    相關文章: