Istio 相關組件介紹istio-citadel、istio-pilot、istio-galley、istio-policy...

1.1 Istio 是什麼

我們嘗試用迭代方式來說明:

  • Istio 是 用於服務治理 的開放平臺
  • Istio 是 Service Mash形態 的用於服務治理的開放平臺
  • Istio 是一個與 Kubernetes緊密結合 的 適用於雲原生場景的 Service Mash 形態的 用於服務治理的開放平臺。這裏的治理 不侷限於微服務治理,任何服務,只要服務間有訪問,如果需要對服務間的訪問進行管理,就可以使用Istio。根據Isio官方介紹,服務治理及連接(connect)、安全(secret)、策略執行(control)和可觀察性(observe)。
  • 連接:Istio 通過集中配置的流量規則控制服務間的流量和調用,實現負載均衡、熔斷、故障注入、重試、定向等服務治理功能。
  • 安全:Istio 通過透明的認證機制、通道加密、服務訪問權限等安全能力,可增強服務訪問的安全性。
  • 策略執行:Istio 通過可動態插拔、可擴展的策略實現訪問控制、速率限制、額配管理、服務計費等能力。
  • 可觀察性:動態獲取服務運行數據和輸出,提供強大的調用鏈、監控和調用日誌收集輸出的能力。配合可視化工具,可方便運維人員瞭解服務的運行狀態,發現並解決問題。

1.2 Istio 提供的重要能力:

  • 服務運行可觀察性:監控應用及網絡相關數據,將相關指標與日誌記錄發生至任意收集、聚合與查詢系統中意實現功能擴展,追蹤分析性能熱點並對分佈式故障模式進行診斷。
  • 彈性效率:提供了統一的方法配置重試、負載均衡、流量控制和斷路器等來解決網絡可靠性低所造成的各類常見故障,更輕鬆地運維高彈性服務網格。
  • 研發人員生產力:確保研發人員專注於基於已選擇的編程語言構建業務能力,不用在代碼中處理分佈式系統問題,從而極大地提升生產能力。
  • 策略驅動型運營:解耦開放和運維團隊的工作,在無須更改代碼的前提下提升安全性、監控能力、擴展性與服務拓撲水平。運營人員能夠不依賴開發提供的能力精確控制生產水平。
  • 默認安全:允許運維人員配置TLS雙向認證,並保護各服務之間的所有通信,並且開發人員與運維人員不用維護證書,以應對分佈式計算中經常存在的大量網絡安全問題。
  • 增量適用:考慮到在網絡內運行的各類服務的透明性,允許團隊按照自己的節奏和需求逐步使用各項功能,例如先觀察服務運行情況再進行服務治理等。

1.3 通過示例看看Istio 做了什麼

首先來看下Istio在服務訪問過程中做了什麼。一個簡單的Client訪問Server,對兩者使用開發語言沒有任何要求,可以是Client採用node.js編寫,server採用java編寫。在Client中訪問服務server,在兩個程序中不用包含任何服務訪問管理的邏輯。

來看看Istio在其中做了什麼:

  • 自動通過服務發現獲取server服務實例的列表,並根據負載均衡策略選擇一個服務實例。
  • 對服務雙方啓用雙向認證和通道加密。
  • 如果某個服務實例連續訪問出錯,則可以自動將該實例隔離一段時間,以提高訪問質量。
  • 設置最大連接數、最大請求數、訪問超時等對服務進行保護。
  • 限流。
  • 對請求進行重試。
  • 修改請求中的內容。
  • 將一定特徵的服務重定向。
  • 灰度發佈
  • 自動記錄服務訪問信息。
  • 記錄調用鏈,進行分佈式追蹤。
  • 根據訪問數據形成完整的應用訪問拓撲。

所有這些功能,都不用用戶修改代碼,用戶只需要在Istio 的控制面做些配置即可,並且動態生效。以灰度測試爲例,在Istio中通過簡單配置實現灰度發佈,核心是實現兩個版本同時在線,並通過一定的流量策略將部分流量引流到新版本上。無須改動代碼,只需要簡單的一個配置即可:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: server
spec:
  hoste:
  - server
  http:
  - match:
    - headers:
      cookie:
        exact: "group=dev"
    route:
    - destination:
      name: v2
  - route:
    - destination:
      name: va    

將group爲dev的流量轉發到server的v2版本,其他用戶訪問的還是v1,從而實現灰度發佈。整個過程中除了Istio配置需要修改,其他不需要做任何事情。

1.4 組件介紹

