指南 - BookInfo
该示例由四个独立的微服务组成,用于演示Istio服务网格的功能。
概况
在本示例中,我们将部署一个简单的应用程序,显示书籍的信息,类似于网上书店的书籍条目。在页面上有书籍的描述、详细信息(ISBN、页数等)和书评。
BookInfo 应用程序包括四个独立的微服务:
- productpage:productpage(产品页面)微服务,调用 details 和 reviews 微服务来填充页面。
- details:details 微服务包含书籍的详细信息。
- reviews:reviews 微服务包含书籍的点评。它也调用 ratings 微服务。
- ratings:ratings 微服务包含随书评一起出现的评分信息。
有3个版本的 reviews 微服务:
- 版本v1不调用 ratings 服务。
- 版本v2调用 ratings ,并将每个评级显示为1到5个黑色星。
- 版本v3调用 ratings ,并将每个评级显示为1到5个红色星。
应用程序的端到端架构如下所示。
该应用程序由多语言实现,即这些微服务使用不同的语言编写。值得注意的是,这些服务与 Istio 没有任何依赖关系。这是个有趣的 Service Mesh 示例,特别是对于评论服务,有多语言的版本。
开始之前
如果您还没有这样做,请按照 安装指南 对应的说明安装Istio。
部署应用程序
使用 Istio 运行应用程序示例不需要修改应用程序本身。相反,我们只需要在支持 Istio 的环境中配置和运行服务, Envoy sidecar 将会注入到每个服务中。所需的命令和配置根据运行时环境的不同而有所不同,但在所有情况下,生成的部署将如下所示:
所有的微服务都将与一个 Envoy sidecar 一起打包,拦截这些服务的入站和出站的调用请求,提供通过 Istio 控制平面从外部控制整个应用的路由,遥测收集和策略执行所需的 hook。
要启动该应用程序,请按照以下对应于您的 Istio 运行时环境的说明进行操作。
在 Kubernetes 中运行
注意:如果您使用 GKE,请确保您的集群至少有 4 个标准的 GKE 节点。如果您使用 Minikube,请确保您至少有 4GB 内存。
将目录更改为 Istio 安装目录的根目录。
构建应用程序容器:
如果您使用 自动注入 sidecar 的方式部署的集群,那幺只需要使用
kubectl
命令部署服务:kubectl apply -f samples/bookinfo/kube/bookinfo.yaml
如果您使用 手动注入 sidecar 的方式部署的集群,清使用下面的命令:
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)
请注意,该
istioctl kube-inject
命令用于在创建部署之前修改bookinfo.yaml
文件。这将把 Envoy 注入到 Kubernetes 资源,如 这里 记载的。上述命令启动四个微服务并创建网关入口资源,如下图所示。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
确定 ingress IP 和端口
如果您的 kubernetes 集群环境支持外部负载均衡器的话,可以使用下面的命令获取 ingress 的IP地址:
kubectl get ingress -o wide
输出如下所示:
NAME HOSTS ADDRESS PORTS AGE
gateway * 130.211.10.121 80 1d
Ingress 服务的地址是:
export GATEWAY_URL=130.211.10.121:80
GKE:如果服务无法获取外部 IP,
kubectl get ingress -o wide
会显示工作节点的列表。在这种情况下,您可以使用任何地址以及 NodePort 访问入口。但是,如果集群具有防火墙,则还需要创建防火墙规则以允许TCP流量到NodePort,您可以使用以下命令创建防火墙规则:export GATEWAY_URL=<workerNodeAddress>:$(kubectl get svc istio-ingress -n istio-system -o jsonpath='{.spec.ports[0].nodePort}')
gcloud compute firewall-rules create allow-book --allow tcp:$(kubectl get svc istio-ingress -n istio-system -o jsonpath='{.spec.ports[0].nodePort}')
IBM Bluemix Free Tier:在免费版的 Bluemix 的 kubernetes 集群中不支持外部负载均衡器。您可以使用工作节点的公共 IP,并通过 NodePort 来访问 ingress。工作节点的公共 IP可以通过如下命令获取:
bx cs workers <cluster-name or id>
export GATEWAY_URL=<public IP of the worker node>:$(kubectl get svc istio-ingress -n istio-system -o jsonpath='{.spec.ports[0].nodePort}')
Minikube:Minikube 不支持外部负载均衡器。您可以使用 ingress 服务的主机 IP 和 NodePort 来访问 ingress:
export GATEWAY_URL=$(kubectl get po -l istio=ingress -n istio-system -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc istio-ingress -n istio-system -o 'jsonpath={.spec.ports[0].nodePort}')
在 Consul 或 Eureka 环境下使用 Docker 运行
切换到 Istio 的安装根目录下。
启动应用程序容器。
执行下面的命令测试 Consul:
docker-compose -f samples/bookinfo/consul/bookinfo.yaml up -d
执行下面的命令测试 Eureka:
docker-compose -f samples/bookinfo/eureka/bookinfo.yaml up -d
确认所有容器都在运行:
docker ps -a
如果 Istio Pilot 容器终止了,重新执行上面的命令重新运行。
设置
GATEWAY_URL
:export GATEWAY_URL=localhost:9081
下一步
使用以下 curl
命令确认 BookInfo 应用程序正在运行:
curl -o /dev/null -s -w "%{http_code}n" http://${GATEWAY_URL}/productpage
200
你也可以通过在浏览器中打开 http://$GATEWAY_URL/productpage
页面访问 Bookinfo 网页。如果您多次刷新浏览器将在 productpage 中看到评论的不同的版本,它们会按照 round robin(红星、黑星、没有星星)的方式展现,因为我们还没有使用 Istio 来控制版本的路由。
现在,您可以使用此示例来尝试 Istio 的流量路由、故障注入、速率限制等功能。要继续的话,请参阅 Istio 指南,具体取决于您的兴趣。智能路由 是初学者入门的好方式。
清理
在完成 BookInfo 示例后,您可以卸载它,如下所示:
卸载 Kubernetes 环境
删除路由规则,终止应用程序 pod
samples/bookinfo/kube/cleanup.sh
确认关闭
istioctl get routerules #-- there should be no more routing rules
kubectl get pods #-- the BookInfo pods should be deleted
卸载 docker 环境
删除路由规则和应用程序容器
若使用 Consul 环境安装,执行下面的命令:
samples/bookinfo/consul/cleanup.sh
若使用 Eureka 环境安装,执行下面的命令:
samples/bookinfo/eureka/cleanup.sh
确认清理完成:
istioctl get routerules #-- there should be no more routing rules
docker ps -a #-- the BookInfo containers should be deleted