本文介绍了使用阿里云容器服务部署运行 bookinfo 示例的过程。

前提条件

Bookinfo 应用介绍

Bookinfo 是一个样例应用,用来演示多种 Istio 特性,它由四个单独的微服务构成:

  • productpageproductpage 微服务会调用 detailsreviews 两个微服务,用来生成页面。
  • details :这个微服务包含了书籍的信息。
  • reviews :这个微服务包含了书籍相关的评论。它还会调用 ratings 微服务。
  • ratingsratings 微服务中包含了由书籍评价组成的评级信息。

reviews 微服务有 3 个版本:

  • v1 版本不会调用 ratings 服务。
  • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
  • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
下图展示了这个应用的端到端架构。架构图

部署 Bookinfo 应用

本例中,您已经完成部署 Istio,并且 istio-test 命名空间中,开启 Sidecar 自动注入。

完成后,您可以看到 istio-test 命名空间下新增标签 istio-injection:enabled部署Istio

您可以使用控制台分别部署 productpage,detail,rating 及 reviews 服务的两个版本(v1、v2)。

本例中以部署 productpage 服务为例进行介绍。

  1. 登录容器服务管理控制台
  2. 在 Kubernetes 菜单下,单击左侧导航栏中的服务网格 > 虚拟服务,然后单击页面右上角的创建
  3. 设置应用名称应用版本 集群命名空间副本数量,副本数量即应用包含的 Pod 数量。然后单击下一步 进入容器配置页面。
    本例中使用 istio-test 命名空间。
    配置应用基本信息
  4. 设置容器配置。
    设置镜像名称、镜像版本、所需资源,容器端口等配置信息。容器设置
    说明
    本示例中,界面参数取值参考如下:
    • 镜像名称:您可以单击选择镜像,在弹出的对话框中选择所需的镜像并单击确定。您还可以填写私有 registry。本例中为 docker.io/istio/examples-bookinfo-productpage-v1
    • 镜像版本:您可以单击选择镜像版本选择镜像的版本。若不指定,默认为 latest。本例中为 1.15.0
    • 所需资源:即为该应用预留资源额度,包括 CPU 和内存两种资源,即容器独占该资源,防止因资源不足而被其他服务或进程争占资源,导致应用不可用。本例中 CPU 为 0.25 Core,内存为 256 MiB。
    • 端口映射:您需要添加主机端口和容器端口,支持 TCP/UDP 协议。本例中,容器端口为 9080,协议为TCP。
    界面其他参数详细信息请参见镜像创建无状态 Deployment 应用
  5. 完成容器配置后,单击下一步
  6. 进行服务配置。
    1. 在服务栏单击创建,在弹出的对话框中进行配置。
      服务配置
      • 名称:您可自主设置,默认为applicationname-svc
      • 类型:您可以从下面 3 种服务类型中进行选择。
        • 虚拟集群 IP:即 ClusterIP,指通过集群的内部 IP 暴露服务,选择该项,服务只能够在集群内部可以访问。
        • 节点端口:即 NodePort,通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 <NodeIP>:<NodePort>,可以从集群的外部访问一个 NodePort 服务。
        • 负载均衡:即 LoadBalancer,是阿里云提供的负载均衡服务,可选择公网访问或内网访问。负载均衡可以路由到 NodePort 服务和 ClusterIP 服务。
      • 端口映射:您需要添加服务端口和容器端口,支持 TCP/UDP 协议。
      • 注解:为该服务添加一个注解(annotation),支持负载均衡配置参数,参见通过负载均衡(Server Load Balancer)访问服务
      • 标签:您可为该服务添加一个标签,标识该服务。
    2. 单击创建
      创建完成
您可以参考以下Yaml文件分别创建 details,ratings,reviews(v1)这三个服务。
  • 创建details
    apiVersion: v1
    kind: Service
    metadata:
      name: details
      labels:
        app: details
        service: details
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: details
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-details
      labels:
        account: details
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: details-v1
      labels:
        app: details
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: details
          version: v1
      template:
        metadata:
          labels:
            app: details
            version: v1
        spec:
          serviceAccountName: bookinfo-details
          containers:
          - name: details
            image: docker.io/istio/examples-bookinfo-details-v1:1.15.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
  • 创建ratings
    apiVersion: v1
    kind: Service
    metadata:
      name: ratings
      labels:
        app: ratings
        service: ratings
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: ratings
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-ratings
      labels:
        account: ratings
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ratings-v1
      labels:
        app: ratings
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ratings
          version: v1
      template:
        metadata:
          labels:
            app: ratings
            version: v1
        spec:
          serviceAccountName: bookinfo-ratings
          containers:
          - name: ratings
            image: docker.io/istio/examples-bookinfo-ratings-v1:1.15.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
  • 创建reviews(v1)
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews
      labels:
        app: reviews
        service: reviews
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-reviews
      labels:
        account: reviews
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v1
      labels:
        app: reviews
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v1
      template:
        metadata:
          labels:
            app: reviews
            version: v1
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v1:1.15.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v2
      labels:
        app: reviews
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v2
      template:
        metadata:
          labels:
            app: reviews
            version: v2
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v2:1.15.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v3
      labels:
        app: reviews
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v3
      template:
        metadata:
          labels:
            app: reviews
            version: v3
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v3:1.15.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080

