Istio Bookinfo应用示例

半兽人 发表于: 2019-11-21   最后更新时间: 2019-11-27  

本示例部署了一个示例应用程序,该应用程序由四个单独的微服务组成,用于演示各种Istio功能。该应用程序显示有关book(书籍)的信息,类似于在线书籍商店的单个目录条目。页面上显示的是书的说明,书的详细信息(ISBN,页数等)和一些书的回复。

Bookinfo示例分为四个单独的微服务:

  • productpage微服务调用detailsreviews微服务来填充页面。
  • details. 包含书籍详细信息的微服务。
  • reviews. 书籍评论微服务。它也称为评级微服务。
  • ratings. 评级微服务,包含书评信息的书排名信息。

评论(reviews)微服务共有3个版本:

  • 版本v1不会调用评级服务。
  • 版本v2调用了评级服务,并将每个评级显示为1到5个黑色星号。
  • 版本v3调用评级服务,并将每个评级显示为1到5个红色星号。

本示例的端到端架构如下所示:
screenshot

该例是多语言的,即微服务以不同的语言编写。值得注意的是,这些服务不依赖Istio,但可以作为一个有趣的服务网格例子,尤其是因为评论服务的服务,语言和版本众多。

部署应用示例

要使用Istio运行示例,无需更改应用程序本身。相反,你只需要在启用Istio的环境中配置和运行服务,并在每个服务旁边注入Envoy辅助工具。 最终的部署将如下所示:

screenshot

所有微服务都将与Envoy sidecar打包在一起,该Envoy sidecar拦截对服务的进入和出,并通过Istio控制plane,路由,遥测收集和整个应用程序的策略实施提供外部控制所需的hook。

启动应用程序服务

如果使用GKE,请确保您的集群至少具有4个标准GKE节点。如果你使用Minikube,请确保您至少有4GB RAM。

  1. 将目录更改为Istio安装的根目录。

  2. 默认的Istio安装使用自动Sidecar注入。通过对namespace打istio-injection=enabled标记来托管应用程序:

    $ kubectl label namespace default istio-injection=enabled
    

    如果使用OpenShift,请确保按照OpenShift设置页面中所述为名称空间上的服务帐户授予适当的权限。

  3. 使用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。

    在实际部署中,随着时间的推移会部署新版本的微服务,而不是同时部署所有版本。

  4. 确认所有服务和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
    
  5. 要确认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网关用于此目的。

  1. 定义应用程序的ingress网关:

    $ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    
  2. 确认网关已创建:

    $ kubectl get gateway
    NAME               AGE
    bookinfo-gateway   32s
    
  3. 请按照以下说明设置用于访问网关的INGRESS_HOST和INGRESS_PORT变量。 设置好后返回此处。

  4. 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示例的实验后,请按照以下说明进行卸载并清理:

  1. 删除路由规则并终止应用程序容器

    $ samples/bookinfo/platform/kube/cleanup.sh
    
  2. 确认都停止了

    $ 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请求路由
下一条: 已经是最后了!