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配置。