Istio 的流量路由規則可以讓您很容易的控制服務之間的流量和 API 調用。它簡化了服務屬性的配置,通過配置可以能輕鬆的實現A/B 測試、金絲雀發佈、基於流量百分比切分的概率發佈等。它還提供了開箱即用的故障恢復特性,有助於增強應用的健壯性,從而更好地應對被依賴的服務或網絡發生故障的情況。
本次Demo著重展示了應用流量管理中按百分比切分流量到服務不同版本的場景。創建的istio自定義資源包括虛擬服務,目標規則,網關。其中虛擬服務,目標規則是流量路由功能的關鍵。虛擬服務(virtual service)定義了一系列指定服務的流量路由規則,目標規則(destination rule)定義了在路由發生後應用於服務的流量策略。
Demo應用使用的是一個10個微服務組成的商城應用,架構如圖所示
其中product-catalog服務用來展示商品的類目,我們有三個版本的catalog服務,分別展示不同的商品類目。
準備資源
- 創建同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配置。