3. 部署示例应用:部署一个包含多个微服务的 Bookinfo 应用,并配置 Gateway 与 VirtualService
本章将部署经典的 Bookinfo 示例应用,该应用由四个微服务组成,模拟一个在线书店的典型架构。部署完成后,我们将配置 Istio 的 Gateway 和 VirtualService,使外部流量能够安全、可控地进入服务网格,为后续的故障注入测试奠定基础。
3.1 Bookinfo 应用架构概览
Bookinfo 应用是一个多语言、多版本的服务网格演示应用。其核心业务流程为:用户访问前端页面,前端调用详细信息服务获取书籍信息,同时调用评论服务获取用户评论,评论服务则依赖评分服务获取评分数据。
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
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 验证配置正确性
完成部署和配置后,执行以下步骤进行端到端验证:
- 访问产品页面: 通过浏览器访问
http://<EXTERNAL-IP>/productpage,确认页面正常显示书籍信息。 - 检查页面内容: 刷新页面多次,观察评论部分的变化,确认 reviews 服务的三个版本(无星星、黑色星星、红色星星)轮询出现。
- 查看 Sidecar 日志: 使用
kubectl logs <pod-name> -c istio-proxy查看 Envoy 代理的访问日志,确认流量经过 Gateway 和 VirtualService 路由。
selector 是否匹配 Ingress Gateway 的标签(默认为 istio: ingressgateway),以及 VirtualService 中的 gateways 字段是否引用了正确的 Gateway 名称。
至此,Bookinfo 应用已成功部署并配置了 Istio 流量管理。在下一阶段,我们将基于此环境配置调度亲和性策略,并开始执行故障注入测试。