【云原生】Istio请求路由、流量转发、超时配置等
创始人
2024-05-30 00:41:09
0

代码继续接着前面的文章【云原生】整合K8s + SpringCloudK8s + gRpc + RocketMQ + Istio + Envoy,本篇文章我们测试下请求路由功能。

生产中我们上了个新接口或者新功能,一般会经过 内灰 -> 外灰5% -> 外灰10% ...... 外灰100%的过程,这篇文章我们就来模拟下。为了方便测试,我修改yaml文件,同一个应用部署多个版本,每个版本代表着一个新的功能。

service-provider-deploy-version.yaml

apiVersion: v1
kind: Namespace
metadata:name: service-k8s-demolabels:name: service-k8s-demo---apiVersion: v1
kind: ServiceAccount
metadata:name: service-k8s-demonamespace: service-k8s-demo---kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: service-k8s-demoname: service-k8s-demo
rules:- apiGroups:- ""resources:- services- configmaps- endpoints- nodes- pods- secrets- namespacesverbs:- get- list- watch---apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: service-k8s-demonamespace: service-k8s-demo
subjects:
- kind: ServiceAccountname: service-k8s-demonamespace: service-k8s-demo
roleRef:kind: ClusterRolename: service-k8s-demoapiGroup: rbac.authorization.k8s.io---apiVersion: apps/v1
kind: Deployment
metadata:name: service-provider-v1namespace: service-k8s-demolabels:app: service-providerversion: v1
spec:replicas: 1selector:matchLabels:app: service-providerversion: v1template:metadata:name: service-providerlabels:app: service-providerversion: v1spec:containers:- name: service-providerimage: service-provider:1.0imagePullPolicy: IfNotPresentenv:- name: SPRING_PROFILES_ACTIVEvalue: "dev"ports:- name: httpprotocol: TCPcontainerPort: 30000- name: grpcprotocol: TCPcontainerPort: 9090serviceAccountName: service-k8s-demorestartPolicy: Always
---
apiVersion: apps/v1
kind: Deployment
metadata:name: service-provider-v2namespace: service-k8s-demolabels:app: service-providerversion: v2
spec:replicas: 1selector:matchLabels:app: service-providerversion: v2template:metadata:name: service-providerlabels:app: service-providerversion: v2spec:containers:- name: service-providerimage: service-provider:1.0imagePullPolicy: IfNotPresentenv:- name: SPRING_PROFILES_ACTIVEvalue: "dev"ports:- name: httpprotocol: TCPcontainerPort: 30000- name: grpcprotocol: TCPcontainerPort: 9090serviceAccountName: service-k8s-demorestartPolicy: Always
---
apiVersion: apps/v1
kind: Deployment
metadata:name: service-provider-v3namespace: service-k8s-demolabels:app: service-providerversion: v3
spec:replicas: 1selector:matchLabels:app: service-providerversion: v3template:metadata:name: service-providerlabels:app: service-providerversion: v3spec:containers:- name: service-providerimage: service-provider:1.0imagePullPolicy: IfNotPresentenv:- name: SPRING_PROFILES_ACTIVEvalue: "dev"ports:- name: httpprotocol: TCPcontainerPort: 30000- name: grpcprotocol: TCPcontainerPort: 9090serviceAccountName: service-k8s-demorestartPolicy: Always
---apiVersion: v1
kind: Service
metadata:name: service-providernamespace: service-k8s-demo
spec:selector:app: service-providerports:- port: 80targetPort: 30000name: http- port: 9090targetPort: 9090name: grpctype: NodePort

dashboard里的展示

destination-rule-all.yaml

为每个应用定义版本

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: service-provider-rule-allnamespace: service-k8s-demo
spec:host: service-providersubsets:- name: v1labels:version: v1- name: v2labels:version: v2- name: v3labels:version: v3
---

service-gateway.yaml

内灰

