LabHub
学习 学习路径 课程

ICA — Istio 认证助理

设计路由规则

在 LabHub 中继续学习

目标

亲自分辨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,考试要求的能力也是“准确使用宣言”。

阶段

  1. 名称空间ica-traffic制作并贴标签istio-injection=enabled请粘上。
  2. 名称空间ica-traffic部署reviews-v1reviews-v2请分别以1个复制品分发。两个垫子模板都贴上标签app=reviews拥有,reviews-v1version=v1reviews-v2version=v2需要追加获取。图片是nginx:1.27-alpine请使用。
  3. 在同一个命名空间中提供服务reviews请制作。端口是9080,端口名称是http,selector是app=reviews只写一个。
  4. /root/ica-traffic/dr-reviews.yamlDestinationRulereviews请填写。spec.hostreviews.ica-traffic.svc.cluster.local,subsets是v1(labelsversion: v1),v2(labelsversion: v2)是顺序。
  5. /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。
  6. /root/ica-traffic/vs-reviews-header.yaml请编写VirtualService。有两个规则。第一个规则是头x-qa-usertrue将人请求作为subsetv2发送为,第二个规则是没有match的subsetv1发送给罗。
  7. /root/ica-traffic/vs-reviews-rewrite.yaml请填写VirtualService。uri.prefix/api/v2/人请求的途径/重新编辑为subsetv2发送至。请不要使用redirect。
  8. /root/ica-traffic/vs-reviews-final.yaml的名字reviews-final请编写in VirtualService。按顺序写三个规则。(1)头x-qa-user: true如果是的话v2,(2)uri.prefix/api/v2/同时method.exactGET如果是的话v2,(3)没有match的catch-all是v1.

参考

创建可以加入梅西的命名空间

名称空间ica-traffic制作并贴标签istio-injection=enabled请粘上。

只要创建命名空间,侧卡就不会被注入。还需要贴上一个打开自动注入的标签。标签键是istio-injection。

版本标签不同的两个部署分发

名称空间ica-traffic部署reviews-v1reviews-v2请分别以1个复制品分发。两个垫子模板都贴上标签app=reviews拥有,reviews-v1version=v1reviews-v2version=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.hostreviews.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-usertrue将人请求作为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.exactGET如果是的话v2,(3)没有match的catch-all是v1.

最具体的规则在最上面,包括性规则在最下面。要用AND将路径和方法绑定在一起,不要创建两个match项,而是把两个条件并排放在一个项中。