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 官方提供的示例应用,由四个微服务组成,模拟图书信息展示场景。其架构关系如下:
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