一般使用userId来做,把内部员工的userId收集起来,先让他们来体验。但是我没有测试成功,而且内灰用户有很多,match的规则支持exact、prefix和regex这三种,所以有很多内灰用户的话,该怎么配呢?有大佬知道可以告诉下小弟我哦。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: service-k8s-demo-gatewaynamespace: service-k8s-demo
spec:selector:istio: ingressgateway # use istio default controllerservers:- port:number: 31400name: httpprotocol: HTTPhosts:- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: service-k8s-demo-virtual-servicenamespace: service-k8s-demo
spec:hosts:- "maple.example.com"gateways:- service-k8s-demo-gatewayhttp:- match:- uri:prefix: /consumerroute:- destination:host: service-consumerport:number: 80- match:- headers:user-id:exact: "123456"- uri:prefix: /providerroute:- destination:host: service-providersubset: v1- route:- destination:host: service-providerport:number: 80subset: v3

切流

v1给50%流量,v2给30%,v3给20%,这里是测试成功的。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: service-k8s-demo-gatewaynamespace: service-k8s-demo
spec:selector:istio: ingressgateway # use istio default controllerservers:- port:number: 31400name: httpprotocol: HTTPhosts:- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: service-k8s-demo-virtual-servicenamespace: service-k8s-demo
spec:hosts:- "maple.example.com"gateways:- service-k8s-demo-gatewayhttp:- match:- uri:prefix: /consumerroute:- destination:host: service-consumerport:number: 80- match:- uri:prefix: /providerroute:- destination:host: service-providersubset: v1port:number: 80weight: 50- destination:host: service-providersubset: v2port:number: 80weight: 30- destination:host: service-providersubset: v3port:number: 80weight: 20

也可以针对某个接口配置,下面我就为 /provider/grpc/queryMember 这个接口配置路由到v3版本上,但是这里需要注意一下,要把最细分的 exact: /provider/grpc/queryMember 放在另一个规则prefix: /provider的前面,不然它按照顺序执行,就会被 prefix: /provider 直接拦截掉了。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: service-k8s-demo-gatewaynamespace: service-k8s-demo
spec:selector:istio: ingressgateway # use istio default controllerservers:- port:number: 31400name: httpprotocol: HTTPhosts:- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: service-k8s-demo-virtual-servicenamespace: service-k8s-demo
spec:hosts:- "maple.example.com"gateways:- service-k8s-demo-gatewayhttp:- match:- uri:prefix: /consumerroute:- destination:host: service-consumerport:number: 80- match:- uri:exact: /provider/grpc/queryMemberroute:- destination:host: service-providersubset: v3port:number: 80- match:- uri:prefix: /providerroute:- destination:host: service-providersubset: v1port:number: 80weight: 50- destination:host: service-providersubset: v2port:number: 80weight: 30- destination:host: service-providersubset: v3port:number: 80weight: 20

完全切流

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: service-k8s-demo-gatewaynamespace: service-k8s-demo
spec:selector:istio: ingressgateway # use istio default controllerservers:- port:number: 31400name: httpprotocol: HTTPhosts:- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: service-k8s-demo-virtual-servicenamespace: service-k8s-demo
spec:hosts:- "maple.example.com"gateways:- service-k8s-demo-gatewayhttp:- match:- uri:prefix: /consumerroute:- destination:host: service-consumerport:number: 80- match:- uri:prefix: /providerroute:- destination:host: service-providerport:number: 80subset: v3

测试

发了5次请求,结果发现只有v3打印了日志,测试成功

超时配置

service-consumer的代码里硬编码等待2s

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: service-k8s-demo-gatewaynamespace: service-k8s-demo
spec:selector:istio: ingressgateway # use istio default controllerservers:- port:number: 31400name: httpprotocol: HTTPhosts:- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: service-k8s-demo-virtual-servicenamespace: service-k8s-demo
spec:hosts:- "maple.example.com"gateways:- service-k8s-demo-gatewayhttp:- match:- uri:prefix: /consumerroute:- destination:host: service-consumerport:number: 80subset: v1- match:- uri:exact: /provider/grpc/queryMemberroute:- destination:host: service-providersubset: v3port:number: 80timeout: 0.5s #测试超时- match:- uri:prefix: /providerroute:- destination:host: service-providersubset: v1port:number: 80weight: 50 #测试切流- destination:host: service-providersubset: v2port:number: 80weight: 30- destination:host: service-providersubset: v3port:number: 80weight: 20

