Bookinfo 应用程序

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

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

Bookinfo 应用程序被分解为四个独立的微服务

  • productpageproductpage 微服务调用 detailsreviews 微服务来填充页面。
  • detailsdetails 微服务包含书籍信息。
  • reviewsreviews 微服务包含书籍评论。它还调用 ratings 微服务。
  • ratingsratings 微服务包含伴随书籍评论的书籍排名信息。

reviews 微服务有 3 个版本

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

应用程序的端到端架构如下所示。

Bookinfo Application without Istio
没有 Istio 的 Bookinfo 应用程序

此应用程序是多语言的,即微服务是用不同的语言编写的。值得注意的是,这些服务对 Istio 没有依赖关系,但它们构成了一个有趣的服务网格示例,尤其是由于 reviews 服务的多样化服务、语言和版本。

开始之前

如果您还没有这样做,请按照 安装指南 中的说明设置 Istio。

部署应用程序

要使用 Istio 运行示例,不需要更改应用程序本身。相反,您只需在启用了 Istio 的环境中配置和运行服务,并在每个服务旁边注入 Envoy sidecar。最终的部署将如下所示

Bookinfo Application
Bookinfo 应用程序

所有微服务都将与 Envoy sidecar 一起打包,该 sidecar 会拦截服务传入和传出的调用,从而提供必要的钩子,以便通过 Istio 控制平面从外部控制应用程序的路由、遥测收集和策略执行。

启动应用程序服务

  1. 更改目录到 Istio 安装的根目录。

  2. 默认 Istio 安装使用 自动 sidecar 注射。使用 istio-injection=enabled 标签标记将托管应用程序的命名空间。

    $ kubectl label namespace default istio-injection=enabled
    
  3. 使用 kubectl 命令部署您的应用程序

    压缩
    $ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@
    

    该命令启动了 bookinfo 应用程序架构图中显示的所有四个服务。所有 3 个版本的 reviews 服务,v1、v2 和 v3,都已启动。

  4. 确认所有服务和 Pod 都已正确定义并正在运行

    $ kubectl get services
    NAME          TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
    details       ClusterIP   10.0.0.31    <none>        9080/TCP   6m
    kubernetes    ClusterIP   10.0.0.1     <none>        443/TCP    7d
    productpage   ClusterIP   10.0.0.120   <none>        9080/TCP   6m
    ratings       ClusterIP   10.0.0.15    <none>        9080/TCP   6m
    reviews       ClusterIP   10.0.0.170   <none>        9080/TCP   6m
    

    $ kubectl get pods
    NAME                             READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17      2/2       Running   0          6m
    productpage-v1-560495357-jk1lz   2/2       Running   0          6m
    ratings-v1-734492171-rnr5l       2/2       Running   0          6m
    reviews-v1-874083890-f0qf0       2/2       Running   0          6m
    reviews-v2-1343845940-b34q5      2/2       Running   0          6m
    reviews-v3-1813607990-8ch52      2/2       Running   0          6m
    
  5. 要确认 Bookinfo 应用程序正在运行,请从某个 Pod(例如,从 ratings)发送 curl 命令请求它

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

确定入口 IP 和端口

现在 Bookinfo 服务已启动并运行,您需要使应用程序可从 Kubernetes 集群外部访问,例如从浏览器访问。为此,将使用网关。

  1. 为 Bookinfo 应用程序创建网关

    使用以下命令创建 Istio 网关

    压缩
    $ kubectl apply -f @samples/bookinfo/networking/bookinfo-gateway.yaml@
    gateway.networking.istio.io/bookinfo-gateway created
    virtualservice.networking.istio.io/bookinfo created
    

    确认网关已创建

    $ kubectl get gateway
    NAME               AGE
    bookinfo-gateway   32s
    

    按照 这些说明 设置 INGRESS_HOSTINGRESS_PORT 变量以访问网关。设置完成后返回此处。

  2. 设置 GATEWAY_URL

    $ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
    

确认应用程序可从集群外部访问

要确认 Bookinfo 应用程序可从集群外部访问,请运行以下 curl 命令

$ curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

您还可以将浏览器指向 http://$GATEWAY_URL/productpage 以查看 Bookinfo 网页。如果您刷新页面几次,您应该会在 productpage 中看到不同版本的评论以循环的方式显示(红色星、黑色星、无星),因为我们还没有使用 Istio 来控制版本路由。

定义服务版本

在您使用 Istio 控制 Bookinfo 版本路由之前,您需要定义可用的版本。

Istio 使用 目标规则 中的子集来定义服务的版本。运行以下命令为 Bookinfo 服务创建默认目标规则

压缩
$ kubectl apply -f @samples/bookinfo/networking/destination-rule-all.yaml@

等待几秒钟,以便目标规则传播。

您可以使用以下命令显示目标规则

$ kubectl get destinationrules -o yaml

下一步

现在您可以使用此示例来试验 Istio 的流量路由、故障注入、速率限制等功能。要继续,请根据您的兴趣参考一个或多个 Istio 任务。对于初学者来说,配置请求路由 是一个不错的起点。

清理

完成对 Bookinfo 示例的试验后,请使用以下命令将其卸载并清理

压缩
$ @samples/bookinfo/platform/kube/cleanup.sh@
这些信息对您有帮助吗?
您是否有任何改进建议?

感谢您的反馈!