部署 Bookinfo 和管理流量

Istio,作为一种开源服务网格解决方案,为微服务提供了强大的流量管理功能。以下是 Istio 官方网站上关于流量管理的简介:

Istio 的流量路由规则可以让您很容易的控制服务之间的流量和 API 调用。Istio 简化了服务级别属性的配置,比如熔断器、超时和重试,并且能轻松的设置重要的任务,如 A/B 测试、金丝雀发布、基于流量百分比切分的概率发布等。它还提供了开箱即用的故障恢复特性,有助于增强应用的健壮性,从而更好地应对被依赖的服务或网络发生故障的情况。

KubeSphere 基于 Istio 提供了三种灰度策略,包括蓝绿部署,金丝雀发布和流量镜像。其中,金丝雀发布代表了一种有效的软件开发策略,在这种策略中,新版本被部署用于测试,基线版本留存在生产环境中。此策略为正在测试的新版本引入一部分流量,而生产版本将接收其余的流量。

目标

在本教程中,您将学习如何部署由四个独立的微服务组成的示例应用程序 Bookinfo,以及如何使用 KubeSphere 的流量管理功能来发布新版本。

前置条件

  • 您需要启用 KubeSphere 服务网格

  • 您需要完成 创建企业空间、项目、帐户和角色 中的所有任务。

  • 您需要启用应用治理。为此,请按照以下步骤操作:

    使用project-admin登录控制台并转到您的项目。找到项目设置下的高级设置,点击编辑,然后选择编辑网关。在出现的对话框中,打开应用治理旁边的开关。

    edit-gateway

    switch-application-governance

    备注

    您需要启用应用治理以使用追踪功能。启用后若无法访问路由,请检查您的路由(Ingress)是否已经添加注释(例如:nginx.ingress.kubernetes.io/service-upstream: true)。

预计时间

20分钟左右。

什么是 Bookinfo 应用

Bookinfo 应用由如下四个独立的微服务组成,其中 reviews 微服务有三个版本。

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

这个应用的端到端架构如下所示。更多详细信息,请参考 Bookinfo 应用

Bookinfo 应用

动手实验

任务 1: 部署 Bookinfo

  1. 使用账户project-regular登录控制台并进入项目,转到应用负载下的应用,点击右侧的部署示例应用

    sample-bookinfo

  2. 在出现的对话框中点击下一步,其中必填字段已经预先填充了,同时也已经设置了相关组件。您无需修改设置,只需在最后一页(外网访问)点击创建

    create-bookinfo

  3. 工作负载中,确保这四个部署都显示running,代表该应用已经成功创建。

    running

    备注

    应用部署后运行起来可能需要几分钟完成。

任务 2: 访问 Bookinfo

  1. 应用中,点击应用bookinfo查看详细信息。

    click-bookinfo

    备注

    如果您无法在列表中看到该应用,请刷新页面。
  2. 在详细信息页面中显示了用于访问 Bookinfo 应用的主机名和端口号。

    detail-page

  3. 由于将通过 NodePort 在集群外访问该应用,因此您需要在安全组中为出站流量开放上图中的端口(在本例中,端口号为32277),并根据需要设置任意端口转发规则。

  4. 编辑您的本地主机文件(/etc/hosts),添加一条配置将主机名映射到对应的公网 IP。例如:

    # {Public IP} {hostname}
    139.198.19.38 productpage.demo-project.192.168.0.2.nip.io
    

    警告

    不要直接复制上述内容到本地主机文件,请将其替换成您自己环境的公网 IP 与主机名。
  5. 完成后,点击点击访问按钮访问该应用。

    click-to-visit

  6. 在应用详情页面,点击左下角的 Normal user

    normal-user

  7. 在下图中,您可以注意到 Book Reviews 仅出现 Reviewer1Reviewer2 并且没有任何星星,这是当前应用程序版本的状态。在下面的任务中,您可以通过金丝雀发布看到不同的 UI 展现。

    book-review

Task 3: 创建金丝雀发布

  1. 回到 KubeSphere 控制台并选择灰度发布,点击发布灰度任务跳转到项目的灰度发布部分,然后选择金丝雀发布并且点击发布任务

    create-canary-release

    create-job

  2. 添加一个任务名称(例如:canary-release)然后点击下一步,选择 reviews 作为需要更改的组件并点击下一步

    canary-release

  3. 在下一个对话框中,输入v2作为灰度版本号并修改镜像为kubesphere/examples-bookinfo-reviews-v2:1.13.0v1更改为v2),点击下一步继续。

    release-version

  4. 金丝雀发布支持两种发布策略:按流量比例下发按请求内容下发。在本教程中,请选择按流量比例下发并为 v1 和 v2 设置相同的流量比例(各50%)。你可以点击中间的图标,然后向左或向右移动以更改流量比例,点击创建完成设置。

    create-canary-release

  5. 创建的任务将会显示在任务状态里。

    canary-release-test

Task 4: 验证金丝雀发布

再次访问 Bookinfo 网站,然后反复刷新浏览器,可以看到 Book Reviews 部分以 50% 的比率在 v1 和 v2 版本之间切换。

verify-canary-release

Task 5: 查看网络拓扑

  1. 在运行 KubeSphere 的机器上执行以下命令来引入真实流量,每 0.5 秒模拟访问一次 Bookinfo。

    watch -n 0.5 "curl http://productpage.demo-project.192.168.0.2.nip.io:32277/productpage?u=normal"
    

    备注

    请确保将上述命令行中的项目名称,IP 地址和端口号替换成您自己环境的。
  2. Traffic Management 中,可以看到不同微服务之间的通信、依赖关系、运行状态及性能。

    traffic-management

  3. 点击组件(例如:reviews)在右侧可以看到流量监控信息,显示 TrafficSuccess rateDuration 的实时数据。

    real-time-data

Task 6: 查看 Tracing 详情

KubeSphere 提供基于 Jaeger 的分布式追踪功能,用来对基于微服务的分布式应用程序进行监控及故障排查。

  1. Tracing 选项卡中,可以清楚地看到请求的所有阶段及内部调用,以及每个阶段的调用耗时。

    tracing

  2. 点击任意条目,可以深入查看请求的详细信息及该请求被处理的位置(在哪个机器或者容器)。

    tracing-kubesphere

Task 7: 接管所有流量

通过金丝雀发布,您可以通过引入部分实际流量并收集用户反馈来在线测试新版本。如果一切运行顺利,则可以将所有流量引入新版本。

  1. 灰度发布中,点击金丝雀发布任务。

    open-canary-release

  2. 在弹出的对话框中,点击 reviews v2 的三个点并选择接管所有流量。这代表 100% 的流量将会被发送到新版本(v2)。

    take-over-release

    备注

    如果新版本出现什么问题,可以随时回滚到之前的 v1 版本。
  3. 重新打开 Bookinfo 页面多刷新几次浏览器,您会发现页面只会显示 reviews v2 的结果(即带有黑色星标的评级)。

    finish-canary-release

Task 8: 移除旧版本

现在新版本 v2 成功接管了所有流量,您可以根据需要删除旧版本并释放 v1 的资源。

警告

删除某个版本后,相关的工作负载和基于 Istio 的配置资源也将被删除。
  1. 灰度发布中,点击金丝雀发布任务。

    open-canary-release

  2. 在弹出的对话框中,点击任务下线以移除旧版本。

    job-offline

以上任务是使用金丝雀发布来控制流量和发布应用程序新版本的示例。您也可以尝试使用灰度发布中的其他不同发布策略,或者查看项目用户指南的相关章节。