BookInfo

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

开始之前

  • 如果您使用GKE,请确保您的集群至少有4个标准GKE节点。

  • 按照 安装指南 中的说明安装 Istio 。

概况

在本示例中,我们将部署一个简单的应用程序,显示有关书籍的信息,类似于在线书店的单个目录条目。在页面上显示的是书的描述,书籍详细信息(ISBN,页数等)和一点书评。

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

  • productpage. productpage(产品页面)微服务 调用 detailsreviews 微服务来填充页面.
  • details. details 微服务包含书籍的详细信息.
  • reviews. reviews 微服务包含书籍的书评. 它也调用 ratings 微服务.
  • ratings. ratings 微服务包含书籍的伴随书评的评级信息.

有3个版本的 reviews 微服务:

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

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

BookInfo Application without Istio

该应用程序是多语言的,即微服务是用不同的语言编写的。

启动应用程序

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

  2. 构建应用程序容器:

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

    上述命令启动四个微服务器并创建网关入口资源,如下图所示。

    reviews 微服务有3个版本:v1,v2和v3。

    info::请注意

    在实际部署中,随着时间的推移部署新版本的微服务,而不是同时部署所有版本。

    请注意,该 istioctl kube-inject 命令用于在创建部署之前修改 bookinfo.yaml 文件。这将把 Envoy 注入到 Kubernetes 资源,如 这里 记载的。

    因此,所有的微型服务器现在都和一个能够管理呼入和呼出调用的 Envoy sidecar。更新后的图表如下所示:

    BookInfo Application

  3. 确认所有服务和 pod 已正确定义并运行:

    1. kubectl get services

    这将产生以下输出:

    1. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    2. details 10.0.0.31 <none> 9080/TCP 6m
    3. istio-ingress 10.0.0.122 <pending> 80:31565/TCP 8m
    4. istio-pilot 10.0.0.189 <none> 8080/TCP 8m
    5. istio-mixer 10.0.0.132 <none> 9091/TCP,42422/TCP 8m
    6. kubernetes 10.0.0.1 <none> 443/TCP 14d
    7. productpage 10.0.0.120 <none> 9080/TCP 6m
    8. ratings 10.0.0.15 <none> 9080/TCP 6m
    9. reviews 10.0.0.170 <none> 9080/TCP 6m

    而且

    1. kubectl get pods

    将产生:

    1. NAME READY STATUS RESTARTS AGE
    2. details-v1-1520924117-48z17 2/2 Running 0 6m
    3. istio-ingress-3181829929-xrrk5 1/1 Running 0 8m
    4. istio-pilot-175173354-d6jm7 2/2 Running 0 8m
    5. istio-mixer-3883863574-jt09j 2/2 Running 0 8m
    6. productpage-v1-560495357-jk1lz 2/2 Running 0 6m
    7. ratings-v1-734492171-rnr5l 2/2 Running 0 6m
    8. reviews-v1-874083890-f0qf0 2/2 Running 0 6m
    9. reviews-v2-1343845940-b34q5 2/2 Running 0 6m
    10. reviews-v3-1813607990-8ch52 2/2 Running 0 6m
  4. 确定网关入口URL:

    1. kubectl get ingress -o wide
    1. NAME HOSTS ADDRESS PORTS AGE
    2. gateway * 130.211.10.121 80 1d

    如果您的 Kubernetes 集群在支持外部负载均衡器的环境中运行,并且Istio入口服务能够获取外部IP,则入站资源 ADDRESS 将等于入口服务外部IP。

    1. export GATEWAY_URL=130.211.10.121:80

    有时当服务无法获取外部IP时,入口 ADDRESS 可能会显示 NodePort 地址列表。在这种情况下,您可以使用任何地址以及 NodePort 访问入口。但是,如果集群具有防火墙,则还需要创建防火墙规则以允许TCP流量到NodePort。例如,在GKE中,您可以使用以下命令创建防火墙规则:

    1. gcloud compute firewall-rules create allow-book --allow tcp:$(kubectl get svc istio-ingress -o jsonpath='{.spec.ports[0].nodePort}')

    如果您的部署环境不支持外部负载均衡器(例如 minikube),则 ADDRESS 字段将为空。在这种情况下,您可以使用 service NodePort:

    1. export GATEWAY_URL=$(kubectl get po -l istio=ingress -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc istio-ingress -o 'jsonpath={.spec.ports[0].nodePort}')
  5. 使用以下 curl 命令确认 BookInfo 应用程序正在运行:

    1. curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    1. 200

清理

在完成 BookInfo 示例后,您可以卸载它,如下所示:

  1. 删除路由规则并终止应用程序pod

    1. samples/apps/bookinfo/cleanup.sh
  2. 确认关机

    1. istioctl get route-rules #-- there should be no more routing rules
    2. kubectl get pods #-- the BookInfo pods should be deleted

下一步

现在您已经启动并运行了 BookInfo 示例,您可以将浏览器指向 http://$GATEWAY_URL/productpage 来看正在运行的应用程序,并使用 Istio 来控制流量路由,注入故障,限速等。

要开始,请查看 请求路由任务