在集羣中通過“kubectl get svc -n istio-system” 獲取isto 的各組件

NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                                                                      AGE
grafana                  ClusterIP      10.109.18.105    <none>        3000/TCP                                                                                                                     46h
istio-citadel            ClusterIP      10.97.247.24     <none>        8060/TCP,15014/TCP                                                                                                           46h
istio-egressgateway      ClusterIP      10.106.34.148    <none>        80/TCP,443/TCP,15443/TCP                                                                                                     46h
istio-galley             ClusterIP      10.103.74.254    <none>        443/TCP,15014/TCP,9901/TCP,15019/TCP                                                                                         46h
istio-ingressgateway     LoadBalancer   10.99.94.178     localhost     15020:30397/TCP,80:32621/TCP,443:32749/TCP,15029:31666/TCP,15030:32662/TCP,15031:30400/TCP,15032:32139/TCP,15443:32435/TCP   46h
istio-pilot              ClusterIP      10.98.146.59     <none>        15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                       46h
istio-policy             ClusterIP      10.109.93.7      <none>        9091/TCP,15004/TCP,15014/TCP                                                                                                 46h
istio-sidecar-injector   ClusterIP      10.100.143.27    <none>        443/TCP                                                                                                                      46h
istio-telemetry          ClusterIP      10.110.99.43     <none>        9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                       46h
jaeger-agent             ClusterIP      None             <none>        5775/UDP,6831/UDP,6832/UDP                                                                                                   46h
jaeger-collector         ClusterIP      10.108.7.167     <none>        14267/TCP,14268/TCP,14250/TCP                                                                                                46h
jaeger-query             ClusterIP      10.107.85.181    <none>        16686/TCP                                                                                                                    46h
kiali                    ClusterIP      10.103.150.239   <none>        20001/TCP                                                                                                                    46h
prometheus               ClusterIP      10.110.122.226   <none>        9090/TCP                                                                                                                     46h
tracing                  ClusterIP      10.105.32.84     <none>        80/TCP                                                                                                                       46h
zipkin                   ClusterIP      10.107.56.80     <none>        9411/TCP                                                                                                                     46h

1、istio-pilot

pilot 是Istio 的控制中心,下發指令控制完成作業。Pilot 直接從平臺提取數據並將構建和轉換成Istio 的服務發現模型。因此Pilot只有服務發現功能,而無服務註冊功能。這種抽象框架解耦了Pilot和底層平臺的不同實現,可支持kubernetes、Consul等平臺。
除了服務發現,Pilot更重要的一個功能是向數據面下發規則,包括VirtualService、DestinationRule、Gateway、ServiceEntry等流量治理規則,也包括認證授權等安全機制。Pilot負責將各種規則轉換成Envoy可識別的格式,通過標準的xDS協議發送給Envoy,指導Envoy完成動作。在通信上Envoy通過gRPC流式訂閱Pilot的配置資源。例如Pilot將VirtualService表達的路由規則分發到Envoy上,Envoy將根據該路由規則進行流量轉發。

2、telemetry

telemetry是專門用於收集遙測數據的Mixer服務組件,如服務列表所示,在部署上,Istio 控制面部署了兩個Mixer組件:telemetry和policy,分別處理遙測數據的收集和策略的執行。查看兩個組件的Pod鏡像會發現,容器的鏡像是一樣的,都是“/istio/mixer”。
Mixer 是Istio獨有的一種設計,不同於Pilot,在其他平臺上總能找到類似功能的服務組件。從調用時機來說,Pilot管理的是配置數據,在配置改變時和數據面交互即可;然而,對於Mixer來說,在服務間交互時Envoy都會對Mixer進行一次調用,因此這是一種實時管理。當然,通過在Mixer和Proxy上使用緩存機制,可保證不用每次進行數據請求時都和Mixer交互。
當網絡中的兩個服務間有交互發生時,服務的代理Envoy就會上報遙測數據給telemetry 服務組件。telemetry服務組件根據配置將生成訪問Mixer等數據分發給後端的遙測服務。數據面代理通過report 接口上報數據時訪問數據會被批量上報。
在架構上,Mixer 作爲中介來解耦數據面和不同後端的對接,以提供靈活性和擴展能力。運維人員可以動態配置各種遙測後端,來收集指定的服務運行數據。

3、policy

policy 時另外一個Mixer服務,和telemetry基本上是完全相同的機制和流程。數據面在轉發服務的請求前,調用policy的Check接口檢查是否允許訪問。Mixer根據配置將請求轉發到對應的Adapter做對應檢查,給代理返回允許訪問還是拒絕。可以對接如 配額、授權、黑白名單等不同的控制後端,對服務間的訪問進行可擴展的控制。

