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,如下图所示 。
文章插图
如果我们部署了 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
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Git 02: git管理码云代码仓库 + IDEA集成使用git
- node.js:《接口实现文件的上传和下载》
- Kotlin Mockito使用方法
- 之五 2流高手速成记:Springboot整合Shiro实现安全管理
- <五>掌握左值引用和初识右值引用
- 二 Istio:在Kubernetes(k8s)集群上安装部署istio1.14
- 四十八 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-使用第三方UI框架
- Spring Retry 重试
- C#-多线程的使用Tread
- 我国哪座山被称为五岳之首?支付宝