设计路由规则
目标
亲自分辨VirtualService和DestinationRule的作用,了解匹配规则的顺序和AND/OR结合如何改变实际路由结果。
为什么重要
ICA出题比重40%是流量管理。但是这个领域的实际思维大部分不是语法,而是不知道角色分配造成的。“用v2发送10%”由VirtualService定义,但“v2是什么”由DestinationRule定义。只要做其中一个,Envoy就会留下没有去处的路由或没有人参考的群集,结果是503。
规则顺序也是一样的。Istio会在第一次匹配时停止评价,所以如果把全局规则放在上面,下面规则将永远不会运行。相反,如果最后没有catch-all,意想不到的请求将降级为NR。这两点是代码审查中需要注意的项目,要做到这一点,必须熟练掌握。
在这个练习中,Kubernetes基本资源实际上应用,Istio CRD是/root/ica-traffic/用下面的文件填写。因为实践群集上没有安装Istio CRD,考试要求的能力也是“准确使用宣言”。
阶段
- 名称空间
ica-traffic制作并贴标签istio-injection=enabled请粘上。 - 名称空间
ica-traffic部署reviews-v1科reviews-v2请分别以1个复制品分发。两个垫子模板都贴上标签app=reviews拥有,reviews-v1银version=v1,reviews-v2是version=v2需要追加获取。图片是nginx:1.27-alpine请使用。 - 在同一个命名空间中提供服务
reviews请制作。端口是9080,端口名称是http,selector是app=reviews只写一个。 /root/ica-traffic/dr-reviews.yamlDestinationRulereviews请填写。spec.host是reviews.ica-traffic.svc.cluster.local,subsets是v1(labelsversion: v1),v2(labelsversion: v2)是顺序。/root/ica-traffic/vs-reviews-weight.yaml请填写VirtualService。spec.hosts[0]银reviews.ica-traffic.svc.cluster.local,在http规则中设置两个destination,subsetv1E weight 90, subsetv2给weight 10。/root/ica-traffic/vs-reviews-header.yaml请编写VirtualService。有两个规则。第一个规则是头x-qa-user去true将人请求作为subsetv2发送为,第二个规则是没有match的subsetv1发送给罗。/root/ica-traffic/vs-reviews-rewrite.yaml请填写VirtualService。uri.prefix去/api/v2/人请求的途径/重新编辑为subsetv2发送至。请不要使用redirect。/root/ica-traffic/vs-reviews-final.yaml的名字reviews-final请编写in VirtualService。按顺序写三个规则。(1)头x-qa-user: true如果是的话v2,(2)uri.prefix去/api/v2/同时method.exact去GET如果是的话v2,(3)没有match的catch-all是v1.
参考
- 宣言骨架是
kubectl create deployment ... --dry-run=client -o yaml用罗选取并编辑的话会很快。 - 文件语法确认是
yq '.spec' 파일명做。价格是null如果出现这样的情况,说明路径是错误的。 - 常见的错误1:在服务selector中
version放入后只捕获一个版本。那样的话,加权就没有意义了。 - 常见的错误2:DestinationRule的subset标签
v1用相同的subset名称写。labels必须与pad标签相同。 - 8个阶段的AND条件在match项目中包含一个
uri哇method必须并排放置。将项目分成两个部分,就会成为OR。
创建可以加入梅西的命名空间
名称空间ica-traffic制作并贴标签istio-injection=enabled请粘上。
只要创建命名空间,侧卡就不会被注入。还需要贴上一个打开自动注入的标签。标签键是istio-injection。
版本标签不同的两个部署分发
名称空间ica-traffic部署reviews-v1科reviews-v2请分别以1个复制品分发。两个垫子模板都贴上标签app=reviews拥有,reviews-v1银version=v1,reviews-v2是version=v2需要追加获取。图片是nginx:1.27-alpine请使用。
两个部署的Pad要用相同的服务绑定,必须有相同的共同标签(app),要分成subset,必须有不同的区分标签(version)。标签必须在Pad模板侧面才有意义。
制作将两个版本一起绑定的服务
在同一个命名空间中提供服务reviews请制作。端口是9080,端口名称是http,selector是app=reviews只写一个。
在service selector中输入version的话,只会抓取一个版本,无法进行权重分配。版本区分不是服务的问题,而是DestinationRule的问题。端口名称也要设计成可以知道协议的。
定义subset
/root/ica-traffic/dr-reviews.yamlDestinationRulereviews请填写。spec.host是reviews.ica-traffic.svc.cluster.local,subsets是v1(labelsversion: v1),v2(labelsversion: v2)是顺序。
subset的labels必须和pad标签和字面意思一样。如果不一致的话,就会产生聚类,但端点会变成0个,遇到503 UH。host不要用短名称,而是用FQDN写。
90/10加权分配
/root/ica-traffic/vs-reviews-weight.yaml请填写VirtualService。spec.hosts[0]银reviews.ica-traffic.svc.cluster.local,在http规则中设置两个destination,subsetv1E weight 90, subsetv2给weight 10。
加权值附着在route数组的每个destination上。总和必须为100,subset名称必须与4阶段制作的完全相同。
基于头部的路由和catch-all
/root/ica-traffic/vs-reviews-header.yaml请编写VirtualService。有两个规则。第一个规则是头x-qa-user去true将人请求作为subsetv2发送为,第二个规则是没有match的subsetv1发送给罗。
规则从上到下进行评价,第一个匹配的规则获胜。先放置带有头条条件的规则,最后放置完全没有match的规则。exact值是字符串。
重新编辑URI前缀
/root/ica-traffic/vs-reviews-rewrite.yaml请填写VirtualService。uri.prefix去/api/v2/人请求的途径/重新编辑为subsetv2发送至。请不要使用redirect。
rewrite 会代理请求并更改路径,redirect 会向客户端返回 3xx。在这个阶段需要的是在后端没有注意的情况下更改路径。
将三个规则合并到一个VirtualService中
/root/ica-traffic/vs-reviews-final.yaml的名字reviews-final请编写in VirtualService。按顺序写三个规则。(1)头x-qa-user: true如果是的话v2,(2)uri.prefix去/api/v2/同时method.exact去GET如果是的话v2,(3)没有match的catch-all是v1.
最具体的规则在最上面,包括性规则在最下面。要用AND将路径和方法绑定在一起,不要创建两个match项,而是把两个条件并排放在一个项中。