创建完成后,等待所有的 service 和 pod 都已经正常启动。

创建服务网关

  1. 在 Kubernetes 菜单下, 单击左侧导航栏中的服务网格 > 服务网关,进入服务网关页面。
  2. 选择所需的集群及命名空间后,单击右上角新建
  3. 填写如下信息,单击创建,部署服务网关。
    部署服务网关
    参数说明:
    • 名称:新创建的服务网关的名称。
    • 服务网关:服务代理网关。默认为istio-ingressgateway。代理网关必须和新创建的网关部署在同一命名空间。
    • 端口配置:单击添加,可以增加多个端口的配置。
      • 名称:端口的名称
      • 协议:HTTP/TCP
      • 端口:1-65535
      • Host:支持多个host
    创建完成后,您可以在服务网关列表中,看到新创建的服务网关。服务网关
  4. 将上述服务绑定到 Bookinfo-gateway 网关,请参见绑定虚拟服务
    1. 在 Kubernetes 菜单下, 单击左侧导航栏中的服务网格 > 虚拟服务,可以看到虚拟服务(Virtual Service)列表。
      虚拟服务列表
      说明 未绑定网关的虚拟服务在服务网关列会显示绑定按钮。
    2. 在目标虚拟服务的服务网关列单击绑定,弹出添加页面。
      绑定服务网关
    3. 在服务网关中选择对应的网关名称,单击确定,即完成虚拟服务的绑定。
  5. 服务网关列表中,在目标服务网关对应的服务列中单击 istio-ingressgateway,并输入 路由/productpage
    服务网关
    可以看到如下页面。bookinfo示例

部署 reviews-v2 版本

  1. 在 Kubernetes 菜单下, 单击左侧导航栏中的服务网格 > 虚拟服务,可以看到虚拟服务(Virtual Service)列表。
  2. 在目标服务的操作列单击管理,进入服务详情页面。
    管理服务
  3. 单击增加灰度版本
    增加灰度版本
  4. 进入创建应用界面。您可以根据需要配置界面参数。
    1. 应用基本信息页面,填写应用版本副本数量后,单击下一步
    2. 容器配置页面,设置镜像名称、镜像版本、所需资源,容器端口等配置信息后,单击下一步
      容器配置
      说明
      本示例中,界面参数取值参考如下:
      • 镜像名称:您可以单击选择镜像,在弹出的对话框中选择所需的镜像并单击确定。您还可以填写私有 registry。本例中为 docker.io/istio/example-bookinfo-productpage-v2
      • 镜像版本:您可以单击选择镜像版本选择镜像的版本。若不指定,默认为 latest。本例中为1.15.0
      • 所需资源:即为该应用预留资源额度,包括 CPU 和内存两种资源,即容器独占该资源,防止因资源不足而被其他服务或进程争占资源,导致应用不可用。本例中 CPU 为 0.25 Core,内存为 256 MiB。
      • 端口映射:您需要添加主机端口和容器端口,支持 TCP/UDP 协议。本例中,容器端口为 9080,协议为 TCP。
      界面其他参数详细信息请参见镜像创建无状态 Deployment 应用
    3. 灰度策略页面,策略类型选择基于流量比例发布,流量比例中,V2 流量比例设置为 50%后,单击创建
  5. 待 pod 启动完成后,输入 路由/productpage,会看到 v2 版本的界面。
    由于 v1、v2 流量比例各 50%,可能要多刷新几次界面。bookinfo-sample

执行结果

您可以使用压测工具(例如 siege )模拟多次访问,再通过 kiali 观察流量拓扑。
在部署 Istio 时已经默认安装了 kiali,您只需要新建一个 Ingress 就可以方便的进行访问。请参见通过界面创建路由(Ingress)
说明 本例中,目标集群选择已部署 Istio 的集群,命名空间选择 istio-system。
创建完成后,您可以在路由列表中,看到 kiali 的访问地址。访问地址
单击 kiali 的访问地址,打开 Kiali 控制台,可以看到如下调用效果。调用结果
说明 用户名密码均默认为 admin。