Istio架构剖析
Istio 主要作用
從官網首頁可以看到,Istio主要的四大作用就是連接、安全、控制和觀察:
流量管理、負載均衡、灰度發布
認證、鑒權
限流、ACL
監控、調用鏈
Istio是一個開源的服務網格,可為分布式微服務架構提供所需的基礎運行和管理要素。
隨著各組織越來越多地采用云平臺,開發者必須使用微服務設計架構以實現可移植性,而運維人員必須管理包含混合云部署和多云部署的大型分布式應用。
Istio采用一種一致的方式來保護、連接和監控微服務,降低了管理微服務部署的復雜性。
Istio概念
在Service Mesh中,我們需要了解Data Plane和Control Plane兩個概念:
- Data Plane:作用是處理網格內服務間的通信,并完成服務發現、負載均衡、流量管理、健康檢查等功能;
- Control Plane:作用是管理和配置智能代理用于路由流量,同時配置Mixers來應用策略、收集指標。
Istio核心組件
Istio可視化管理組件
架構圖:
從架構設計上來看,Istio服務網格在邏輯上分為控制平面和數據平面兩部分。
Istio的控制平面主要負責:
- 接收用戶配置
- 生成路由規則
- 分發路由規則到代理
- 分發策略
- 遙測數據收集
Istio的數據平面主要負責:
- 流量轉發
- 策略實施
- 遙測數據上報
用戶通過控制平面提供的API提交路由配置規則、策略配置規則與遙測數據收集的配置規則。
Pilot把用戶提交的配置規則轉換成智能代理需要的配置形式,推送給智能代理。
智能代理根據用戶的配置來執行服務路由、遙測數據收集與服務訪問策略。
智能代理攔截服務所有流量,并與其他智能代理通信。
控制平面
控制平面中主要包括Mixer、Pilot、Citadel部件。
1.1:Mixer
Mixer是一個與平臺無關的組件。
Mixer負責在服務網絡中實施訪問控制和策略,并負責從Envoy代理和其他服務上收集遙測數據。
代理提取請求級別的屬性并發送到Mixer用于評估,評估請求是否能放行。
Mixer有一個靈活的插件模型。這個模型使得Istio可以與多種主機環境和后端基礎設施對接。因此,Istio從這些細節中抽象了Envoy代理和Istio管理的服務。
1.2: Mixer架構圖
在每一個請求過程中,Envoy代理會在請求之前調用Mixer組件進行前置條件檢查,在請求結束之后上報遙測數據給Mixer組件。
為了提高性能,每個Envoy代理都會提前緩存大量前置條件檢查規則,當需要進行前置條件檢查時,直接在緩存中檢查規則。
如果本地緩存中沒有需要的規則,再去調用Mixer組件獲取規則。
Mixer組件也有自己的緩存,以加速前置條件檢查。需要上報的遙測數據也會被Envoy代理暫時緩存起來,等待時機上報Mixer組件,從而減少上報數據的調用次數。
2.1: Pilot
Pilot為Envoy代理提供:
- 服務發現功能
- 智能路由功能(例如:A/B測試、金絲雀發布等)
- 彈性功能(例如:超時、重試、熔斷器等)。
Pilot將高級別的控制流量行為的路由策略轉換為Envoy格式的配置形式,并在運行時分發給Envoy代理。
Pilot抽象了平臺相關的服務發現機制,并轉換成Envoy數據平面支持的標準格式。
這種松耦合設計使得Istio能運行在多平臺環境,并保持一致的流量管理接口。
2.2: Pilot架構圖
Pilot抽象不同平臺的服務發現機制,只需要為不同的平臺實現統一的抽象模型接口,即可實現對接不同平臺的服務發現機制。
用戶通過規則配置API來提交配置規則,Pilot把用戶配置的規則和服務發現收集到的服務轉換成Envoy代理需要的配置格式,推送給每個Envoy代理。
3. Citadel
Citadel內置有身份和憑證管理,提供了強大的服務間和終端用戶的認證。
Citadel可以把不加密的通信升級為加密的通信。
運維人員可以使用Citadel實施基于服務身份的策略而不用在網絡層控制。
Istio還支持基于角色的訪問控制,用于控制誰能夠訪問服務。
數據平面
Istio在數據平面中使用一個Envoy代理的擴展版本。
Envoy是使用C++語言開發的高性能代理,它能攔截服務網絡中所有服務的入口和出口流量。
Istio利用了眾多Envoy內置的功能特性,例如:
- 動態服務發現
- 負載均衡
- TLS終止
- HTTP/2和gRPC代理
- 熔斷器
- 健康檢查
- 基于百分比流量分隔的灰度發布
- 故障注入
- 豐富的度量指標
Envoy作為一個邊車與對應的服務部署在同一個Kubernetes Pod中。
這種部署方式使得Istio能提取豐富的流量行為信號作為屬性。
Istio又可以反過來使用這些數據在Mixer中進行策略決策,并發送這些數據到監控系統中,提供整個網絡中的行為信息。
采用邊車部署方式,可以把Istio的功能添加到一個已經存在的部署中,并且不需要重新構建或者重新編寫代碼。
Istio部署
官方中文文檔:
https://preliminary.istio.io/zh/docs/setup/getting-started
下載 Istio
下載 Istio,下載內容將包含:安裝文件、示例和 istioctl 命令行工具。
訪問 Istio release 頁面下載與您操作系統對應的安裝文件。在 macOS 或 Linux 系統中,也可以通過以下命令下載最新版本的 Istio:
curl -L https://istio.io/downloadIstio | sh -切換到 Istio 包所在目錄下。例如:Istio 包名為 istio-1.6.7,則:
安裝目錄包含如下內容:
- install/kubernetes 目錄下,有 Kubernetes 相關的 YAML 安裝文件
- samples/ 目錄下,有示例應用程序
- bin/ 目錄下,包含 istioctl 的客戶端文件。istioctl 工具用于手動注入 Envoy sidecar 代理。
將 istioctl 客戶端命令復制到/usr/local/bin目錄下:
cp istioctl /usr/local/bin/查看istio可選的幾種部署模式
[root@k8s-master profiles]# istioctl profile list Istio configuration profiles:defaultdemoemptyminimalpreviewremoteprofile開啟的組件、插件的表格如下:
查看具體的profile開啟了哪些組件可用如下命令:
安裝 demo 配置
[root@k8s-master istio-1.6.7]# istioctl manifest apply --set profile=demo Detected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details. ? Istio core installed ? Istiod installed ? Egress gateways installed ? Ingress gateways installed ? Addons installed ? Installation complete查看istio的pod
[root@k8s-master istio-1.6.7]# kubectl get pods -n istio-system NAME READY STATUS RESTARTS AGE grafana-5dc4b4676c-whdlw 1/1 Running 0 15m istio-egressgateway-65d5579779-252kt 1/1 Running 0 16m istio-ingressgateway-7895c9764d-6t2jt 1/1 Running 0 16m istio-tracing-8584b4d7f9-494rb 1/1 Running 0 15m istiod-7988b4d788-nzd9f 1/1 Running 0 17m kiali-6f457f5964-65pl9 1/1 Running 0 15m prometheus-67988db74f-zblbq 2/2 Running 0 15m這里說一下,在之前1.5之后的版本,istio已經封裝了pilot、citadel和Galley等組件為istiod,所以查看pod的時候會發現有一個istiod
sidecar注入
sidecar注入分為手動注入和自動注入,以httpbin為例:
[root@k8s-master httpbin]# pwd /usr/local/src/istio-1.6.7/samples/httpbin [root@k8s-master httpbin]# ls httpbin-gateway.yaml httpbin-nodeport.yaml httpbin-vault.yaml httpbin.yaml policy README.md sample-client手動注入
# 方法一 kubectl apply -f <(istioctl kube-inject -f httpbin-nodeport.yaml)# 方法二 istioctl kube-inject -f httpbin-nodeport.yaml | kubectl apply -f -自動注入
# 方法一:這種方法是指以后一旦在default名稱空間中創建的pods會自動注入sidecar kubectl label namesapce default istio-injection=enabled部署httpbin-nodeport
[root@k8s-master httpbin]# kubectl apply -f httpbin-gateway.yaml gateway.networking.istio.io/httpbin-gateway created virtualservice.networking.istio.io/httpbin created [root@k8s-master httpbin]# kubectl apply -f httpbin-nodeport.yaml service/httpbin created deployment.apps/httpbin created [root@k8s-master httpbin]# kubectl get pods -n default NAME READY STATUS RESTARTS AGE httpbin-768b999cb5-rgs8l 1/1 Running 0 2m8s[root@k8s-master httpbin]# kubectl get svc -n default NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE httpbin NodePort 10.1.252.74 <none> 8000:31521/TCP 3m瀏覽器測試訪問
httpbin注入sidecar
[root@k8s-master httpbin]# kubectl apply -f <(istioctl kube-inject -f httpbin-nodeport.yaml) service/httpbin unchanged deployment.apps/httpbin configured稍等幾分鐘后會發現pod數量多了一個,sidecar已經注入成功
istio有自帶的ingressgateway,所以我們可以使用istio的ingress來訪問有sidecar的應用,默認情況下的一個流程如下:
有關服務網關的流量去向圖
根據上圖可以看出,IngressGateway可以接收外部訪問,并將流量轉發到網格內的服務;
EgressGateway可以將網格內服務訪問外部應用,二者分別實現服務網格中流量的進出。
Gateway為網格內服務提供負載均衡器(Envoy),可以實現四層~七層的負載均衡,且支持雙向TLS認證,而我們K8s集群上普通的Ingress網關只能單獨實現4層或者七層的負載均衡,相比之下優勢就顯露出來。
參考:
https://blog.csdn.net/lswzw/article/details/104745617/
https://blog.csdn.net/Mr_rsq/article/details/107834698
總結
- 上一篇: 正点原子-freeRTOS
- 下一篇: [置顶] 基于视频采集卡驱动的错误修改C