You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Istio中VirtualService与DestinationRule规则不生效问题排查

Istio流量路由异常排查:指定v1子集但流量仍分发到v1/v2

问题描述

已通过VirtualService配置将所有流量路由至nginx-svc.istio.svc.cluster.local的v1子集,同时用DestinationRule定义v1、v2子集分别对应带version:v1、version:v2标签的Pod,但执行curl测试时,流量仍同时分发到v1、v2版本的Pod,不符合预期。

相关资源清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-v1
  namespace: istio
  labels:
    app: nginx
    version: v1
spec:
  selector: 
    matchLabels:
      app: nginx 
      version: v1 
  template:
    metadata:
      labels:
        app: nginx 
        version: v1
    spec:
      containers:
        - name: nginx
          image: chaitanya305/good-morning
          ports:
            - containerPort: 80

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-v2
  namespace: istio
  labels:
    app: nginx
    version: v2
spec:
  selector: 
    matchLabels:
      app: nginx 
      version: v2 
  template:
    metadata:
      labels:
        app: nginx 
        version: v2
    spec:
      containers:
        - name: nginx
          image: chaitanya305/good-night
          ports:
          - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: istio
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080
  type: NodePort

---

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: my-virtualservice
  namespace: istio
spec:
  hosts:
    - nginx-svc.istio.svc.cluster.local
  http:
    - route:
        - destination:
            host: nginx-svc.istio.svc.cluster.local
            subset: v1

---

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: my-destinationrule
  namespace: istio
spec:
  host: nginx-svc.istio.svc.cluster.local
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2

测试脚本及结果:

root@jenkins-deployment-f4d955ff4-kpxgj:/tmp# cat bash2.sh
while true
do
curl nginx-svc.istio.svc.cluster.local
sleep 2
done
root@jenkins-deployment-f4d955ff4-kpxgj:/tmp#  ./bash2.sh
 Hi good morning 
 good Night sweet dreams 
 Hi good morning 
 Hi good morning 
 Hi good morning 
 good Night sweet dreams
 good Night sweet dreams 
 Hi good morning 
^Croot@jenkins-deployment-f4d955ff4-kpxgj:/tmp#

排查与修复步骤

1. 确认测试Pod已注入Istio Sidecar

Istio的流量规则仅对注入了Sidecar的Pod生效。执行以下命令检查测试Pod(jenkins-deployment-f4d955ff4-kpxgj)的容器列表:

kubectl get pod jenkins-deployment-f4d955ff4-kpxgj -n istio -o jsonpath='{.spec.containers[*].name}'

若输出不包含istio-proxy,则需要给该Pod所在的namespace开启自动注入,并重启Deployment:

# 开启namespace的Istio自动注入
kubectl label namespace istio istio-injection=enabled
# 重启jenkins Deployment以注入Sidecar
kubectl rollout restart deployment jenkins-deployment -n istio

2. 验证DestinationRule与Pod标签匹配

  • 检查DestinationRule的配置是否正确关联Service和标签:
    kubectl get destinationrule my-destinationrule -n istio -o yaml
    
    确认host为nginx-svc.istio.svc.cluster.local,子集的labels与Deployment的Pod标签完全一致。
  • 检查Pod的实际标签:
    kubectl get pods -n istio -l app=nginx --show-labels
    
    确保nginx-v1的Pod带有version:v1标签,nginx-v2的Pod带有version:v2标签。

3. 检查VirtualService配置有效性

确认VirtualService的路由规则未被覆盖:

kubectl get virtualservice my-virtualservice -n istio -o yaml

检查http.route[0].destination.subset是否为v1,且hosts字段包含测试时使用的nginx-svc.istio.svc.cluster.local。

4. 排查冲突的Istio资源

查看同一namespace下是否存在其他VirtualService或DestinationRule影响nginx-svc:

kubectl get virtualservices -n istio
kubectl get destinationrules -n istio

若存在其他规则,需确保目标VirtualService和DestinationRule是唯一生效的规则(可删除冲突资源或调整优先级)。

5. 查看Istio Pilot日志(深入排查)

若以上步骤均无问题,查看Pilot日志排查配置加载错误:

kubectl logs -n istio-system -l app=pilot --tail=100

搜索my-virtualservice或my-destinationrule相关日志,检查是否有配置解析或加载报错。

内容的提问来源于stack exchange,提问作者Chaitanya Golhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:34:58