必须先部署 Istio 控制平面并启用命名空间自动 Sidecar 注入,否则流量策略无效;安装 1.21.3 版本后执行 istioctl install --set profile=demo,待 istiod 运行再标记 default 命名空间启用注入。

要在 Kubernetes 集群中启用服务级流量控制、mTLS 加密与统一可观测性,必须先完成 Istio 控制平面部署并确保 Envoy Sidecar 能自动注入到业务 Pod 中,否则所有 VirtualService、DestinationRule 等策略将无法生效。
安装 Istio 控制平面
下载并解压最新稳定版 Istio(当前适配 Kubernetes 1.26+ 的推荐版本为 1.21.3):
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.21.3 sh -
进入解压目录,将 istioctl 加入系统 PATH:
export PATH=$PWD/istio-1.21.3/bin:$PATH
执行 demo 配置安装——该 profile 启用基本组件(istiod、Prometheus、Grafana、Kiali),适合验证与开发环境:
istioctl install --set profile=demo -y
【必须等待 istiod Pod 进入 Running 状态后再进行下一步】,可用 kubectl get pod -n istio-system 观察,直到 READY 列显示 1/1 且 STATUS 为 Running。
启用命名空间自动 Sidecar 注入
Sidecar 注入不是全局默认开启的,必须显式标记目标命名空间:
kubectl label namespace default istio-injection=enabled
这条命令触发 Istio 的 MutatingWebhookConfiguration,使后续在 default 命名空间创建的 Pod 在调度前被自动修改模板,插入 Envoy 容器和 InitContainer。
注意:已存在的 Pod 不受影响,仅对新创建的 Pod 生效;若误标其他命名空间(如 kube-system),可能导致系统组件异常,切勿随意打标。
验证 Envoy Sidecar 是否成功注入
方法一:部署一个标准 Nginx 应用并检查 Pod 容器数
kubectl apply -f - apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
EOF
等待 Pod 启动后执行:kubectl get pod,确认 READY 列显示 2/2(表示主容器 + Envoy sidecar 均就绪)。
方法二:直接查看 Pod YAML 中是否含 istio-proxy 容器定义
kubectl get pod nginx-demo-
若输出包含 container 名为 istio-proxy、镜像为 docker.io/istio/proxyv2 的块,即注入成功。
确认流量劫持机制已就位
第一步:检查 Pod 内是否运行了 iptables 规则重定向
kubectl exec nginx-demo-
第二步:确认 Envoy 正在监听本地 15001(inbound)和 15006(outbound)端口
kubectl exec nginx-demo-
第三步:查看 Envoy 配置是否已加载目标服务发现信息
kubectl exec nginx-demo-
这三步全部返回预期输出,说明 iptables 规则、端口监听、xDS 配置均已就绪,Envoy 已接管该 Pod 全部进出流量。

















