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

注意,我们正在设置一个名为 CUSTOMER_SERVICE_URL 的环境变量,它指向我们接下来要部署的 customer 服务 。Web Frontend 使用这个 URL 来调用 Customers 服务 。
将上述 YAML 保存为 web-frontend.yaml ,并使用 kubectl apply -f web-frontend.yaml 创建部署和服务 。
现在我们可以部署 Customers 服务的 v1版本了 。注意我们是如何在 Pod 模板中设置 version: v1 标签的 。然而,该服务在其选择器中只使用app: customers 。这是因为我们将在 DestinationRule 中创建子集,这些子集将在选择器中应用额外的版本标签,使我们能够到达运行特定版本的 Pod 。
apiVersion: apps/v1 kind: Deployment metadata:name: customers-v1labels:app: customersversion: v1 spec:replicas: 1selector:matchLabels:app: customersversion: v1template:metadata:labels:app: customersversion: v1spec:containers:- image: gcr.io/tetratelabs/customers:1.0.0imagePullPolicy: Alwaysname: svcports:- containerPort: 3000 --- kind: Service apiVersion: v1 metadata:name: customerslabels:app: customers spec:selector:app: customersports:- port: 80name: httptargetPort: 3000将上述内容保存为 customers-v1.yaml,并使用 kubectl apply -f customers-v1.yaml 创建部署和服务 。
我们应该有两个应用程序的部署在运行:
$ kubectl get po NAMEREADYSTATUSRESTARTSAGE customers-v1-7857944975-5lxc82/2Running036s web-frontend-659f65f49-jz58r2/2Running03m38s现在我们可以为 web-frontend 创建一个 VirtualService,并将其绑定到 Gateway 资源上:
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-vs.yaml,并使用 kubectl apply -f web-frontend-vs.yaml 创建 VirtualService 。
现在我们可以在浏览器中打开 GATEWAY_URL,并进入显示 Customers 服务中客户列表的 Web Frontend,如下图所示 。

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

文章插图
如果我们部署了 Customers 服务 v2 版本,我们在调用 http://customers.default.svc.cluster.local,得到的回应将是随机的 。它们要么来自 Customers 服务的 v2 版本,要么来自 v1 版本 。
我们需要为 Customers 服务创建 DestinationRule,并定义两个子集,代表 v1 和 v2 版本 。然后,我们可以创建一个 VirtualService,并将所有流量路由到 v1 版本的子集 。之后,我们可以在不影响现有服务的情况下部署 v2 版本的 Customers 服务 。
让我们从 DestinationRule 和两个子集开始:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata:name: customers spec:host: customers.default.svc.cluster.localsubsets:- name: v1labels:version: v1- name: v2labels:version: v2将上述内容保存到 customers-dr.yaml,并使用 kubectl apply -f customers-dr.yaml 创建 DestinationRule 。
我们可以创建 VirtualService 并在目标中指定 v1子集:
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: v1每当有请求被发送到 Kubernetes Customers 服务时,它将被路由到同一服务的 v1子集 。
将上述 YAML 保存为 customers-vs.yaml,并使用 kubectl apply -f customers-vs.yaml 创建 VirtualService 。
现在我们已经准备好部署 v2 版的 Customers 服务了 。v2 版本返回与前一版本相同的客户列表,但它也包括城市名称 。

经验总结扩展阅读