相关内容

热门资讯

新学期的一天初一作文【推荐3... 新学期的一天初一作文 篇一初一的新学期,阳光明媚,充满了希望和憧憬。我早早地起床,洗漱完毕,穿上整洁...
妈妈初一作文(精彩6篇) 妈妈初一作文 篇一:妈妈是我的英雄妈妈是我的英雄。她是一个充满爱心和勇气的人,她总是尽力为我们创造一...
教我如何不想她作文600字(... 教我如何不想她作文600字 篇一教我如何不想她我们常常会遇到一些让我们难以忘怀的人,尤其是在感情的世...
我不再什么作文600字初一通... 我不再什么作文600字初一 第一篇泥土到处都有,可当你不再闻到泥土的芬芳时,才会觉得它宝贵;植物随处...
七年级语文月考1(经典3篇) 七年级语文月考1 篇一:我眼中的好老师作为一名七年级学生,我曾经遇到过很多老师。有些老师严厉,有些老...
你快乐就好-初中作文【优质5... 你快乐就好-初中作文 篇一快乐是一种美妙的情绪,它能够让人心情愉悦、精神焕发。而我认为,一个人的快乐...
初一我收获了友谊作文700字... 初一我收获了友谊作文700字 第一篇面,风很大,天气阴沉沉的。“怦怦怦!怦怦怦!”“1、2、3、4…...
初一暑假一件事作文500字(... 初一暑假一件事作文500字 篇一初一暑假,我参加了一次短期夏令营活动。这是我第一次参加夏令营,我非常...
初中英语人称代词语法【经典3... 初中英语人称代词语法 篇一人称代词在英语语法中扮演着重要的角色。它们用来代替名词,并且根据人称的不同...
初一记忆中的暖流作文(优选6... 初一记忆中的暖流作文 篇一初一是我人生中一个重要的阶段,那段时间充满了回忆和暖流。初一的生活虽然紧张...
包装无悔生命初一作文(精选5... 包装无悔生命初一作文 篇一包装无悔生命生命是一场旅程,每个人都在这个旅程中扮演着不同的角色,承载着不...
初一满分写景作文共50篇 初一满分写景作文 第一篇时间真快,转眼间我就初一了,整整一个暑假都没有看见过母校的美景了。真是“归来...
月亮抒情作文范文初一推荐90... 月亮抒情作文范文初一 第一篇又到了一年一度的中秋节,我很高兴,因为我喜欢赏月,喜欢听中秋的美丽传说,...
青春风采初中作文(优秀5篇) 青春风采初中作文 篇一:追逐梦想的青春青春是一段美好的时光,是我们追逐梦想的时刻。初中时期,正是我们...
中秋奇趣初中作文(精简5篇) 中秋奇趣初中作文 篇一中秋佳节,是中国传统的重要节日之一。在这一天,人们会与家人团聚,品尝美食,赏月...
七年级我来了作文700字推荐... 七年级我来了作文700字 第一篇经过一个暑假的放松,我终于走进了初中校园的大门。满怀着激动与兴奋,我...
我的姐姐300字作文(精选3... 我的姐姐300字作文 篇一我的姐姐是一个非常温柔可爱的人。她长得高高的,有一头乌黑亮丽的长发,眼睛大...
哎哟妈妈初中优秀作文(通用6... 哎哟妈妈初中优秀作文 篇一我与妈妈的成长小时候,我总是觉得妈妈是世界上最美丽、最聪明、最伟大的人。每...
河南人怎么了作文【优质3篇】 河南人怎么了作文 篇一河南人怎么了?这是一个让人好奇的问题。作为一个河南人,我觉得我们是一个勤劳、坚...
奇妙的汉字作文(精选6篇) 奇妙的汉字作文 篇一汉字是中国文字的代表,有着悠久的历史和独特的魅力。每一个汉字都蕴含着深刻的含义和...