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
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
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
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
istioctl analyze 进行静态检查,避免将错误配置推送到生产集群。
3.5 安装与验证流程总览
下图展示了从下载 istioctl 到验证 Sidecar 注入的完整流程,帮助你建立全局视角。
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 级别输出