请求路由
此任务将向您展示如何将请求动态路由到微服务的多个版本。
开始之前
关于此任务
Istio Bookinfo 示例包含四个独立的微服务,每个微服务都有多个版本。其中一个微服务 reviews
的三个不同版本已部署并正在同时运行。为了说明由此引起的问题,请在浏览器中访问 Bookinfo 应用程序的 /productpage
并刷新几次。URL 为 http://$GATEWAY_URL/productpage
,其中 $GATEWAY_URL
是入口的外部 IP 地址,如 Bookinfo 文档中所述。
您会注意到,有时图书评论输出包含星级评定,有时则不包含。这是因为如果没有要路由到的显式默认服务版本,Istio 会以轮询方式将请求路由到所有可用版本。
此任务的初始目标是应用规则,将所有流量路由到微服务的v1
(版本 1)。稍后,您将应用一个规则,根据 HTTP 请求头的值路由流量。
路由到版本 1
要仅路由到一个版本,您可以配置路由规则,将流量发送到微服务的默认版本。
- 运行以下命令创建路由规则
Istio 使用虚拟服务来定义路由规则。运行以下命令以应用虚拟服务,这些虚拟服务将所有流量路由到每个微服务的v1
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
由于配置传播最终是一致的,请等待几秒钟,使虚拟服务生效。
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v1
port: 9080
EOF
- 使用以下命令显示已定义的路由
$ kubectl get virtualservices -o yaml
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
您还可以使用以下命令显示相应的subset
定义
$ kubectl get destinationrules -o yaml
$ kubectl get httproute reviews -o yaml
...
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- group: ""
kind: Service
name: reviews-v1
port: 9080
weight: 1
matches:
- path:
type: PathPrefix
value: /
status:
parents:
- conditions:
- lastTransitionTime: "2022-11-08T19:56:19Z"
message: Route was valid
observedGeneration: 8
reason: Accepted
status: "True"
type: Accepted
- lastTransitionTime: "2022-11-08T19:56:19Z"
message: All references resolved
observedGeneration: 8
reason: ResolvedRefs
status: "True"
type: ResolvedRefs
controllerName: istio.io/gateway-controller
parentRef:
group: gateway.networking.k8s.io
kind: Service
name: reviews
port: 9080
在资源状态中,确保reviews
父级的Accepted
条件为True
。
您已将 Istio 配置为路由到 Bookinfo 微服务的v1
版本,最重要的是reviews
服务版本 1。
测试新的路由配置
您可以通过再次刷新浏览器中 Bookinfo 应用程序的/productpage
来轻松测试新配置。请注意,无论刷新多少次,页面中的评论部分均不显示评分星级。这是因为您已将 Istio 配置为将所有流量路由到评论服务的版本reviews:v1
,并且此版本的服务器不访问星级评定服务。
您已成功完成了此任务的第一部分:将流量路由到服务的某个版本。
基于用户身份的路由
接下来,您将更改路由配置,以便来自特定用户的全部流量路由到特定服务版本。在本例中,来自名为 Jason 的用户的全部流量将路由到服务reviews:v2
。
此示例之所以能够实现,是因为productpage
服务向发送到评论服务的全部出站 HTTP 请求添加了自定义的end-user
标头。
Istio 还支持基于入口网关上强身份验证的 JWT 进行路由,有关更多详细信息,请参阅基于 JWT 声明的路由。
请记住,reviews:v2
是包含星级评定功能的版本。
- 运行以下命令以启用基于用户的路由
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@
您可以使用以下命令确认规则已创建
$ kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- matches:
- headers:
- name: end-user
value: jason
backendRefs:
- name: reviews-v2
port: 9080
- backendRefs:
- name: reviews-v1
port: 9080
EOF
在 Bookinfo 应用程序的
/productpage
上,以用户jason
的身份登录。刷新浏览器。您看到了什么?每个评论旁边都会显示星级评定。
以其他用户身份登录(选择任意名称)。
刷新浏览器。现在星级不见了。这是因为除 Jason 之外的所有用户,其流量都路由到
reviews:v1
。
您已成功将 Istio 配置为基于用户身份路由流量。
了解发生了什么
在此任务中,您使用 Istio 将 100% 的流量发送到每个 Bookinfo 服务的v1
版本。然后,您设置了一个规则,根据productpage
服务添加到请求中的自定义end-user
标头,有选择地将流量发送到reviews
服务的版本v2
。
请注意,像此任务中使用的 Bookinfo 服务这样的 Kubernetes 服务必须遵守某些限制才能利用 Istio 的 L7 路由功能。有关详细信息,请参阅Pod 和服务的必要条件。
在流量切换任务中,您将遵循此处学习的相同基本模式来配置路由规则,以便逐步将流量从服务的某个版本发送到另一个版本。
清理
- 删除应用程序路由规则
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
$ kubectl delete httproute reviews
- 如果您不打算探索任何后续任务,请参阅Bookinfo 清理说明以关闭应用程序。