istio-bookinfo入门示例

本示例部署一个名称为bookinfo的应用程序,该应用程序由四个单独的微服务组成,用于演示各种Istio功能。该应用程序用于显示书籍有关的信息,类似于在线书籍商店的单个目录条目。页面上显示的是书的说明,书的详细信息(ISBN,页数等)和一些书评。该应用程序是由多种多语言编写的,即微服务以不同的语言编写。值得注意的是,这些服务不依赖于Istio。Bookinfo应用程序分为四个单独的微服务:

  • productpage:productpage微服务调用details和reviews微服务来填充页面。
  • details:details微服务包含图书的详细信息。
  • reviews:reviews微服务包含书评,它还调用ratings微服务。
  • ratings:ratings微服务包含书的排名信息。

其中,reviews微服务提供了3个版本:

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

该应用程序的端到端体系结构如下所示。

Bookinfo Application

1. 应用部署

使用Istio运行bookinfo application示例时,无需更改应用程序本身的任何内容。这里只需要在启用Istio的环境中进行配置和运行服务,并为每个服务注入Envoy Proxy辅助工具。所有微服务都将与Envoy sidecar打包在一起,该Envoy sidecar用于拦截对服务的入站和出站。基于Istio部署的bookinfo application结构如下:

Bookinfo Application

1.1.  部署示例应用

通过下面的步骤部署booking application示例应用:

  • 默认情况,在Istio上部署安装应用使用自动Sidecar 注入。使用以下命令将托管应用程序的名称空间(此处为default)的标记为istio-injection=enabled:
$ kubectl label namespace default istio-injection=enabled
  • 使用以下kubectl命令部署应用程序:
$ kubectl apply -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

1.2.  创建入口网关

现在Bookinfo服务已启动并正在运行,还需要使该应用程序可以从Kubernetes集群外部访问。

  • 定义应用程序的入口网关:
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
  • 确认网关已创建:
$ kubectl get gateway
NAME               AGE
bookinfo-gateway   32s

2.  访问应用

通过下面的命令,将productpage微服务以NodePort模式暴露到Kubernetes集群外:

$ kubectl expose deployment/ productpage-v1 –type=NodePort

通过下面的命令,获取对外暴露的端口(这里为31532):

$ kubectl get svc

在浏览器地址中输入:http://{宿主机ip}:31532 浏览器将进入productpage页面:

3.  创建默认目标规则

在使用Istio控制Bookinfo版本路由之前,需要在目标规则中定义可用的版本,称为子集。运行以下命令为Bookinfo服务创建默认目标规则:

如果启用双向TLS,请执行以下命令:

$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml

此YAML配置文件的内容如下:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: productpage
spec:
  # 此host的名称对应于Kubernetes中服务的名称
host: productpage
  subsets:
  - name: v1
# 标签的键值对对应于Kubernetes中标签一致的pod
labels:
      version: v1
---

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  # reviews存在v1、v2和v3三个子集,分别对应于Kubernetes中三个Pod
subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
---

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings
spec:
  host: ratings
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v2-mysql
    labels:
      version: v2-mysql
  - name: v2-mysql-vm
    labels:
      version: v2-mysql-vm
---

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: details
spec:
  host: details
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---

如果确实启用了双向TLS,请执行以下命令:

$ kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml

等待几秒钟,以便传播目标规则。可以使用以下命令显示目标规则:

$ kubectl get destinationrules -o yaml

4.  路由请求

在bookinfo示例中包含四个单独的微服务,每个微服务具有多个版本。reviews微服务有3个版本被部署并同时运行。在浏览器中访问Bookinfo应用,然后刷新几次,会注意到书评输出有时包含星级,有时则不。这是因为没有明确的默认服务版本可路由,Istio以循环方式将请求路由到所有可用版本。

4.1. 创建虚拟服务

为微服务设置默认版本的虚拟服务,从而实现将流量路由到特定的一个版本。在这种情况下,虚拟服务会将所有流量路由到特定版本下的每个微服务。在这里即可以通过kubectl创建虚拟服务,也可以通过小米的Naftis创建虚拟服务。

4.1.1.  通过kubectl创建

此处通过kubectl创建虚拟服务:

  • 运行以下命令以应用虚拟服务:
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
  • 使用以下命令显示定义的路由:
$ kubectl get virtualservices -o yaml

下面是新路由定义的代码示例:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  # 定义名称为productpage的虚拟服务
name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    # 目的路由的主机为productpage,子集为v1
- destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v3
---

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1

4.1.2.  通过Naftis创建

此处通过Naftis可视化创建虚拟服务:

  • 登录Naftis,并在“服务管理”中定位到“productpage”微服务。

  • 进入“productpage”微服务主页,点击右上角的“执行任务”。

  • 进入“执行任务”页面后,点击RequestRouting类型的“创建任务”。

  • 在“创建任务”页面,填写命名空间信息和各个微服务的主机和目标地址子集:

  • Namespace:default
  • Host:productpage DestinationSubset:v1
  • Host:details DestinationSubset:v1
  • Host:ratings DestinationSubset:v1
  • Host:review3 DestinationSubset:v3

4.2. 测试新的路由配置

在浏览器中打开Bookinfo网站,多次刷新页面,页面中的评论部分均显示星级。这是因为将Istio配置为将评论服务的所有流量路由到了reviews:v3。

 

作者简介:季向远,北京神舟航天软件技术有限公司产品经理。本文版权归原作者所有。

 

 

K8S中文社区微信公众号

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址