3. Istio 安装与配置:使用 istioctl 安装 Istio、配置 Profile、注入 Sidecar、验证组件运行状态

本章是服务网格实战的基石。你将学习使用 istioctl 命令行工具完成 Istio 的完整安装流程,包括选择 Profile、注入 Sidecar 以及验证控制面与数据面的健康状态。掌握这些操作后,你才能安全地进入后续的金丝雀发布与流量拓扑管理环节。

3.1 安装环境准备与 istioctl 下载

在安装 Istio 之前,请确保你的 Kubernetes 集群满足以下最低要求。推荐使用 Kubernetes 1.25 及以上版本,并具备集群管理员权限。

环境项 最低要求 推荐配置
Kubernetes 版本 1.23 1.27+
可用内存(控制面节点) 4 GB 8 GB
CPU(控制面节点) 2 核 4 核
集群网络插件 支持 CNI Calico / Flannel

下载最新版 Istio 发行包,其中包含 istioctl 二进制文件、示例 YAML 和 Helm Chart。

# 下载 Istio 1.20.3(请根据实际版本调整)
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.20.3 sh -
cd istio-1.20.3

# 将 istioctl 加入 PATH
export PATH=$PWD/bin:$PATH
echo 'export PATH=$PWD/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 验证安装
istioctl version --remote=false
💡 提示: 如果网络受限,可以提前将 Istio 发行包上传到内网镜像仓库或使用 istioctl install --set hub=your-registry 指定私有镜像地址。

3.2 选择 Profile 并执行安装

Istio 提供了多种内置 Profile,用于快速适配不同场景。Profile 本质上是 IstioOperator CR 的一组预设值,控制着控制面组件的启停与资源配置。

Profile 名称 适用场景 包含组件
default 生产环境标准部署 istiod、ingressgateway、egressgateway
demo 开发测试、功能演示 default + 完整遥测 + 更多资源
minimal 最小化控制面 仅 istiod
remote 多集群远程控制面 istiod(远程模式)
empty 完全自定义 无预设组件

本课程采用 default Profile 作为基础,并开启访问日志与 Prometheus 集成。

# 使用 default Profile 安装
istioctl install --set profile=default -y

# 安装完成后,查看控制面 Pod 状态
kubectl get pods -n istio-system

输出示例:

NAME                                    READY   STATUS    RESTARTS   AGE
istiod-5f4c8d6b7c-abcde                 1/1     Running   0          2m
istio-ingressgateway-7f9c8d6b7c-xyz     1/1     Running   0          2m
istio-egressgateway-6b5c4d3e2f-uvw      1/1     Running   0          2m
🔑 关键点: 如果只想在特定命名空间启用 Sidecar 注入,可以跳过全局注入,后续按需注入。生产环境建议使用 default Profile 并关闭不必要的 egressgateway 以节省资源。

3.3 注入 Sidecar:自动注入与手动注入

Sidecar 注入是服务网格的核心操作。Istio 支持两种注入方式:自动注入(基于 Webhook)和手动注入(基于 istioctl kube-inject)。

3.3.1 启用命名空间自动注入

为命名空间添加标签 istio-injection=enabled,之后在该命名空间下创建的所有 Pod 都会自动注入 Envoy Sidecar。

# 为 default 命名空间启用自动注入
kubectl label namespace default istio-injection=enabled

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

3.3.2 手动注入(用于调试或 CI/CD 管道)

手动注入适用于不想依赖 Webhook 的场景,例如在离线环境或需要精确控制注入时机时。

# 手动注入并直接应用
istioctl kube-inject -f deployment.yaml | kubectl apply -f -

# 或者先查看注入后的 YAML 内容
istioctl kube-inject -f deployment.yaml > injected-deployment.yaml

3.3.3 验证 Sidecar 注入成功

Pod 启动后,检查 READY 列是否为 2/2(业务容器 + Envoy 容器)。

kubectl get pods -n default

# 输出示例
NAME                       READY   STATUS    RESTARTS   AGE
productpage-v1-6b7c8d9e0   2/2     Running   0          1m
reviews-v1-5f4c8d6b7c      2/2     Running   0          1m
⚠️ 常见问题: 如果 Pod 一直处于 Init:CrashLoopBackOff 状态,通常是因为 Sidecar 注入器无法拉取 proxyv2 镜像。请检查镜像仓库地址或配置私有镜像拉取 Secret。

3.4 验证组件运行状态

安装完成后,必须从控制面、数据面、网络连通性三个维度进行验证,确保网格基础架构健康。

3.4.1 控制面健康检查

检查 istiod 是否正常提供服务,以及 CRD 是否已注册。

# 检查 istiod 端点
kubectl get endpoints -n istio-system istiod

# 检查核心 CRD 是否存在
kubectl get crd | grep istio

3.4.2 数据面连通性测试

部署一个测试 Pod 并尝试访问服务网格内部的服务。

# 部署 sleep Pod 用于测试
kubectl apply -f samples/sleep/sleep.yaml

# 进入 sleep 容器,测试访问 productpage
kubectl exec -it deploy/sleep -- curl -s http://productpage:9080/ | head -n 20

3.4.3 使用 istioctl 进行全链路诊断

istioctl 提供了强大的诊断命令,可以快速定位配置错误或网络问题。

# 分析集群中的 Istio 配置
istioctl analyze

# 查看特定 Pod 的 Sidecar 状态
istioctl proxy-status

# 查看 Envoy 配置转储
istioctl proxy-config cluster deploy/productpage-v1
💡 最佳实践: 每次修改 Istio 配置后,都运行 istioctl analyze 进行静态检查,避免将错误配置推送到生产集群。

3.5 安装与验证流程总览

下图展示了从下载 istioctl 到验证 Sidecar 注入的完整流程,帮助你建立全局视角。

Istio 安装与验证流程 Istio 安装与验证流程 下载 istioctl 选择 Profile istioctl install 注入 Sidecar 验证控制面 (istiod) 验证数据面 (Sidecar) istioctl analyze 💡 建议按顺序执行:下载 → 选择 Profile → 安装 → 注入 → 三路验证

3.6 常见安装问题与排查

问题现象 可能原因 解决方案
istiod Pod 一直 Pending 节点资源不足 / 缺少 StorageClass 增加节点资源或调整 istiod 资源限制
Sidecar 注入后 Pod 启动失败 proxyv2 镜像拉取失败 配置 imagePullPolicy: Always 或使用私有仓库
istioctl analyze 报错 CRD 版本不匹配 / 配置冲突 升级 istioctl 版本或删除冲突资源
服务间调用返回 503 mTLS 配置不一致 / 目标规则缺失 检查 PeerAuthentication 和 DestinationRule
📌 课后自检清单:
  • ✅ 确认 istioctl version 输出与安装版本一致
  • ✅ 确认 kubectl get pods -n istio-system 所有 Pod 均为 Running 状态
  • ✅ 确认业务命名空间已打上 istio-injection=enabled 标签
  • ✅ 确认业务 Pod 的 READY 列为 2/2
  • ✅ 运行 istioctl analyze 无 Error 级别输出