4. 微服务应用部署:部署 Bookinfo 示例应用、验证 Sidecar 注入、确认服务间通信

本章将完成服务网格实验环境的第一个关键里程碑:部署 Istio 官方提供的 Bookinfo 示例应用,验证 Sidecar 代理是否成功注入到每个 Pod 中,并确认微服务之间的通信是否正常。这是后续进行流量管理和金丝雀发布的基础。

4.1 Bookinfo 应用架构概览

Bookinfo 是一个模拟在线书店的微服务应用,由四个独立的服务组成。理解其调用关系是后续流量拓扑分析的前提。

服务名称 语言 功能描述 版本
productpage Python 前端页面聚合器,调用 details 和 reviews 服务 v1
details Ruby 提供书籍详细信息 v1
reviews Java 提供书籍评论,并调用 ratings 服务 v1, v2, v3
ratings Node.js 提供书籍评分数据 v1
架构要点: reviews 服务存在三个版本(v1/v2/v3),这是后续实现金丝雀发布和流量路由的关键。v1 不调用 ratings,v2 和 v3 调用 ratings 但展示方式不同。
Bookinfo 微服务架构与调用链 Bookinfo 微服务调用拓扑 productpage (v1) details (v1) reviews (v1/v2/v3) ratings (v1) 调用 调用 调用 说明: • productpage 是唯一面向用户的入口服务,聚合 details 和 reviews 的数据。 • reviews 服务有三个版本,v1 不调用 ratings;v2/v3 调用 ratings 但展示方式不同。 • 所有服务间调用均通过 Istio Sidecar 代理(Envoy)进行拦截和路由。

4.2 部署 Bookinfo 应用

使用 kubectl apply 命令部署 Bookinfo 应用。Istio 安装包中已包含部署所需的 YAML 文件。

# 进入 Istio 安装目录
cd /opt/istio-1.20.0

# 部署 Bookinfo 应用(默认不注入 Sidecar)
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

# 确认所有 Pod 和 Service 已创建
kubectl get pods,svc -n default
预期输出: 四个 Pod 均处于 Running 状态,且每个 Pod 的 READY 列显示为 1/1(仅业务容器,尚无 Sidecar)。

4.3 启用 Sidecar 自动注入

Sidecar 注入有两种方式:手动注入和自动注入。在生产环境中推荐使用自动注入。我们需要为 default 命名空间打上注入标签。

# 为 default 命名空间添加 istio-injection=enabled 标签
kubectl label namespace default istio-injection=enabled

# 验证标签是否生效
kubectl get namespace -L istio-injection

标签添加后,新创建的 Pod 会自动注入 Envoy Sidecar 容器。对于已存在的 Pod,需要滚动重启才能生效。

# 滚动重启所有 Bookinfo Pod 以触发 Sidecar 注入
kubectl rollout restart deployment -n default

# 等待 Pod 重新就绪
kubectl get pods -n default -w

4.4 验证 Sidecar 注入状态

Pod 重启后,检查每个 Pod 的 READY 列。如果 Sidecar 注入成功,READY 列应显示为 2/2(一个业务容器 + 一个 Envoy 代理容器)。

Pod 名称 READY STATUS RESTARTS
productpage-v1-xxxxx 2/2 Running 0
details-v1-xxxxx 2/2 Running 0
reviews-v1-xxxxx 2/2 Running 0
ratings-v1-xxxxx 2/2 Running 0
常见问题: 如果 Pod 的 READY 列仍为 1/1,请检查命名空间标签是否已正确设置,或使用 kubectl describe pod <pod-name> 查看 Events 中是否有注入失败的提示。
Sidecar 注入前后 Pod 结构对比 Sidecar 注入前后 Pod 结构对比 注入前 (1/1) 业务容器 仅包含业务逻辑 无流量拦截能力 注入 注入后 (2/2) 业务容器 Envoy Sidecar 拦截所有进出流量 执行路由与策略

4.5 确认服务间通信

部署完成后,需要验证服务间的通信是否正常。我们可以通过以下步骤进行端到端验证:

  1. 启动测试客户端: 使用 Istio 提供的 sleep Pod 作为测试工具。
  2. 从集群内部访问 productpage: 验证前端服务是否正常返回 HTML。
  3. 验证 reviews 调用 ratings: 确认 reviews 服务能够正确获取评分数据。
# 部署 sleep 测试 Pod
kubectl apply -f samples/sleep/sleep.yaml

# 进入 sleep Pod 的容器
kubectl exec -it deploy/sleep -- sh

# 测试 productpage 服务(在 sleep 容器内执行)
curl -s http://productpage:9080 | head -20

# 测试 reviews 服务直接调用
curl -s http://reviews:9080/reviews/1

# 测试 ratings 服务
curl -s http://ratings:9080/ratings/1
验证要点: 如果所有 curl 命令都返回了预期的 JSON 或 HTML 内容,说明服务间通信正常,且 Sidecar 代理已成功拦截并转发了流量。此时,Bookinfo 应用已完全运行在 Istio 服务网格中。

4.6 本章小结

通过本章操作,我们完成了以下关键任务:

  • 部署了 Bookinfo 示例应用,理解了其四层微服务调用架构。
  • 为 default 命名空间启用了 Sidecar 自动注入。
  • 验证了每个 Pod 中 Envoy 代理的注入状态(2/2)。
  • 通过集群内测试确认了服务间通信链路正常。