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_HOST
和 INGRESS_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
。