服務(wù)治理形態(tài)
微服務(wù)化通過拆分服務(wù)獨(dú)立化,給我們帶來了很多好處,比如獨(dú)立部署運(yùn)維,功能內(nèi)聚自治,便于敏捷開發(fā),快速迭代,更好的伸縮性。但是,業(yè)務(wù)本身的規(guī)模和復(fù)雜度并沒有變少,同時微服務(wù)化也給開發(fā)和運(yùn)維帶來新的復(fù)雜性,比如網(wǎng)絡(luò)可靠性,通信安全,服務(wù)間調(diào)用鏈追蹤等等。這時,就需要引入一些通過工具來做通過的工作,比如服務(wù)注冊發(fā)現(xiàn),負(fù)載均衡,鏈路追蹤等等,統(tǒng)稱為服務(wù)治理。服務(wù)治理經(jīng)過以下三種形態(tài)的演變:
-
應(yīng)用程序中包含治理邏輯
業(yè)務(wù)代碼和治理邏輯耦合,微服務(wù)越多,重復(fù)的代碼越多
圖1.png -
治理邏輯獨(dú)立代碼
治理邏輯抽取成SDK代碼,減少重復(fù)代碼,業(yè)務(wù)代碼依賴SDK,業(yè)務(wù)代碼和治理邏輯在一個進(jìn)程內(nèi),典型代表Spring Cloud框架
圖2.png -
治理邏輯獨(dú)立進(jìn)程
治理邏輯再解耦一層,從業(yè)務(wù)代碼剝離出,業(yè)務(wù)代碼和治理邏輯以獨(dú)立的進(jìn)程運(yùn)行,真正治理邏輯下沉,典型的Sidecar模式(服務(wù)網(wǎng)格),典型框架技術(shù)就是本文要講的Istio
圖3.png
Istio 簡介
Istio 是一個開源服務(wù)網(wǎng)格,它透明地分層到現(xiàn)有的分布式應(yīng)用程序上。Istio 的強(qiáng)大功能提供了一種統(tǒng)一且更有效的方式來保護(hù)、連接和監(jiān)控服務(wù)。Istio 是負(fù)載均衡、服務(wù)到服務(wù)身份驗(yàn)證和監(jiān)控的途徑——幾乎不需要更改服務(wù)代碼。
Istio 作為服務(wù)網(wǎng)格技術(shù)具體落地方案,目前已是服務(wù)網(wǎng)格技術(shù)的事實(shí)標(biāo)準(zhǔn)。
2017年5月由Google與IBM聯(lián)合發(fā)布,2018年7月發(fā)布1.0版本,2019年3月發(fā)布1.1版本(生產(chǎn)GA版本)
主要功能
- 通過豐富的路由規(guī)則、重試、故障轉(zhuǎn)移和故障注入對流量行為進(jìn)行細(xì)粒度控制
- 支持訪問控制、速率限制和配額的可插拔策略層和配置 API
- HTTP、gRPC、WebSocket 和 TCP 流量的自動負(fù)載平衡
- 集群內(nèi)所有流量的自動指標(biāo)、日志和跟蹤,包括集群入口和出口
- 使用 TLS 加密、強(qiáng)大的基于身份的身份驗(yàn)證和授權(quán)來保護(hù)集群中的服務(wù)到服務(wù)通信
使用場景
Istio 專為可擴(kuò)展性而設(shè)計(jì),可以處理各種部署需求。Istio 的控制平面不僅可以在 Kubernetes 上運(yùn)行,您可以將部署在該集群中的應(yīng)用程序添加到您的網(wǎng)格中,將網(wǎng)格擴(kuò)展到其他集群,甚至連接虛擬機(jī)或在 Kubernetes 之外運(yùn)行的其他端點(diǎn)
Istio 安裝
Linux服務(wù)器上直接下載或者Github Istio release上下載安裝包
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.13.2 TARGET_ARCH=x86_64 sh -
#解壓
tar -xvf istio-1.13.2-linux-amd64.tar.gz
cd istio-1.13.2
export PATH=$PWD/bin:$PATH #配置環(huán)境變量
istioctl install --set profile=demo -y
輸出結(jié)果如下:

#查看詳細(xì)命令
istioctl -h
Istio將自動將sidecar容器注入到以標(biāo)記istio-injection=enabled命名空間的容器中
kubectl lable namespace default istio-injection=enabled
安裝可視化組件(可選)
kubectl apply -f samples/addons
查看pod列表

istio 安裝和部署實(shí)例都是基于kubernetes的聲明式API
部署示例應(yīng)用
以官網(wǎng)提供的bookinfo為例,Reviews 包含三個服務(wù)版本,分別對應(yīng)三個Deployment

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
應(yīng)用程序啟動完成,查看pod列表

通過kubectl describe pod/xxxx ,可查看每個pod里面,不僅包含業(yè)務(wù)容器,還包含一個istio-init容器(init容器類型)和istio-proxy容器,這次sidecar已自動注入了。
#查看自定義資源
kubect get customresourcedefinition

路由規(guī)則配置
istio提供多豐富的對象實(shí)現(xiàn)路由規(guī)則配置,比如VirtualService,DestinationRule,Gateway,Service Entry ,WorkloadEntry等。
- 按權(quán)重訪問review-v2 review-v3版本
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
- reviews.default.svc.cluster.local
http:
- route:
- destination:
host: reviews.default.svc.cluster.local
subset: v2
weight: 25
- destination:
host: reviews.default.svc.cluster.local
subset: v3
weight: 75
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews-destination
spec:
host: reviews.default.svc.cluster.local
subsets:
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
Istio 架構(gòu)概述
架構(gòu)圖

-
數(shù)據(jù)平面
數(shù)據(jù)平面由一組 sidecar 的代理(Envoy)組成, 與業(yè)務(wù)容器綁定在一起(k8s創(chuàng)建業(yè)務(wù)pod時自動注入pod中)即共享一個pod,真正執(zhí)行流量控制管理,同時會向控制面輸出日志及監(jiān)控?cái)?shù)據(jù)。如下所示:
Istio-pod.png
Envoy 是采用C++實(shí)現(xiàn)的高性能網(wǎng)絡(luò)代理服務(wù),由Lyft開源的CNCF項(xiàng)目
-
控制平臺
控制平面Istiod通過管理和配置 Envoy 來管理流量,主要包括Pilot,Mixer,Citadel等服務(wù)組件,默認(rèn)安裝在istio-system命名空間
Pod.png
Pilot 是Istio控制面流量管理和服務(wù)發(fā)現(xiàn)的核心組件,人稱Istio的司令官
Mixer 負(fù)責(zé)執(zhí)行訪問策略和收集遙測數(shù)據(jù)的組件
Citadel是Istio的安全組件,主要負(fù)責(zé)證書的頒發(fā)和輪換




