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 但展示方式不同。
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 中是否有注入失败的提示。
4.5 确认服务间通信
部署完成后,需要验证服务间的通信是否正常。我们可以通过以下步骤进行端到端验证:
- 启动测试客户端: 使用 Istio 提供的
sleepPod 作为测试工具。 - 从集群内部访问 productpage: 验证前端服务是否正常返回 HTML。
- 验证 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)。 - 通过集群内测试确认了服务间通信链路正常。