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 个红色星。
应用程序的端到端架构如下所示。
此应用程序是多语言的,即微服务是用不同的语言编写的。值得注意的是,这些服务对 Istio 没有依赖关系,但它们构成了一个有趣的服务网格示例,尤其是由于 reviews
服务的多样化服务、语言和版本。
开始之前
如果您还没有这样做,请按照 安装指南 中的说明设置 Istio。
部署应用程序
要使用 Istio 运行示例,不需要更改应用程序本身。相反,您只需在启用了 Istio 的环境中配置和运行服务,并在每个服务旁边注入 Envoy sidecar。最终的部署将如下所示
所有微服务都将与 Envoy sidecar 一起打包,该 sidecar 会拦截服务传入和传出的调用,从而提供必要的钩子,以便通过 Istio 控制平面从外部控制应用程序的路由、遥测收集和策略执行。
启动应用程序服务
更改目录到 Istio 安装的根目录。
默认 Istio 安装使用 自动 sidecar 注射。使用
istio-injection=enabled
标签标记将托管应用程序的命名空间。$ kubectl label namespace default istio-injection=enabled
使用
kubectl
命令部署您的应用程序$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@
该命令启动了
bookinfo
应用程序架构图中显示的所有四个服务。所有 3 个版本的 reviews 服务,v1、v2 和 v3,都已启动。确认所有服务和 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
要确认 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 集群外部访问,例如从浏览器访问。为此,将使用网关。
为 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_HOST
和INGRESS_PORT
变量以访问网关。设置完成后返回此处。使用以下命令创建 Kubernetes 网关
$ kubectl apply -f @samples/bookinfo/gateway-api/bookinfo-gateway.yaml@ gateway.gateway.networking.k8s.io/bookinfo-gateway created httproute.gateway.networking.k8s.io/bookinfo created
由于创建 Kubernetes
Gateway
资源还会 部署相关的代理服务,请运行以下命令等待网关准备就绪$ kubectl wait --for=condition=programmed gtw bookinfo-gateway
从 bookinfo 网关资源获取网关地址和端口
$ export INGRESS_HOST=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.status.addresses[0].value}') $ export INGRESS_PORT=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
设置
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 API 使用 DestinationRule
子集定义服务版本不同,Kubernetes Gateway API 使用后端服务定义来实现此目的。
运行以下命令为 reviews
服务的三个版本创建后端服务定义
$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-versions.yaml@
下一步
现在您可以使用此示例来试验 Istio 的流量路由、故障注入、速率限制等功能。要继续,请根据您的兴趣参考一个或多个 Istio 任务。对于初学者来说,配置请求路由 是一个不错的起点。
清理
完成对 Bookinfo 示例的试验后,请使用以下命令将其卸载并清理
$ @samples/bookinfo/platform/kube/cleanup.sh@