这个指南展示一个简单的例子,我们通过编排四个分离的微服务来验证Istio服务网格的多种功能。
在这个指南中我们展示了一个简单的应用,它展示一本书的信息,类似于在线书店的单个目录条目。页面展示书的描述,细节(ISBN,页数等),还有一些书评。
Bookinfo应用被分为四个分离的微服务:
reviews 有三个版本:
这个应用包含多种语言,也就是说,微服务是用不同语言写的。值得注意的是,这些服务与istio没有任何依赖关系,但是提供了一个有趣的服务网格示例,特别是reviews服务有多个服务版本,以及多种实现语言。
如果你还没装Istio,对照你平台的 installation guide指令去安装。
用Istio运行例子不需对应用本身做任何改变。相反,我们只需在Istio允许的环境配置和运行服务,这个环境是Envoy sidecars注入到每个服务提供的。所需的命令和配置取决于运行时环境,但是所有情况下,生成的部署如下:
所有微服务都被Envoy sidecar包装,它拦截服务的出入调用,提供外部控制所需的钩子,通过Istio的控制平面为整个应用程序提供路由,遥测收集和策略执行。
对应你的Istio运行环境,按照下面介绍启动应用。
注意: 如果你使用GKE,请确保你的集群有至少4个标准GKE节点。如果你使用Minikube,确保你有至少4GB RAM。
如果你使用 manual sidecar injection,使用如下命令:
kubectl apply -f <(istioctl kube-inject --debug -f samples/bookinfo/kube/bookinfo.yaml)
如果你的集群能够 automatic sidecar injection,只需使用kubectl
kubectl apply -f samples/bookinfo/kube/bookinfo.yaml
命令 istioctl kube-inject
在手动创建deployments 前修改 bookinfo.yaml
文件。参见 here.
上述任一命令部署所有四个微服务,并新建网关ingress资源,如上图所示。reviews 的三个版本 v1, v2, and v3, 都启动了。
注意: 在真实的deployment中,应该随着版本时间的推移部署新版本的微服务,而不是同时部署所有版本。
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
1.如果你的k8s集群支持外部负载均衡,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
2.Minikube: 在Minikube中不支持外部负载均衡。你可以使用ingress service的host 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}')
为了确认Bookinfo正在运行,使用命令curl
curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
返回
200
你也可以在浏览器上访问Bookinfo的网页 http://$GATEWAY_URL/productpage
。如果你刷新几次页面,你就会在productpage看到reviews的几个不同版本,以一种循环的方式出现(red stars, black stars, no stars),而我们还没有使用Istio去控制版本路由。
当你尝试完成Bookinfo示例,你可以使用如下步骤卸载和清理它。
1.删除路由规则并终止应用pods
samples/bookinfo/kube/cleanup.sh
2.确认关闭
istioctl get routerules #-- there should be no more routing rules
kubectl get pods #-- the Bookinfo pods should be deleted
1.删除路由规则及应用容器
2.确认清理
istioctl get routerules #-- there should be no more routing rules
docker ps -a #-- the Bookinfo containers should be deleted