2. Istio 安装与配置:使用 istioctl 安装、Operator 安装、Profile 选择、自定义配置
在生产环境中部署 Istio 服务网格时,安装方式的选择直接决定了后续运维的复杂度与灵活性。本章将系统讲解四种核心安装路径:istioctl CLI 安装、Operator 安装、Profile 选择策略以及自定义配置覆盖。每种方式都有其适用场景与权衡,理解其底层机制是故障排查的基础。
2.1 安装方式对比与选型
| 安装方式 | 管理模型 | 适用场景 | 升级复杂度 | 生产推荐度 |
|---|---|---|---|---|
| istioctl | CLI 命令驱动 | CI/CD 集成、快速原型、单集群 | 低(手动执行) | ★★★★☆ |
| Operator | Kubernetes CRD 驱动 | 多集群、自动化运维、生命周期管理 | 中(Operator 自动协调) | ★★★★★ |
| Helm | Chart 模板渲染 | 已有 Helm 生态、参数化部署 | 中(需管理 values) | ★★★☆☆ |
| Istio CNI | DaemonSet 插件 | 需降低特权容器权限、合规环境 | 低(作为附加组件) | ★★★★☆ |
选型建议: 对于生产环境,推荐使用 Operator 安装 配合 IstioOperator CR 进行声明式管理。istioctl 更适合临时调试或 CI 流水线中的一次性部署。
2.2 使用 istioctl 安装与 Profile 选择
istioctl 是 Istio 官方提供的命令行工具,支持通过 install 命令直接部署控制平面与数据平面。安装时需指定 Profile,Profile 是一组预定义的配置集合,控制着安装组件的范围与资源规格。
2.2.1 内置 Profile 一览
| Profile 名称 | 控制平面组件 | 数据平面注入 | 资源开销 | 典型用途 |
|---|---|---|---|---|
default |
istiod + ingressgateway | 启用 | 中 | 开发/测试环境 |
demo |
istiod + ingressgateway + egressgateway + addons | 启用 | 高 | 功能演示、学习 |
minimal |
仅 istiod | 启用 | 低 | 最小化部署、边缘集群 |
remote |
无(仅连接外部控制面) | 启用 | 极低 | 多集群主-从架构 |
empty |
无 | 禁用 | 无 | 完全自定义起点 |
preview |
istiod + ingressgateway + egressgateway | 启用 | 高 | 尝鲜新特性 |
2.2.2 安装命令示例
# 下载 istioctl(以 1.21.0 为例)
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.21.0 sh -
cd istio-1.21.0
export PATH=$PWD/bin:$PATH
# 使用 default profile 安装
istioctl install --set profile=default -y
# 使用 demo profile 安装(包含 Kiali、Prometheus、Grafana 等 addons)
istioctl install --set profile=demo -y
# 使用 minimal profile 安装(仅控制平面)
istioctl install --set profile=minimal -y
注意:
demo Profile 会安装大量附加组件,资源消耗较高,请勿在生产环境中直接使用。生产环境建议从 default 或 minimal 开始,按需添加组件。
2.3 Operator 安装与声明式管理
Istio Operator 将 Istio 的生命周期管理抽象为 Kubernetes 原生资源 IstioOperator。Operator 会持续协调集群状态,确保实际部署与 CR 声明一致。这种方式特别适合 GitOps 工作流与多集群统一管理。
2.3.1 Operator 安装步骤
- 部署 Operator 本身:使用 istioctl 或 Helm 将 Operator 组件安装到
istio-operator命名空间。 - 创建 IstioOperator CR:编写 YAML 文件定义控制平面配置。
- Operator 自动协调:Operator 检测到 CR 后,自动执行安装或升级。
# 使用 istioctl 安装 Operator
istioctl operator init
# 查看 Operator Pod 是否就绪
kubectl get pods -n istio-operator
# 创建 IstioOperator CR(保存为 iop-default.yaml)
cat <<EOF | kubectl apply -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: example-istiocontrolplane
spec:
profile: default
components:
ingressGateways:
- name: istio-ingressgateway
enabled: true
k8s:
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
EOF
2.3.2 Operator 架构示意
2.4 自定义配置与覆盖策略
无论是 istioctl 还是 Operator,都支持通过 Overlay(覆盖) 机制修改默认配置。覆盖配置可以精细到单个组件的资源限制、副本数、端口映射、环境变量等。
2.4.1 配置覆盖层级
- 全局配置(meshConfig):影响所有 sidecar 和网关,如默认 mTLS 模式、访问日志格式、追踪采样率。
- 组件配置(components):针对 istiod、ingressgateway、egressgateway 的独立设置。
- K8s 资源覆盖(k8s):直接透传 Kubernetes 原生字段,如
resources、affinity、tolerations、hpaSpec。 - 附加组件(addons):集成 Prometheus、Kiali、Grafana、Jaeger 时的自定义配置。
2.4.2 自定义配置示例
# 使用 istioctl 安装时通过 --set 覆盖
istioctl install --set profile=default \
--set meshConfig.enableTracing=true \
--set meshConfig.defaultConfig.tracingSampling=10.0 \
--set components.ingressGateways[0].k8s.resources.requests.cpu=200m \
--set components.ingressGateways[0].k8s.resources.requests.memory=256Mi
# 使用 Operator CR 进行声明式覆盖
cat <<EOF | kubectl apply -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: production-config
spec:
profile: default
meshConfig:
enableTracing: true
defaultConfig:
tracingSampling: 10.0
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
components:
pilot:
k8s:
replicaCount: 3
resources:
requests:
cpu: 1000m
memory: 2Gi
limits:
cpu: 2000m
memory: 4Gi
hpaSpec:
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 80
ingressGateways:
- name: istio-ingressgateway
enabled: true
k8s:
serviceAnnotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
resources:
requests:
cpu: 500m
memory: 512Mi
values:
global:
proxy:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
EOF
关键原则: 使用 Operator 时,所有配置变更只需修改
IstioOperator CR 并重新 apply,Operator 会自动计算 diff 并执行滚动更新。这避免了手动执行 istioctl upgrade 可能带来的版本不一致问题。
2.5 安装验证与常见故障
2.5.1 验证命令
# 检查控制平面 Pod 状态
kubectl get pods -n istio-system
# 检查 Istio 版本与组件健康
istioctl version
# 检查 sidecar 注入状态
kubectl get namespace -L istio-injection
# 检查数据平面 sidecar 是否正常
istioctl proxy-status
# 检查配置是否生效
istioctl describe pod <pod-name> -n <namespace>
2.5.2 常见安装故障排查
| 故障现象 | 可能原因 | 排查命令 / 方法 |
|---|---|---|
| istiod Pod 一直 Pending | 资源不足、PVC 未就绪、节点污点 | kubectl describe pod istiod-xxx -n istio-system |
| sidecar 注入失败 | 命名空间标签缺失、webhook 未注册 | kubectl get mutatingwebhookconfiguration |
| 网关无法获取 LoadBalancer IP | 云厂商 LB 控制器未就绪、annotation 错误 | kubectl get svc istio-ingressgateway -n istio-system |
| istioctl proxy-status 显示 stale | Pilot 与 sidecar 连接中断、配置推送失败 | istioctl proxy-config log <pod> --level debug |
| Operator 未协调 CR | Operator Pod 未运行、CR 命名空间错误 | kubectl logs -n istio-operator deployment/istio-operator |
2.6 安装配置决策流程
生产最佳实践: 始终从
default Profile 开始,通过 IstioOperator CR 进行增量覆盖。将 CR 文件纳入 Git 版本管理,确保每次变更可追溯、可回滚。安装完成后,立即执行 istioctl verify-install 进行完整性校验。