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

true
六.实战:简单流量路由6.1 简单流量路由我们将学习如何使用权重在不同的服务版本之间路由流量 。然后,我们将部署 Customers 服务版本 v2 , 并使用子集在这两个版本之间分配流量 。
让我们从部署 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 部署 Gateway 。
接下来,我们将创建 Web Frontend 和 Customers 服务的部署以及相应的 Kubernetes 服务 。让我们首先从 web-frontend 开始:
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注意,我们正在设置一个名为 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

推荐阅读