# bookinfo部署

## Bookinfo 应用

本示例部署了一个示例应用程序,该应用程序由四个单独的微服务组成,用于演示各种Istio功能。

该应用程序显示有关书籍的信息,类似于在线书籍商店的单个目录条目。页面上显示的是书籍说明,书籍详细信息(ISBN,页数等)以及一些书籍评论。

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

* productpage。该productpage微服务调用details和reviews微服务来填充页面。
* details。该details微服务包含图书信息。
* reviews。该reviews微服务包含了书评。它还称为ratings微服务。
* ratings。该ratings微服务包含预定伴随书评排名信息。

reviews微服务有3个版本:

* 版本v1不会调用该ratings服务。
* 版本v2调用该ratings服务,并将每个等级显示为1到5个黑星。
* 版本v3调用该ratings服务,并将每个等级显示为1到5个红色星号。

该应用程序的端到端体系结构如下所示。

![](https://istio.io/latest/docs/examples/bookinfo/noistio.svg)

该应用程序是多语言的,即微服务以不同的语言编写。值得注意的是,这些服务不依赖于Istio,但是提供了一个有趣的服务网格示例,特别是因为reviews的语言和版本多样性。

## 部署

要使用Istio运行示例,无需更改应用程序本身。相反,您只需要在启用Istio的环境中配置和运行服务,并在每个服务旁边注入Envoy辅助工具。

所有微服务都将与Envoy边车打包在一起,该Envoy边车拦截对服务的输入和输出,通过Istio控制平面,路由,遥测收集和整个应用程序的策略实施,提供外部控制所需的钩子。

* 启用自动注入

kubectl label namespace default istio-injection=enabled

* 部署bookinfo服务

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

手动注入:

kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)

* 确认服务正常运行

确认服务和pod都已经正常运行 kubectl get services kubectl get pods

* 确认能够正常提供服务

要确认Bookinfo应用程序正在运行,请通过curl某个Pod中的命令向其发送请求,例如ratings:

kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items\[0].metadata.name}')" -c ratings -- curl productpage:9080/productpage | grep -o ".\*"

Simple Bookstore App

### 测试示例服务在网格内部能够正常访问

```
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
```

## 测试示例服务在网格外部能够正常访问

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

curl http://$INGRESS_HOST:$INGRESS_PORT/productpage
```
