Bookinfo应用示例
本示例部署了一个示例应用程序,该应用程序由四个单独的微服务组成,用于演示各种Istio功能。该应用程序显示有关book(书籍)的信息,类似于在线书籍商店的单个目录条目。页面上显示的是书的说明,书的详细信息(ISBN,页数等)和一些书的回复。
Bookinfo示例分为四个单独的微服务:
productpage
这个微服务会调用details
和reviews
两个微服务,用来生成页面。details
. 这个微服务中包含了书籍的信息。reviews
. 这个微服务中包含了书籍相关的评论。它还会调用ratings
微服务。ratings
. 评级微服务,包含书评信息的书排名信息。
评论(reviews)
微服务共有3个版本:
- v1 版本不会调用 ratings 服务。
- v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
- v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
本示例的端到端架构如下所示:
该例是多语言的,即微服务以不同的语言编写。值得注意的是,这些服务不依赖Istio,但可以作为一个有趣的服务网格例子,尤其是因为评论服务的服务,语言和版本众多。
部署应用示例
要使用Istio运行示例,无需更改应用程序本身。相反,你只需要在启用Istio的环境中配置和运行服务,并在每个服务旁边注入Envoy辅助工具。 最终的部署将如下所示:
所有微服务都将与Envoy sidecar打包在一起,该Envoy sidecar拦截对服务的进入和出,并通过Istio控制plane,路由,遥测收集和整个应用程序的策略实施提供外部控制所需的hook。
启动应用程序服务
如果使用GKE,请确保您的集群至少具有4个标准GKE节点。如果你使用Minikube,请确保您至少有4GB RAM。
将目录更改为Istio安装的根目录。
默认的Istio安装使用自动Sidecar注入。通过对namespace打istio-injection=enabled标记来托管应用程序:
$ kubectl label namespace default istio-injection=enabled
如果使用OpenShift,请确保按照OpenShift设置页面中所述为名称空间上的服务帐户授予适当的权限。
使用kubectl命令部署您的应用程序:
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
如果您在安装过程中禁用了自动Sidecar注入,通过手动sidecar注入,请在部署应用程序之前使用
istioctl kube-inject
命令修改bookinfo.yaml
文件。$ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
该命令将启动bookinfo应用程序体系结构图中显示的所有四个服务。已启动评论服务的所有3个版本,即v1,v2和v3。
在实际部署中,随着时间的推移会部署新版本的微服务,而不是同时部署所有版本。
确认所有服务和Pod均已正确定义并正在运行:
$ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE details 10.0.0.31 <none> 9080/TCP 6m kubernetes 10.0.0.1 <none> 443/TCP 7d productpage 10.0.0.120 <none> 9080/TCP 6m ratings 10.0.0.15 <none> 9080/TCP 6m reviews 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应用程序正在运行,请通过curl命令从某个Pod发送请求,例如通过ratings:
$ kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>" <title>Simple Bookstore App</title>
确定ingress IP和端口
现在Bookinfo服务已启动并正在运行,从浏览器访问。Istio网关用于此目的。
定义应用程序的ingress网关:
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
确认网关已创建:
$ kubectl get gateway NAME AGE bookinfo-gateway 32s
请按照以下说明设置用于访问网关的INGRESS_HOST和INGRESS_PORT变量。 设置好后返回此处。
Set 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网页。如果您多次刷新页面,你应该会看到产品页面中显示的评论版本不同,并以循环方式显示(红色星号,黑色星号,无星号),此刻,我们还尚未使用Istio来控制版本路由。
应用默认目标规则
在使用Istio控制Bookinfo版本路由之前,您需要在目标规则中定义可用的版本,称为子集(subsets)。
运行以下命令为Bookinfo服务创建默认目标规则:
如果未启用双向TLS,执行以下命令:
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
如果启用了双向TLS,执行以下命令:
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
等待几秒钟,以便规则应用到所有nodes。
也可以使用以下命令显示目标规则:
$ kubectl get destinationrules -o yaml
下一步干什么
现在,您可以使用该示例来试验Istio的功能,如流量路由,故障注入,速率限制等。要继续操作,请根据您的兴趣参考一个或多个Istio任务。 对于初学者来说,配置请求路由是一个不错的开始。
清理
当您完成Bookinfo示例的实验后,请按照以下说明进行卸载并清理:
删除路由规则并终止应用程序容器
$ samples/bookinfo/platform/kube/cleanup.sh
确认都停止了
$ kubectl get virtualservices #-- there should be no virtual services $ kubectl get destinationrules #-- there should be no destination rules $ kubectl get gateway #-- there should be no gateway $ kubectl get pods #-- the Bookinfo pods should be deleted
老师,示例代码在哪下载
这里,自取:Istio下载