Bookinfo是Istio的官方示例应用。 我们已经在k8s集群上安装了Istio,本篇的目标是在k8s集群上将Bookinfo应用跑起来。
Bookinfo示例应用概述
Bookinfo这个示例应用由4个独立的微服务组成,Istio使用这个应用来演示Istio的Service Mesh的各种功能。 Bookinfo应用的端到端架构图如下:

- productpage微服务: 调用details微服务和reviews微服务来生成页面
- details微服务: 包含图书的详细信息
- reviews微服务: 提供图书的评论功能,也可以调用rating微服务给图书评级
- ratings微服务: 提供图书的评级功能
另外还要注意到reviews微服务目前有3个版本:
- v1不会调用ratings微服务
- v2调用ratings微服务,并将评级显示1~5个黑色星星
- v3调用ratings微服务,并将每个评级显示为1~5个红色星星
部署Bookinfo应用
下面我们将这个应用部署到k8s上。
进入istio安装包的解压目录:
cd istio-0.2.9部署应用:
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)
service "details" created
deployment "details-v1" created
service "ratings" created
deployment "ratings-v1" created
service "reviews" created
deployment "reviews-v1" created
deployment "reviews-v2" created
deployment "reviews-v3" created
service "productpage" created
deployment "productpage-v1" created
ingress "gateway" createdistioctl kube-inject命令用于在创建部署之前修改 bookinfo.yaml 文件,Envoy作为sidecar proxy注入。
接下来确认本次部署到k8s中的Service和Pod:
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.108.74.106 <none> 9080/TCP 30m
productpage ClusterIP 10.101.224.78 <none> 9080/TCP 30m
ratings ClusterIP 10.108.45.30 <none> 9080/TCP 30m
reviews ClusterIP 10.100.169.78 <none> 9080/TCP 30mkubectl get pod
NAME READY STATUS RESTARTS AGE
details-v1-6fc98d6c9-dk2cr 2/2 Running 0 31m
productpage-v1-6fc697bfcf-vtl2v 2/2 Running 0 31m
ratings-v1-78546964bc-hc2jj 2/2 Running 0 31m
reviews-v1-5b5d868bbc-l9b7p 2/2 Running 0 31m
reviews-v2-867c49d8ff-bd8lj 2/2 Running 0 31m
reviews-v3-7488499999-n8mnc 2/2 Running 0 31m查看创建的ingress:
kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
gateway * 80 32m注意ADDRESS为空,这是因为我们本地k8s集群不支持的外部的负载均衡器。我们只能以NodePort的形式访问ingress:
export GATEWAY_URL=$(kubectl get po -n istio-system -l istio=ingress -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc istio-ingress -n istio-system -o 'jsonpath={.spec.ports[0].nodePort}')
echo $GATEWAY_URL
192.168.61.11:30933确认以http://${GATEWAY_URL}/productpage打开Bookinfo这个示例应用。
最后我们再来看一下这些微服务的Pod:
kubectl get pod
NAME READY STATUS RESTARTS AGE
details-v1-6fc98d6c9-dk2cr 2/2 Running 0 36m
productpage-v1-6fc697bfcf-vtl2v 2/2 Running 0 36m
ratings-v1-78546964bc-hc2jj 2/2 Running 0 36m
reviews-v1-5b5d868bbc-l9b7p 2/2 Running 0 36m
reviews-v2-867c49d8ff-bd8lj 2/2 Running 0 36m
reviews-v3-7488499999-n8mnc 2/2 Running 0 36m我们注意到每个Pod都是2个容器,例如productpage-v1-6fc697bfcf-vtl2v,查看bookinfo.yaml中只定义了istio/examples-bookinfo-productpage-v1:0.2.3这一个容器。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: productpage-v1
spec:
replicas: 1
template:
metadata:
labels:
app: productpage
version: v1
spec:
containers:
- name: productpage
image: istio/examples-bookinfo-productpage-v1:0.2.3
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080通过kubectl describe pod productpage-v1-6fc697bfcf-vtl2v查看,我们发现另外还多了一个istio-proxy的docker.io/istio/proxy_debug:0.2.9容器作为sidecar proxy是istio给注入的。
此时部署到k8s上的Bookinfo的架构图是下面这样的:

现在所有的微服务之间的调用都是通过Envoy sidecar,即图中小黑色长方形,微服务的sidecar组成了服务网格Service Mesh。
总结
通过本篇的学习,我们基本建立了如下概念:服务网格ServiceMesh实际上就是存在于微服务之间的网络,一般以轻量级的sidecar(边车)部署,负责管理微服务之间的流量,提高了微服务的弹性。Istio使服务网格的一种实现。