【云原生】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

相关内容

热门资讯

小学生庆元旦联欢会主持词 小学生庆元旦联欢会主持词范文(精选5篇)  主持词要注意活动对象,针对活动对象写相应的主持词。在现今...
新年升旗仪式致辞 新年升旗仪式致辞(精选14篇)  在现实生活或工作学习中,说到致辞,大家肯定都不陌生吧,致辞具有思路...
表演半台词 表演三句半台词  敲锣打鼓走圆场  1:锣鼓一响好心情,  2:我们漫游动画城;  3:表演一个三句...
毕业30周年同学聚会主持词 毕业30周年同学聚会主持词范文  老同学聚会,一桌饭菜,谈论着当年的同学情,好不快活呀,往日是多么的...
结训典礼主持词 结训典礼主持词范文  主持词是主持人在节目进行过程中用于串联节目的串联词。在当今中国社会,各种集会中...
集团董事长新年的经典致辞 集团董事长新年的经典致辞(通用13篇)  在平平淡淡的学习、工作、生活中,大家对致辞都不陌生吧,致辞...
郭德纲于谦相声《李菁表妹》台... 郭德纲于谦相声《李菁表妹》台词  郭德纲,1973年1月18日出生于天津,华语相声演员,电视、电影演...
教师节学生主持稿 教师节学生主持稿  教师“不仅仅是一份工作、一个职业,而是一项需要用一生的情感去拥抱的事业,更是一种...
主持词开场白夏天 主持词开场白夏天(精选5篇)  在现实社会中,很多情况下我们都需要用到开场白,独具匠心的开场白,才能...
幼儿园家长会全过程主持词 幼儿园家长会全过程主持词  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在当今不断发...
播音主持岗位实践报告范文8篇 播音主持岗位实践报告范文 第一篇时间过的很快,转眼间,我到临沂银雀山汉墓竹筒博物馆工作,已经快一年的...
爱国活动主持词 爱国活动主持词范文  主持人在台上表演的灵魂就表现在主持词中。我们眼下的社会,主持词在各种活动中起到...
“我的祖国”演讲比赛主持词 “我的祖国”演讲比赛主持词  主持词要注意活动对象,针对活动对象写相应的主持词。在当下这个社会中,越...
舞蹈节目主持词串词 舞蹈节目主持词串词范文(精选8篇)  主持词需要富有情感,充满热情,才能有效地吸引到观众。在当下的社...
我是歌手歌唱比赛主持词 我是歌手歌唱比赛主持词  小歌手主持词篇一  A:尊敬的各位领导  B:敬爱的老师,亲爱的同学们  ...
中秋节联欢晚会主持词 中秋节联欢晚会主持词(精选11篇)  主持词要注意活动对象,针对活动对象写相应的主持词。我们眼下的社...
初中新生开学欢迎词 初中新生开学欢迎词2017各位初一年全体同学石狮二中敞开胸怀迎接你们,真诚地欢迎你们加入这个大家庭,...
品鉴会主持词 品鉴会主持词  借鉴诗词和散文诗是主持词的一种写作手法。随着中国在不断地进步,各种集会的节目都通过主...
新年半台词 新年三句半台词  三句半是一种中国民间群众传统曲艺表演形式。每段内容有三长句一半句。一般由4人演出,...
消夏文艺晚会的主持词 消夏文艺晚会的主持词(精选11篇)  主持词是主持人在节目进行过程中用于串联节目的串联词。在各种集会...