4、citadel

citadel是Istio的核心安全組件,提供了自動生成、分發、輪換與撤銷祕鑰和證書功能。Citadel一直監聽kube-apiserver。以secret的形式對每個服務都生成證書祕鑰,並在Pod創建時掛載到Pod上,代理容器使用這些文件來做服務身份認證,進而代替兩端服務的雙向TLS認證、通道加密、訪問授權等安全問題功能,這樣用戶就不用再代碼裏面維護證書祕鑰了。例如兩個服務之間採用HTTP進行通信,通過配置即可對服務增加認證功能,雙方的Envoy會建立雙向認證的TLS通道,從而在服務間啓用雙向認證的HTTPS。

5、galley

galley並不直接向數據面提供業務能力,而是在控制面上向其他組件提供支持。galley作爲負責配置管理的組件,驗證配置信息的格式和內容的正確性,並將這些配置信息提供給管理面的Pilot和Mixer服務使用,這樣其他的管理組件只用和galley打交道,從而與底層平臺解耦。在新的版本中galley的作用越來越重要。

6、sidecar-injector

sidecar-injector 是負責自動自動注入的組件,只要開啓自動注入,在Pod創建時就會自動調用istio-sidecar-injector 向Pod中注入Sidecar 容器。
在kubernetes環境中,根據自動注入配置,Kube-apiserver 在攔截到Pod創建的請求時,會調用自動注入服務istio-sidecar-injector 生成Sidecar容器描述並將其插入原Pod的定義中,這樣,在創建的Pod內除了包括業務容器,還包括Sidecar容器。這個注入過程對用戶透明,用戶使用原始的方式創建工作負載。

7、Istio-Proxy

在很多和Istio相關的地方,會將Envoy、Sidecar、Proxy等術語有時是混着用的,都表示Istio數據面的輕量代理。但關注Pod詳細信息,會發現這個容器的正式名稱是istio-proxy,不是通用的Envoy鏡像,而是疊加了Istio的Proxy功能的一個擴展版本。另外,在istio-proxy容器中除了有Envoy外還有一個Pilot-agent的守護進程。未來如果能在istio-proxy 中提供Mixer的部分能力,將會是一個非常緊湊的設計。
Envoy是用C++開發的非常有影響力的輕量級高性能開源服務代理。作爲服務網格的數據面,Envoy提供了動態服務發現、負載均衡、TLS、HTTP/2及gRPC代理、熔斷器、健康檢查、流量拆分、灰度發佈、故障注入等功能,istio描述的大部分自治能力最終都落實到Envoy的實現上。
在Istio中,規則被描述的對象都是被訪問者,但是真正的規則執行位置,對於不同的類型的動作可能不同,可能在被訪問服務的Sidecar攔截到Inbound流量時,或是在訪問者的Sidecar攔截到outbound流量時執行,一般後者居多。當給一個服務定義流量規則時,所有訪問該服務的Sidecar都收到規則,並且執行相同的治理邏輯,從而對目標服務執行一致的治理。下面列出常用的服務治理規則和其執行位置。

治理規則 治理位置:服務發起方 治理位置:服務發起方
路由管理 *
負載均衡 *
調用鏈分析 * *
服務認證 * *
遙測數據 * *
重試 *
重寫 *
重定向 *
鑑權 *

8、Ingressgateway

ingressgateway 就是入口處的Gateway,從網絡外訪問網格內的服務就是通過這個Gateway進行的。ingressgateway比較特別的是,是一個LoadBalance類型的Service,不同於其他服務組件只有一兩個端口,ingressgateway開發了一組端口,這些就是網格內服務的外部訪問端口。網格入口網關ingressgateway的負載和網格內的Sidecar是同樣的執行體,也和網格內的其他Sidecar一樣從Pilot接收流量規則並執行。因爲入口處的流量都走這個服務,會有較大的併發可能出現流量峯值,所有需要評估流量來規劃和實例數。Istio通過一個特有的資源對象Gateway來配置和對外的協議、端口等。

9、其他組件

除了以“Istio” 爲前綴的以上幾個Istio自有組件,在集羣中一般還安裝了jaeger-agent、jaeger-collector、jaeger-query、Kiail、Prometheus、Tracing、ZIPkin組件,這些組件提供了Istio調用鏈、監控等功能,可以選擇安裝來完成完整的服務監控管理功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章