Istio 的流量路由規則可以讓您很容易的控制服務之間的流量和 API 調用。它簡化了服務屬性的配置,通過配置可以能輕松的實作A/B 測試、金絲雀釋出、基于流量百分比切分的機率釋出等。它還提供了開箱即用的故障恢複特性,有助于增強應用的健壯性,進而更好地應對被依賴的服務或網絡發生故障的情況。
本次Demo着重展示了應用流量管理中按百分比切分流量到服務不同版本的場景。建立的istio自定義資源包括虛拟服務,目标規則,網關。其中虛拟服務,目标規則是流量路由功能的關鍵。虛拟服務(virtual service)定義了一系列指定服務的流量路由規則,目标規則(destination rule)定義了在路由發生後應用于服務的流量政策。
Demo應用使用的是一個10個微服務組成的
商城應用 ,架構如圖所示
準備資源
- 建立同vpc 兩個托管版k8s叢集 ,可通路阿裡雲容器服務控制台進行建立。
- 設定k8s叢集安全組規則,允許兩個叢集可互相通路。安全組規則可以在ecs控制台進行設定。
建立服務網格執行個體
通路
服務網格控制台,建立新網格,填寫相關内容。專有網絡選擇使用跟已經建立好的k8s叢集相同的vpc。
添加叢集,部署入口網關服務
mesh執行個體建立成功後,進入mesh詳情頁。在資料平面中選擇叢集,點選添加。選擇建立好的兩個k8s叢集進行添加。成功後如圖所示。
在入口網關服務Tab中,點選部署,将入口網關服務部署到資料平面的一個叢集中。
部署demo應用到k8s叢集
在資料面的兩個k8s叢集中建立demo命名空間,添加label,istio-injection:enabled。
在demo命名空間下部署demo應用(應用的yaml檔案在kubernetes-manifests檔案夾中)
kubectl apply --namespace=demo -f ./kubernetes-manifests/
部署成功後如圖所示
添加網關和虛拟服務
建立命名空間
服務網格控制台中執行個體的控制台平面裡建立demo命名空間
建立網關
服務網格控制台中執行個體的控制台平面裡,切換至服務網關,建立frontend-gateway。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: frontend-gateway
namespace: demo
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: http
number: 80
protocol: HTTP
建立虛拟服務
服務網格控制台中執行個體的控制台平面裡,切換至虛拟服務,建立frontend-ingress。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: frontend-ingress
namespace: demo
spec:
gateways:
- frontend-gateway
hosts:
- '*'
http:
- route:
- destination:
host: frontend
port:
number: 80
上述配置完成後,通路入口服務網關位址(負載均衡位址),就可以通路到demo應用。
部署productcatalogservice不同版本
在已經部署應用的叢集中,部署productcatalogservice-v2
apiVersion: apps/v1
kind: Deployment
metadata:
name: productcatalogservice-v2
labels:
app: productcatalogservice
version: v2
spec:
selector:
matchLabels:
app: productcatalogservice
version: v2
template:
metadata:
labels:
app: productcatalogservice
version: v2
spec:
terminationGracePeriodSeconds: 5
containers:
- name: server
image: registry.cn-hangzhou.aliyuncs.com/ack/istio-demo-productcatalogservice:0.1
imagePullPolicy: Always
ports:
- containerPort: 3550
env:
- name: PORT
value: "3550"
- name: CATALOG_VERSION
value: "v2"
readinessProbe:
exec:
command: ["/bin/grpc_health_probe", "-addr=:3550"]
livenessProbe:
exec:
command: ["/bin/grpc_health_probe", "-addr=:3550"]
resources:
requests:
cpu: 100m
memory: 64Mi
limits:
cpu: 200m
memory: 128Mi
在服務網格管理的另一個叢集中,部署productcatalogservice-v3
apiVersion: apps/v1
kind: Deployment
metadata:
name: productcatalogservice-v3
labels:
app: productcatalogservice
version: v3
spec:
selector:
matchLabels:
app: productcatalogservice
version: v3
template:
metadata:
labels:
app: productcatalogservice
version: v3
spec:
terminationGracePeriodSeconds: 5
containers:
- name: server
image: registry.cn-hangzhou.aliyuncs.com/ack/istio-demo-productcatalogservice:0.1
imagePullPolicy: Always
ports:
- containerPort: 3550
env:
- name: PORT
value: "3550"
- name: CATALOG_VERSION
value: "v3"
readinessProbe:
exec:
command: ["/bin/grpc_health_probe", "-addr=:3550"]
livenessProbe:
exec:
command: ["/bin/grpc_health_probe", "-addr=:3550"]
resources:
requests:
cpu: 100m
memory: 64Mi
limits:
cpu: 200m
memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
name: productcatalogservice
labels:
app: productcatalogservice
spec:
type: ClusterIP
selector:
app: productcatalogservice
ports:
- name: grpc
port: 3550
targetPort: 3550
添加虛拟服務和目标規則,控制不同版本通路流量百分比
服務網格控制台中執行個體的控制台平面裡,切換至目标規則,建立productcatalogservice。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: productcatalogservice
namespace: demo
spec:
host: productcatalogservice
subsets:
- labels:
version: v1
name: v1
- labels:
version: v2
name: v2
- labels:
version: v3
name: v3
服務網格控制台中執行個體的控制台平面裡,切換至虛拟服務,建立productcatalogservice。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productcatalogservice
namespace: demo
spec:
hosts:
- productcatalogservice
http:
- route:
- destination:
host: productcatalogservice
subset: v1
weight: 40
- destination:
host: productcatalogservice
subset: v2
weight: 30
- destination:
host: productcatalogservice
subset: v3
weight: 30
再次通路入口服務網關位址,重新整理頁面,可以看到不同版本的商品類目,通路機率如上述weight配置。