Bookinfo 应用
这个示例部署了一个用于演示多种 Istio 特性的应用,该应用由四个单独的微服务构成。
Bookinfo 这个应用会显示一本书的信息页面,类似于在线书店的一个品类。 此页面上会显示一本书的描述、书籍的细节(ISBN、页数等)以及这本书相关的几条评论。
Bookinfo 应用可细分为四个独立的微服务:
productpage
:这个微服务会调用details
和reviews
两个微服务,用来填充页面内容。details
:这个微服务中包含了书籍的信息。reviews
:这个微服务中包含了书籍相关的评论。它还会调用ratings
微服务。ratings
:这个微服务中包含了由书籍评论组成的评级信息。
reviews
微服务有 3 个版本:
- v1 版本不会调用
ratings
服务。 - v2 版本会调用
ratings
服务,并使用 1 到 5 个黑色星形图标来显示评分信息。 - v3 版本会调用
ratings
服务,并使用 1 到 5 个红色星形图标来显示评分信息。
下图展示了这个应用的端到端架构。
Bookinfo 应用中的几个微服务是由不同的编程语言编写的。
值得注意的是,这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:
它由多个服务、多个编程语言和多版本的 reviews
服务构成。
开始之前
如果您还没有开始,请遵循安装指南5完成 Istio 的部署工作。
部署应用
要在 Istio 中运行这一样例应用,无需对应用本身做出任何改变。 您只要简单地在启用 Istio 的环境中对这些服务进行配置并运行这些服务, 具体一点说就是把 Envoy Sidecar 注入到每个服务之中。最终的部署结果将如下图所示:
所有的微服务都和 Envoy Sidecar 集成在一起,被集成服务所有的出入流量都被 Sidecar 所劫持, 这样就为外部控制准备了所需的 Hook(钩子),然后就可以利用 Istio 控制平面为整个应用提供服务路由、遥测数据收集以及策略实施等功能。
启动应用服务
进入 Istio 安装目录。
Istio 默认自动注入 Sidecar。 为
default
命名空间打上标签istio-injection=enabled
:使用
kubectl
命令来部署应用:上面这条命令会启动
bookinfo
应用架构图中显示的全部四个服务。 也会启动三个版本的 reviews 服务:v1、v2 以及 v3。确认所有的服务和 Pod 都已经被正确地定义和启动:
还有:
要确认 Bookinfo 应用正在运行,请从某个 Pod 中(例如从
ratings
中)用curl
命令对此应用发送一条请求:
确定 Ingress 的 IP 和端口
既然 Bookinfo 服务已启动并运行,您就需要使此应用可以从 Kubernetes 集群外部进行访问, 例如从浏览器进行访问。您可以使用网关实现这个目标。
为 Bookinfo 应用定义一个网关:
使用以下命令创建 Kubernetes Gateway9:
因为创建 Kubernetes
Gateway
资源也会部署关联的代理服务, 所以运行以下命令等待网关就绪:从 Bookinfo 网关资源处获取网关地址和端口:
设置
GATEWAY_URL
:
确认可以从集群外部访问应用
要确认是否能够从集群外部访问 Bookinfo 应用,可以运行以下 curl
命令:
您还可以用浏览器打开网址 http://$GATEWAY_URL/productpage
,来浏览应用的 Web 页面。
如果您刷新几次应用的页面,就会看到 productpage
页面会以轮询的方式展示不同版本的 reviews
服务
(红色星形、黑色星形或者没有星形)。reviews
服务出现这种情况是因为我们还没有使用 Istio 来控制版本的路由。
定义服务版本
在可以使用 Istio 控制 Bookinfo 版本路由之前,您需要定义可用的版本。
不同于 Istio API 使用 DestinationRule
子集来定义服务的版本,
Kubernetes Gateway API 将为此使用后端服务定义。
运行以下命令为三个版本的 reviews
服务创建后端服务定义:
下一步
您现在就可以使用这一应用来体验 Istio 的特性了,其中包括了流量路由、故障注入、速率限制等。 接下来可以根据个人爱好去阅读和演练一个或多个 Istio 任务14。 这里为新手推荐配置请求路由15作为起步课程。
清理
你在结束对 Bookinfo 样例应用的体验之后,可以使用下面的命令来完成应用的删除和清理: