3. 部署示例应用:部署一个包含多个微服务的 Bookinfo 应用,并配置 Gateway 与 VirtualService

本章将部署经典的 Bookinfo 示例应用,该应用由四个微服务组成,模拟一个在线书店的典型架构。部署完成后,我们将配置 Istio 的 Gateway 和 VirtualService,使外部流量能够安全、可控地进入服务网格,为后续的故障注入测试奠定基础。

3.1 Bookinfo 应用架构概览

Bookinfo 应用是一个多语言、多版本的服务网格演示应用。其核心业务流程为:用户访问前端页面,前端调用详细信息服务获取书籍信息,同时调用评论服务获取用户评论,评论服务则依赖评分服务获取评分数据。

架构特点: 该应用天然包含多个服务间调用链,且评论服务 (reviews) 存在三个不同版本 (v1/v2/v3),非常适合用于测试流量路由、故障注入及调度亲和性策略下的容错行为。
Bookinfo 应用微服务架构图 Bookinfo 应用微服务架构图 外部客户端 (Client) Istio Ingress Gateway productpage (Python) details (Ruby) reviews (Java) v1/v2/v3 ratings (Node.js) 说明: reviews 服务包含三个版本:v1(无评分)、v2(黑色星星评分)、v3(红色星星评分)。

3.2 部署 Bookinfo 应用

使用 Istio 提供的官方部署文件,可以快速将 Bookinfo 应用部署到 Kubernetes 集群中。请确保当前命名空间已启用 Istio 自动注入 Sidecar。

3.2.1 启用 Sidecar 自动注入

为当前命名空间(例如 default)打上标签,以便 Istio 自动为 Pod 注入 Envoy Sidecar 代理。

kubectl label namespace default istio-injection=enabled

3.2.2 部署应用

从 Istio 安装目录或官方仓库部署 Bookinfo 应用。

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

3.2.3 验证部署状态

等待所有 Pod 进入 Running 状态,并确认每个 Pod 包含两个容器(业务容器 + Istio Proxy)。

kubectl get pods
# 预期输出示例:
# NAME                              READY   STATUS    RESTARTS   AGE
# details-v1-79c697d847-7k7l9       2/2     Running   0          2m
# productpage-v1-6c87f6f9b9-8t2p5   2/2     Running   0          2m
# ratings-v1-7d99676d7b-8v7k2       2/2     Running   0          2m
# reviews-v1-6d6f5d4b5b-2s5g8       2/2     Running   0          2m
# reviews-v2-6d6f5d4b5b-3j9h1       2/2     Running   0          2m
# reviews-v3-6d6f5d4b5b-4k2i3       2/2     Running   0          2m
验证要点: 确保 READY 列显示为 2/2,表示业务容器和 Sidecar 代理均已成功启动。如果显示 1/2,请检查命名空间标签是否正确设置。

3.3 配置 Gateway 与 VirtualService

为了让外部流量能够访问 Bookinfo 应用,需要创建 Istio Gateway 和 VirtualService 资源。Gateway 负责在网格边缘暴露入口,VirtualService 则定义流量路由规则。

3.3.1 创建 Gateway

Gateway 配置监听 HTTP 80 端口,允许来自所有来源的流量。

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
EOF

3.3.2 创建 VirtualService

VirtualService 将 Gateway 接收到的流量路由到 productpage 服务。

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

3.3.3 获取外部访问地址

获取 Istio Ingress Gateway 的外部 IP 或主机名。

kubectl get svc istio-ingressgateway -n istio-system
# 示例输出:
# NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)
# istio-ingressgateway   LoadBalancer   10.96.123.45    192.168.1.100  80:31380/TCP

使用浏览器访问 http://<EXTERNAL-IP>/productpage,验证 Bookinfo 应用是否正常运行。

3.4 配置清单与关键参数

下表总结了部署和配置过程中涉及的关键资源及其作用。

资源类型 资源名称 作用说明
Deployment productpage-v1 前端服务,Python 实现,负责页面渲染
Deployment details-v1 书籍详细信息服务,Ruby 实现
Deployment reviews-v1/v2/v3 评论服务,Java 实现,三个版本用于测试路由
Deployment ratings-v1 评分服务,Node.js 实现
Service productpage / details / reviews / ratings Kubernetes Service,为 Pod 提供稳定的网络端点
Gateway bookinfo-gateway Istio 入口网关,暴露 HTTP 80 端口
VirtualService bookinfo 定义流量路由规则,将请求转发至 productpage

3.5 验证配置正确性

完成部署和配置后,执行以下步骤进行端到端验证:

  1. 访问产品页面: 通过浏览器访问 http://<EXTERNAL-IP>/productpage,确认页面正常显示书籍信息。
  2. 检查页面内容: 刷新页面多次,观察评论部分的变化,确认 reviews 服务的三个版本(无星星、黑色星星、红色星星)轮询出现。
  3. 查看 Sidecar 日志: 使用 kubectl logs <pod-name> -c istio-proxy 查看 Envoy 代理的访问日志,确认流量经过 Gateway 和 VirtualService 路由。
常见问题: 如果页面无法访问,请检查 Gateway 的 selector 是否匹配 Ingress Gateway 的标签(默认为 istio: ingressgateway),以及 VirtualService 中的 gateways 字段是否引用了正确的 Gateway 名称。

至此,Bookinfo 应用已成功部署并配置了 Istio 流量管理。在下一阶段,我们将基于此环境配置调度亲和性策略,并开始执行故障注入测试。