配置请求路由

Bookinfo 应用

部署了一个用于演示多种 Istio 特性的 Bookinfo 应用,该应用由四个单独的微服务构成。这个应用模仿在线书店的一个分类,显示一本书的信息。页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。

Bookinfo 应用分为四个单独的微服务:

productpage. 这个微服务会调用 details 和 reviews 两个微服务,用来生成页面。

details. 这个微服务中包含了书籍的信息。

reviews. 这个微服务中包含了书籍相关的评论。它还会调用 ratings 微服务。

ratings. 这个微服务中包含了由书籍评价组成的评级信息。

reviews 微服务有 3 个版本:

v1 版本不会调用 ratings 服务。

v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。

v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
  • 下载 istio:
curl -L https://istio.io/downloadIstio | sh -

cd istio-1.9.0

export PATH=$PWD/bin:$PATH              #将 istioctl 加入环境变量

然后需要通过 helm 部署好 istio,此处省略此过程。

  • 命名空间添加标签:

方便 Istio 在部署应用的时候,自动的注入 Envoy sidecar 代理:

kubectl label namespace default istio-injection=enabled
  • 部署 Bookinfo 应用:
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

kubectl get pod

NAME                              READY   STATUS    RESTARTS   AGE
details-v1-66b6955995-v9xlc       2/2     Running   0          2m
productpage-v1-5d9b4c9849-l54jp   2/2     Running   0          2m
ratings-v1-fd78f799f-rsghv        2/2     Running   0          2m
reviews-v1-6549ddccc5-52pb5       2/2     Running   0          2m
reviews-v2-76c4865449-6tkh8       2/2     Running   0          2m
reviews-v3-6b554c875-txhjr        2/2     Running   0          2m
  • 定义网关:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

kubectl get gateway

NAME               AGE
bookinfo-gateway   1m
  • 确定入站 IP 和端口:

按照说明,为访问网关设置两个变量:INGRESS_HOSTINGRESS_PORT

执行下面命令进行判断:Kubernetes 集群环境是否支持外部负载均衡:

kubectl get svc istio-ingressgateway -n istio-system

NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)                                                                      AGE
istio-ingressgateway   LoadBalancer   10.105.62.5   <pending>     15021:31847/TCP,80:30108/TCP,443:31550/TCP,15012:31559/TCP,15443:31955/TCP   43m

由于 EXTERNAL-IP 一直显示为 <pending>,所以当前环境中没有提供可作为入站流量网关的外部负载均衡,这样可以选择一个节点端口来代替。

设置入站的端口:

export INGRESS_PORT=$(kubectl get service -n istio-system istio-ingressgateway -o jsonpath='{
     
     .spec.ports[?(@.name=="http2")].nodePort}')

export SECURE_INGRESS_PORT=$(kubectl get service -n istio-system istio-ingressgateway -o jsonpath='{
      
      .spec.ports[?(@.name=="https")].nodePort}')

设置入站的 IP:

export INGRESS_HOST=$(kubectl get pod -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')

设置环境变量 GATEWAY_URL:

export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

echo "$GATEWAY_URL"

192.168.30.130:30108

在这里插入图片描述

用浏览器打开网址 http://$GATEWAY_URL/productpage,来浏览应用的 Web 页面。如果刷新几次应用的页面,就会看到 productpage 页面中会随机展示 reviews 服务的不同版本的效果(红色、黑色的星形或者没有显示星型)。有时书评的输出包含星级评分,有时则不包含,这是因为没有明确的默认服务版本路由,Istio 将以循环方式请求路由到所有可用版本。

  • 应用默认的 DestinationRule

在使用 Istio 控制 Bookinfo 版本路由之前,需要在 DestinationRule 中定义好可用的版本,命名为 subsets

运行以下命令为 Bookinfo 服务创建的默认的 DestinationRule

kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml

kubectl get dr

NAME          HOST          AGE
details       details       1m
productpage   productpage   1m
ratings       ratings       1m
reviews       reviews       1m

应用 VirtualService

仅路由到一个版本,应用为微服务设置默认版本的 VirtualService。在这种情况下,VirtualService 将所有流量路由到每个微服务的 v1 版本。

  • 应用 VirtualService
cat samples/bookinfo/networking/virtual-service-all-v1.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    - destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1
---
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

kubectl get vs
NAME          GATEWAYS             HOSTS           AGE
bookinfo      [bookinfo-gateway]   [*]             17m
details                            [details]       5s
productpage                        [productpage]   5s
ratings                            [ratings]       5s
reviews                            [reviews]       5s

在这里插入图片描述

可以看到,productpage 页面中只会展示 reviews 服务的 v1 版本的效果(没有显示星形)。这是因为已将 Istio 配置为路由到 Bookinfo 微服务的 v1 版本,最重要的是 reviews 服务的版本是 v1。


基于用户身份的路由

接下来,继续更改路由配置,以便将来自特定用户的所有流量路由到特定服务版本。来自名为 jason 的用户的所有流量将被路由到服务 reviews:v2

请注意,Istio 对用户身份没有任何特殊的内置机制。事实上,productpage 服务在所有到 reviews 服务的 HTTP 请求中都增加了一个自定义的 end-user 请求头,从而达到将来自特定用户的所有流量路由到特定服务版本的效果。

需要记住的是,reviews:v2 是包含黑色星级评分功能的版本。

cat samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
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 samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

在这里插入图片描述

可以看到,无登录用户时 productpage 页面中只会展示 reviews 服务的 v1 版本的效果(没有显示星形);仅当登录用户为 jason 时,productpage 页面中只会展示 reviews 服务的 v2 版本的效果(显示黑色星形)。

这是因为已将 Istio 配置为来自名为 jason 的用户的所有流量路由到 reviews:v2。除了 jason 之外,所有用户的流量都被路由到 reviews:v1


Guess you like

Origin blog.csdn.net/miss1181248983/article/details/116461012