五 Istio:使用服务网格Istio进行流量路由( 六 )


让我们创建 Customers v2 部署 。我们不需要部署 Kubernetes 服务,因为我们已经部署了一个 v1 版本的服务 。
apiVersion: apps/v1 kind: Deployment metadata:name: customers-v2labels:app: customersversion: v2 spec:replicas: 1selector:matchLabels:app: customersversion: v2template:metadata:labels:app: customersversion: v2spec:containers:- image: gcr.io/tetratelabs/customers:2.0.0imagePullPolicy: Alwaysname: svcports:- containerPort: 3000该部署与 v1 部署几乎相同 。唯一的区别是所使用的 Docker 镜像版本和设置在版本标签上的 v2 值 。
将上述 YAML 保存为 customers-v2.yaml,并使用 kubectl apply -f customers-v2.yaml 创建部署 。
让我们使用 weight 字段并修改 VirtualService,使 50% 的流量被发送到 v1 子集,另 50% 发送到 v2 子集 。
要做到这一点,我们将创建第二个 destination,有相同的主机名,但有不同的子集 。我们还将为 destination 添加 weight: 50,以便在两个版本之间平均分配流量 。
【五 Istio:使用服务网格Istio进行流量路由】 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:name: customers spec:hosts:- 'customers.default.svc.cluster.local'http:- route:- destination:host: customers.default.svc.cluster.localport:number: 80subset: v1weight: 50- destination:host: customers.default.svc.cluster.localport:number: 80subset: v2weight: 50将上述 YAML 保存为 customers-50-50.yaml 并使用 kubectl apply -f customers-50-50.yaml 更新 VirtualService 。
在浏览器中打开 GATEWAY_URL,刷新几次页面,看看不同的响应 。来自 Customers v2 的响应显示在下图中 。

五 Istio:使用服务网格Istio进行流量路由

文章插图
为了改变发送到一个或另一个版本的流量比例,我们可以更新 VirtualService 。同样,我们也可以添加 v3 或 v4 版本,并在这些版本之间分割流量 。
6.2 清理删除 Deployments、Services、VirtualServices、DestinationRule 和 Gateway:
kubectl delete deploy web-frontend customers-{v1,v2} kubectl delete svc customers web-frontend kubectl delete vs customers web-frontend kubectl delete dr customers kubectl delete gateway gateway七.实战:高级流量路由7.1 高级流量路由在这个实验中,我们将学习如何使用请求属性在多个服务版本之间路由流量 。
我们将从部署 Gateway 开始:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:name: gateway spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- '*'将上述 YAML 保存为 gateway.yaml 并使用 kubectl apply -f gateway.yaml 部署网关 。
接下来,我们将部署Web前端、Customers v1、Customers v2,以及相应的 VirtualServices 和 DestinationRule 。一旦一切部署完毕,所有流量将被路由到 Customers v1 。
apiVersion: apps/v1 kind: Deployment metadata:name: web-frontendlabels:app: web-frontend spec:replicas: 1selector:matchLabels:app: web-frontendtemplate:metadata:labels:app: web-frontendversion: v1spec:containers:- image: gcr.io/tetratelabs/web-frontend:1.0.0imagePullPolicy: Alwaysname: webports:- containerPort: 8080env:- name: CUSTOMER_SERVICE_URLvalue: 'http://customers.default.svc.cluster.local' --- kind: Service apiVersion: v1 metadata:name: web-frontendlabels:app: web-frontend spec:selector:app: web-frontendports:- port: 80name: httptargetPort: 8080 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:name: web-frontend spec:hosts:- '*'gateways:- gatewayhttp:- route:- destination:host: web-frontend.default.svc.cluster.localport:number: 80将上述 YAML 保存为 web-frontend.yaml 并使用

经验总结扩展阅读