Istio架構詳解

Istio架構及其組件概述

Istio 架構總體來說分為控制面和數據面兩部分。
控制面是 Istio 的核心,管理 Istio 的所有功能,主要包括Pilot、Mixer、Citadel等服務組件;
數據面由伴隨每個應用程序部署的代理程序Envoy組成,執行針對應用程序的治理邏輯。常被稱為“Sidecar”。Sidecar 一般和業務容器綁定在一起(在Kubernets中自動注入方式到業務pod中),來劫持業務應用容器的流量,并接受控制面組件的控制,同時會向控制面輸出日志、跟蹤及監控數據。

Istio 的主要組件及其相互關系大致如圖所示(摘自《云原生服務網格Istio》)。

結合上圖我們來理解Istio的各組件的功能及相互之間的協作方式。

1. 自動注入:在創建應用程序時自動注入 Sidecar代理Envoy程序。在 Kubernetes中創建 Pod時,Kube-apiserver調用控制面組件的 Sidecar-Injector服務,自動修改應用程序的描述信息并注入Sidecar。在 真正創建Pod時,在創建業務容器的Pod中同時創建Sidecar容器。
2. 流量攔截:在 Pod 初始化時設置 iptables 規則,基于配置的iptables規則攔截業務容器的Inbound流量和Outbound流量到Sidecar上。而應用程序感知不到Sidecar的存在,還以原本的方式 進行互相訪問。上圖中,流出frontend服務的流量會被 frontend服務側的 Envoy攔截,而當流量到達forecast容器時,Inbound流量被forecast 服務側的Envoy攔截。
3. 服務發現:服務發起方的 Envoy 調用控制面組件 Pilot 的服務發現接口獲取目標服務的實例列表。上圖中,frontend 服務側的 Envoy 通過 Pilot 的服務發現接口得到forecast服務各個實例的地址。
4. 負載均衡:服務發起方的Envoy根據配置的負載均衡策略選擇服務實例,并連接對應的實例地址。上圖中,數據面的各個Envoy從Pilot中獲取forecast服務的負載均衡配置,并執行負載均衡動作。
5. 流量治理:Envoy 從 Pilot 中獲取配置的流量規則,在攔截到 Inbound 流量和Outbound 流量時執行治理邏輯。上圖中, frontend 服務側的 Envoy 從 Pilot 中獲取流量治理規則,并根據該流量治理規則將不同特征的流量分發到forecast服務的v1或v2版本。
6. 訪問安全:在服務間訪問時通過雙方的Envoy進行雙向認證和通道加密,并基于服務的身份進行授權管理。上圖中,Pilot下發安全相關配置,在frontend服務和forecast服務的Envoy上自動加載證書和密鑰來實現雙向認證,其中的證書和密鑰由另一個管理面組件 Citadel維護。
7. 服務監測:在服務間通信時,通信雙方的Envoy都會連接管理面組件Mixer上報訪問數據,并通過Mixer將數據轉發給對應的監控后端。上圖中,frontend服務對forecast服務的訪問監控指標、日志和調用鏈都可以通過這種方式收集到對應的監控后端。
8. 策略執行:在進行服務訪問時,通過Mixer連接后端服務來控制服務間的訪問,判斷對訪問是放行還是拒絕。上圖中,Mixer 后端可以對接一個限流服務對從frontend服務到forecast服務的訪問進行速率控制等操作。
9. 外部訪問:在網格的入口處有一個Envoy扮演入口網關的角 色。上圖中,外部服務通過Gateway訪問入口服務 frontend,對 frontend服務的負載均衡和一些流量治理策略都在這個Gateway上執行。

 

Istio各組件詳解

Istio服務組件有不少,從上面的流程中也基本能看出每個組件如何協作的,下面具體講解每個組件的具體用途和功能。

$ kubectl get svc -n istio-system |grep istio |awk '{print $1}'
istio-citadel
istio-egressgateway
istio-galley
istio-ingressgateway
istio-pilot
istio-policy
istio-sidecar-injector
istio-telemetry
istiod

Pilot

Pilot 是 Istio 的主要控制組件,下發指令控制客戶端。在整個系統中,Pilot 完成以下任務:
• 從 Kubernetes 或者其他平臺的注冊中心獲取服務信息,完成服務發現過程。
• 讀取 Istio 的各項控制配置,在進行轉換之后,將其發給數據面進行實施。

