本文目录导读:

- 核心组件概览
- 前提准备
- 步骤一:下载并安装 Istio CLI
- 步骤二:安装 Istio 控制平面
- 步骤三:启用 Sidecar 自动注入
- 步骤四:部署一个示例应用(验证功能)
- 步骤五:配置核心流量管理功能
- 步骤六:可观测性(监控、日志、链路追踪)
- 步骤七:安全配置(mTLS)
- 生产环境关键注意事项
- 常见故障排查
搭建开源服务网格,最主流的选择是 Istio(搭配 Envoy 数据平面),以下是基于 Istio 的完整搭建指南,涵盖了从环境准备到核心功能的配置。
核心组件概览
- 数据平面:通常由 Envoy 代理组成,以 Sidecar 模式注入到每个 Pod 中,负责拦截和管理进出服务的所有流量。
- 控制平面:Istiod,负责配置管理、证书签发和策略下发。
前提准备
- Kubernetes 集群:推荐版本 v1.27 – v1.30,至少 4 核 CPU、8GB 内存(生产环境要求更高)。
- kubectl:与集群版本兼容。
- Helm(可选,但推荐用于生产环境)。
下载并安装 Istio CLI
# 下载最新版本(推荐 v1.22 或更高) curl -L https://istio.io/downloadIstio | sh - # 将 istioctl 添加到 PATH cd istio-1.22.* export PATH=$PWD/bin:$PATH # 验证安装 istioctl version
安装 Istio 控制平面
Istio 提供了多种配置文件(Profile),包括 default、demo、minimal 等。
-
demo 配置:适合测试和体验,功能齐全,但资源占用较高。
-
default 配置:适合生产环境的基础配置。
-
minimal 配置:仅安装 Istiod,适合自建组件。
-
快速安装(使用 istioctl)
# 安装 demo 配置(启用所有功能,包含 Kiali、Prometheus、Grafana 等插件) istioctl install --set profile=demo -y # 安装 default 配置(轻量,适合生产) # istioctl install --set profile=default -y
-
使用 Helm(生产最佳实践)
# 添加 Helm 仓库 helm repo add istio https://istio-release.storage.googleapis.com/charts helm repo update # 创建命名空间 kubectl create namespace istio-system # 安装 base(CRD 资源) helm install istio-base istio/base -n istio-system # 安装 istiod(控制平面) helm install istiod istio/istiod -n istio-system --wait # 可选:安装 Ingress/Egress Gateway helm install istio-ingress istio/gateway -n istio-system --wait
-
验证安装:
kubectl get pods -n istio-system # 应该看到 istiod-xxx-xxx 处于 Running 状态
启用 Sidecar 自动注入
Service Mesh 的关键在于让每个 Pod 自动携带一个 Envoy 代理,你需要为目标命名空间开启注入标签。
# 1. 为 default 命名空间打上注入标签 kubectl label namespace default istio-injection=enabled # 2. 验证标签是否生效 kubectl get namespace -L istio-injection # 3. (可选)如果你希望为不同命名空间使用不同配置,可以为指定 deployment 手动注入: # kubectl annotate deployment <deployment-name> sidecar.istio.io/inject="true"
部署一个示例应用(验证功能)
推荐部署 Istio 自带的 Bookinfo 示例,它是一个包含多个微服务的应用。
# 1. 部署应用(会自动注入 Sidecar) kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.22/samples/bookinfo/platform/kube/bookinfo.yaml # 2. 部署 Ingress Gateway,使外部流量可以访问 kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.22/samples/bookinfo/networking/bookinfo-gateway.yaml # 3. 查看所有 Pod 是否都包含 2 个容器(业务容器 + istio-proxy) kubectl get pods # 输出示例: # NAME READY STATUS RESTARTS AGE # details-v1-xxx 2/2 Running 0 5m # productpage-v1-xxx 2/2 Running 0 5m # ratings-v1-xxx 2/2 Running 0 5m # reviews-v1-xxx 2/2 Running 0 5m
- 重点检查:每个 Pod 的
READY列必须为2/2(业务容器 + Sidecar 代理),如果只有1/1,说明注入失败,需要检查命名空间标签或 Pod 标签。
配置核心流量管理功能
服务网格的强大之处在于通过配置(而非修改代码)来控制流量。
-
路由规则(VirtualService & DestinationRule)
# 示例:将所有流量路由到 reviews 服务的 v2 版本 apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v2 --- apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: reviews spec: host: reviews subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 -
故障注入(测试韧性)
# 模拟针对 reviews 服务 50% 的请求延迟 5 秒 apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - fault: delay: percentage: value: 50 fixedDelay: 5s route: - destination: host: reviews subset: v2 -
超时与重试
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - timeout: 10s retries: attempts: 3 perTryTimeout: 2s route: - destination: host: ratings
可观测性(监控、日志、链路追踪)
Istio 原生集成了 telemetry 功能,可以输出指标、日志和链路。
-
安装 Kiali(可视化服务拓扑):许多安装方式已包含 Kiali,如果没有则:
kubectl apply -f samples/addons/kiali.yaml
-
暴露 Web UI:
# 先确保 kiali 部署完成 kubectl rollout status deployment kiali -n istio-system # 端口转发以访问 web UI istioctl dashboard kiali &
-
访问 Prometheus / Grafana:
istioctl dashboard prometheus istioctl dashboard grafana
-
开启 Access Log(访问日志):
apiVersion: telemetry.istio.io/v1 kind: Telemetry metadata: name: mesh-default namespace: istio-system spec: accessLogging: - providers: - name: envoy
安全配置(mTLS)
默认情况下,Istio 会启用 宽容模式(Permissive),允许非网格流量,建议改为 严格模式 以强制所有服务间加密。
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICT
生产环境关键注意事项
- 资源规划:每个 Sidecar 会额外占用约 50MB 内存(Idle),建议为集群预留 30% 左右的内存用于 Sidecar。
- 性能调优:调整 Envoy 的并发连接数(
concurrency)和连接池大小。 - 高可用部署:Istiod 至少 2 副本,Gateway 至少 2 副本,并配置 PDB。
- 升级策略:使用 金丝雀升级(Canary Upgrade),逐步替换控制平面。
- CNI 支持:如果不想在 Pod 中挂载
istio-init初始化容器(需要 NET_ADMIN 权限),可以部署 Istio CNI 插件。
常见故障排查
| 现象 | 原因 | 解决 |
|---|---|---|
Pod 一直处于 Init:0/1 |
Init 容器拉取镜像失败 | 检查 Envoy 镜像地址(proxyv2),或配置镜像仓库代理。 |
Pod 只显示 1/1 |
Sidecar 注入失败 | 检查命名空间是否打标(istio-injection=enabled)。 |
| 服务间请求超时 | mTLS 不匹配 | 检查 PeerAuthentication 和 DestinationRule 的 mTLS 配置。 |
| 流量不按规则走 | VirtualService 未生效 | 检查 VirtualService 的 hosts 字段是否匹配 Kubernetes Service 名称。 |
通过以上步骤,你应该可以搭建起一个功能完整的开源服务网格(基于 Istio + Envoy),核心部署模型是:一个 Kubernetes 集群,一个 Istiod 控制平面,多个 Gateway 和 Sidecar 组成的 Mesh 网络。