4. 环境准备:Kubernetes集群、Istio安装、示例微服务部署(Bookinfo)

本章节将搭建完整的实验环境,作为后续访问控制策略变更与回滚护栏实战的基础设施。环境包含三个层次:底层 Kubernetes 集群、服务网格层 Istio、以及上层示例应用 Bookinfo。所有操作均基于命令行,确保可复现。

4.1 环境概览与版本要求

本课程实验环境推荐使用以下软件版本组合,已通过兼容性验证:

组件 推荐版本 说明
Kubernetes v1.28+ 支持 Gateway API 及 Istio 最新特性
Istio 1.22+ 包含 Ambient Mesh 模式支持
kubectl v1.28+ 与集群版本匹配
Helm v3.12+ 用于 Istio 安装(可选)
Docker 24.0+ 本地镜像构建(非必需)
环境提示: 若使用云厂商托管集群(如 AKS、EKS、GKE),请确保集群已启用 OIDC 认证且支持 Service Mesh 所需的网络策略。本地开发推荐使用 kind 或 minikube 快速搭建。

4.2 Kubernetes 集群准备

本实验使用 kind 创建本地多节点集群,配置如下:

# 创建 kind 集群配置文件
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
  - role: worker
  - role: worker
networking:
  podSubnet: "10.244.0.0/16"
  serviceSubnet: "10.96.0.0/12"
EOF

# 创建集群
kind create cluster --config kind-config.yaml --name istio-demo

# 验证集群状态
kubectl cluster-info --context kind-istio-demo
kubectl get nodes -o wide

集群就绪后,确认节点状态均为 Ready,且 kube-system 命名空间下的核心组件运行正常。

4.3 Istio 安装与配置

采用 istioctl 工具进行安装,便于后续配置管理。安装步骤分为下载工具、部署控制面、注入 sidecar 三个环节。

4.3.1 下载并安装 istioctl

# 下载 Istio 最新稳定版
curl -L https://istio.io/downloadIstio | sh -
cd istio-1.22.0
export PATH=$PWD/bin:$PATH

# 安装 Istio 控制面(demo 配置包含完整可观测组件)
istioctl install --set profile=demo -y

4.3.2 验证 Istio 组件

安装完成后,检查 istio-system 命名空间下的 Pod 状态:

kubectl get pods -n istio-system
kubectl get svc -n istio-system

预期输出应包含以下核心组件:

  • istiod:控制面核心,负责配置分发与证书管理
  • istio-ingressgateway:入口网关,接收外部流量
  • istio-egressgateway:出口网关(可选)
  • prometheus:指标收集
  • kiali:服务拓扑可视化
  • grafana:仪表盘
关键配置: 本实验启用 demo profile 是为了获得完整的可观测性组件,便于后续回滚护栏的监控验证。生产环境建议使用 default profile 并按需裁剪。

4.3.3 为默认命名空间启用自动注入

# 为 default 命名空间打上注入标签
kubectl label namespace default istio-injection=enabled

# 验证标签
kubectl get namespace -L istio-injection

4.4 示例微服务部署:Bookinfo

Bookinfo 是 Istio 官方提供的示例应用,由四个微服务组成,模拟图书信息展示场景。其架构关系如下:

Bookinfo 微服务架构图 productpage (9080) details (9080) reviews (9080) ratings (9080) 服务调用关系说明 productpage 同时调用 details 和 reviews reviews 调用 ratings 获取评分数据 每个服务均暴露 9080 端口,通过 HTTP 通信

4.4.1 部署 Bookinfo 应用

# 部署所有微服务
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.22/samples/bookinfo/platform/kube/bookinfo.yaml

# 等待 Pod 就绪
kubectl wait --for=condition=Ready pods --all -n default --timeout=120s

# 验证服务列表
kubectl get services
kubectl get pods

预期输出应包含以下 4 个 Service 和对应的 Pod:

Service 名称 Pod 数量 版本 功能
productpage 1 v1 前端页面聚合
details 1 v1 图书详情
reviews 1 v1, v2, v3 图书评论(多版本)
ratings 1 v1 评分数据

4.4.2 配置入口网关访问

# 部署 Istio 网关和虚拟服务
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.22/samples/bookinfo/networking/bookinfo-gateway.yaml

# 获取网关地址
export INGRESS_HOST=$(kubectl get svc istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT=$(kubectl get svc istio-ingressgateway -n istio-system -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')

# 验证访问
curl -s "http://${INGRESS_HOST}:${INGRESS_PORT}/productpage" | head -20
常见问题: 若使用 kind 集群且未安装负载均衡器,INGRESS_HOST 可能为空。此时可通过端口转发临时访问:kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80,然后访问 http://localhost:8080/productpage。

4.5 环境验证清单

完成上述步骤后,执行以下验证命令确保环境就绪:

# 1. 集群节点状态
kubectl get nodes

# 2. Istio 控制面健康
istioctl verify-install

# 3. Sidecar 注入状态
kubectl get pods -n default -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.annotations.sidecar\.istio\.io/status}{"\n"}{end}'

# 4. 服务网格拓扑(需安装 Kiali)
istioctl dashboard kiali

所有 Pod 应处于 Running 状态,且每个 Pod 包含 2 个容器(业务容器 + istio-proxy sidecar)。Kiali 仪表盘应显示完整的服务调用关系图。

4.6 环境清理(可选)

实验结束后,如需清理环境,可执行:

# 删除 Bookinfo 应用
kubectl delete -f https://raw.githubusercontent.com/istio/istio/release-1.22/samples/bookinfo/platform/kube/bookinfo.yaml

# 卸载 Istio
istioctl uninstall --purge -y

# 删除 kind 集群
kind delete cluster --name istio-demo