Pilot 將配置內容下發給數據面的 Envoy,Envoy 根據 Pilot 指令,將路由、服務、監聽、集群等定義信息轉換為本地配置,完成控制行為的落地。

Telemetry

Telemetry是專門用于收集監測數據的Mixer服務組件。Istio控制面部署了兩個Mixer組件:istio- telemetry和istio-policy,分別處理監測數據的收集和策略的執行,兩個組件的 Pod 鏡像都是 mixer。
從調用時機上來說,Pilot管理的是配置數據,在配置改變時和數據面交互即可,對于Mixer來說,在服務間交互時Envoy都會對Mixer進行一次調用,因此這是一種實時管理。
如圖所示,當網格中的兩個服務間有調用發生時,服務的代理 Envoy就會上報監測數據給 istio-telemetry 服務組件,istio-telemetry 則根據配置將生成訪問的 Metric等數據分發給后端的監測服務,如Prometheus等。
?

Policy

Policy是另外一個Mixer服務,和Telemetry基本上是完全相同的機制和流程。如圖所示,數據面在轉發服務的請求前調用 istio-policy的Check接口檢查是否允許訪問,把結果返回給Envoy??梢詫尤缗漕~、授權、黑白名單等不同的控制后端,對服務間的訪問進行可擴展的控制。
?

Citadel

Citadel是 Istio的核心安全組件,提供了自動生 成、分發、輪換與撤銷密鑰和證書功能。Citadel一直監聽 Kube- apiserver,以 Secret的形式為每個服務都生成證書密鑰,并在Pod創建時掛載到Pod上,代理容器使用這些文件來做服務身份認證,進而代 理兩端服務實現雙向TLS認證、通道加密、訪問授權等安全功能。如圖 所示,frontend 服 務對 forecast 服務的訪問用到了HTTP方式,通過配置即可對服務增加認證功能,雙方的Envoy會建立雙向認證的TLS通道,從而在服務間啟用雙向認證的HTTPS。
?

Sidecar-injector

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

Proxy

Proxy的運行容器時istio-proxy,容器中除了有Envoy,還有一個pilot-agent的守護進程。
Envoy是用C++開發的非常有影響力的輕量級高性能開源服務代理。作為服務網格的數據面,Envoy提供了動態服務發現、負載均 衡、TLS、HTTP/2 及 gRPC代理、熔斷器、健康檢查、流量拆分、灰度發布、故障注入等功能,本篇描述的大部分治理能力最終都落實到 Envoy的實現上。

在Istio中,規則的描述對象都是類似forecast服務的被訪問者,但是真正的規則執行位置對于不同類型的動作可能不同,可能在被訪問服務的 Sidecar 攔截到 Inbound 流量時執行,也可能在訪問者的Sidecar 攔截到Outbound流量時執行,一般后者居多。當給forecast服務定義流量規則時,所有訪問forecast服務的Sidecar都收到規則,并且執行相同的治理邏輯,從而對目標服務執行一致的治理。下表列出了常用的服務訪問治理規則和其執行位置。 

?

 

Ingressgateway

Ingressgateway 就是入口處的 Gateway,從網格外訪問網格內的服務就是通過這個Gateway進行的。istio-ingressgateway是一個Loadbalancer類型的Service,不同于其他服務組件只有一兩個端 口,istio-ingressgateway 開放了一組端口,這些就是網格內服務的外部訪問端口。如下圖所示,網格入口網關istio-ingressgateway的負載和網格內的Sidecar是同樣的執行流程,也和網格內的其他 Sidecar一樣從 Pilot處接收流量規則并執行。
?

 

 

其他組件

除了以“istio”為前綴的Istio自有組件,在集群中一般還安裝Jaeger-agent、Jaeger-collector、Jaeger-query、Kiali、Prometheus、Grafana、 Tracing、Zipkin等組件,這些組件提供了Istio的調用鏈、監控等功能,可以選擇安裝來完成完整的服務監控管理功能。

 

posted @ 2020-04-29 15:55  璩陽何月  閱讀(...)  評論(...編輯  收藏
全民捕鱼游戏怎么玩