登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
istio流量分发实战:从配置到踩坑全解析 ...
istio流量分发实战:从配置到踩坑全解析
[ 复制链接 ]
焦尔蕾
2026-2-4 15:25:01
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
前言
上一小节,istio成功的安装,并且还解决了常见的426的问题,本节内容主要探讨一下istio关于流量转发的问题
按比例分发
配置
需要创建一个backend-v1,它与backend的selector都是app: backend,backend-v1部署完成之后,它会立即分走50%的流量,为了测试istio流控,我们需要在不改变任何配置的情况下实现9:1分流,也就是90%进入原backend,10%进入新的backend-v1
标记2个deployment,追加标签,backend为version: v0,backend-v1为version: v1
kubectl patch deployment backend -p '{"spec":{"template":{"metadata":{"labels":{"version":"v0"}}}}}'
kubectl patch deployment backend-v1 -p '{"spec":{"template":{"metadata":{"labels":{"version":"v1"}}}}}'
复制代码
创建istio资源:DestinationRule,该资源主要用来标记istio要往哪个地方转发
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: backend-dr
namespace: default
spec:
host: backend-service
subsets:
- labels:
version: v0
name: v0
- labels:
version: v1
name: v1
复制代码
创建istio资源:VirtualService,该资源用来确定转发的权重
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: backend-vs
namespace: default
spec:
hosts:
- backend-service
http:
- route:
- destination:
host: backend-service
subset: v0
weight: 90
- destination:
host: backend-service
subset: v1
weight: 10
复制代码
调试
测试命令: for i in {1..10}; do curl -s 10.22.12.178:30785/test > /dev/null ; done
登录到k8s的istio-proxy控制台查看: kubectl logs -f -l app=backend -c istio-proxy
[2026-01-28T08:24:55.670Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.55:10000 duration=0ms route=default
[2026-01-28T08:24:55.687Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.55:10000 duration=0ms route=default
[2026-01-28T08:24:55.706Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=0ms route=default
[2026-01-28T08:24:55.741Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=1ms route=default
[2026-01-28T08:24:55.751Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=0ms route=default
[2026-01-28T08:24:55.759Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=0ms route=default
[2026-01-28T08:24:55.696Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.55:10000 duration=0ms route=default
[2026-01-28T08:24:55.716Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.55:10000 duration=0ms route=default
[2026-01-28T08:24:55.725Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.55:10000 duration=0ms route=default
[2026-01-28T08:24:55.734Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.55:10000 duration=0ms route=default
复制代码
▶ kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
backend-86b958bdc-5zjgn 2/2 Running 0 21m 10.244.0.53 wilson <none> <none>
backend-v1-75ccff86dc-sl6bt 2/2 Running 0 119s 10.244.0.55 wilson <none> <none>
nginx-test-7d87875694-8vsrp 2/2 Running 0 30m 10.244.0.61 wilson <none> <none>
复制代码
明显不对,10.244.0.55与10.244.0.53的比例并没有呈现9:1,转发到backend要backend-v1还是5:5
修复
可以直接修改nginx的配置
server {
listen 80;
listen [::]:80;
server_name localhost;
location /test {
proxy_http_version 1.1;
# proxy_set_header Host $host; # 原配置
proxy_set_header Host backend-service.default.svc.cluster.local; # 新配置
proxy_pass http://backend-service:10000;
}
}
复制代码
重启之后再次测试:
[2026-01-28T08:30:59.968Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=0ms route=default
[2026-01-28T08:30:59.988Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=1ms route=default
[2026-01-28T08:31:00.027Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=1ms route=default
[2026-01-28T08:31:00.037Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=0ms route=default
[2026-01-28T08:31:00.048Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=0ms route=default
[2026-01-28T08:31:00.056Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=0ms route=default
[2026-01-28T08:31:00.008Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.55:10000 duration=0ms route=default
[2026-01-28T08:31:00.066Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=0ms route=default
[2026-01-28T08:31:00.074Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=0ms route=default
[2026-01-28T08:31:00.083Z] "GET /test HTTP/1.1" 200 - upstream=10.244.0.53:10000 duration=0ms route=default
复制代码
已经生效了,这次只有1次10.244.0.55:10000
疑问
有位大哥说了,如果这样配置的,明显影响了业务:
nginx的配置被修改了
所有的host被写死了,都成了:backend-service.default.svc.cluster.local,而后端业务是需要把客户端的host带入过去的,改了之后后端业务收到严重影响
确实,固定host属于粗暴简单的写法,还有更加惊喜的解决方法,调整VirtualService,添加hosts
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: backend-vs
namespace: default
spec:
hosts:
- backend-service
- api.wilsontest.com # 新增
http:
- route:
- destination:
host: backend-service
subset: v0
weight: 90
- destination:
host: backend-service
subset: v1
weight: 10
复制代码
客户端访问的时候必须带上该域名: for i in {1..10}; do curl -s -H 'host: api.wilsontest.com' 10.22.12.178:30785/test > /dev/null ; done
这样也可以解决问题,不过坑点也来了,年久失修,从无数前人继承的祖传代码,就需要好好的梳理到底有哪些host来访问,否则漏掉host的话,就会出现配置问题。-_-!
再次凸显了istio之中,host是非常非常重要的,Istio 的路由决策、Service 的匹配完全依赖 Host 头
Istio 的 VirtualService 本质上是一个“增强版”的路由器。如果发现请求的 Host 是 backend-service,就按 90:10 分配。
之前的配置是$host,由于客户端没有传输host,当请求经过 Nginx 的 Sidecar时,它会检查Host,发现为空。由于路由表里没有对应的记录 ,sidecar并不认识,按普通 K8s 流量处理
按header分发
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: backend-vs
namespace: default
spec:
hosts:
- backend-service
- api.wilsontest.com
http:
- match:
- headers:
hellotest:
exact: "true"
route:
- destination:
host: backend-service
subset: v1
- route:
- destination:
host: backend-service
subset: v0
复制代码
curl -s -H 'host: api.wilsontest.com' -H 'hellotest: true' 10.22.12.178:30785/test。只有header里面匹配了hellotest: true才会去v1,否则全部去v0
按前缀分发
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: backend-vs
namespace: default
spec:
hosts:
- backend-service
- api.wilsontest.com
http:
- match:
- uri:
prefix: /test/v1
route:
- destination:
host: backend-service
subset: v1
- route:
- destination:
host: backend-service
subset: v0
复制代码
带有/test/v1前缀的都会去新版本v1,满足不了条件都会走默认的版本v0
url改写
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: backend-vs
namespace: default
spec:
hosts:
- backend-service
- api.wilsontest.com
http:
- match:
- uri:
prefix: /test/v1
route:
- destination:
host: backend-service
subset: v1
- match:
- uri:
prefix: /test/v2
rewrite:
uri: /test
route:
- destination:
host: backend-service
subset: v0
- route:
- destination:
host: backend-service
subset: v0
复制代码
如果是/test/v1,就访问v1版本,/test/v2重写成/test并且访问v0版本,其余的默认都会走v0版本
蓝绿、金丝雀、灰度、A/B测试
关于流量分流的各种操作,大部分都集中在以下场景:
蓝绿:实现瞬间切换与零宕机回滚,消除发布期间的中间状态
金丝雀:像矿工用金丝雀探测毒气一样,先让一小部分用户(如1%~5%)访问新版本,观察系统指标(如错误率、延迟),若无问题再逐步扩大范围
灰度:将用户群体按比例或特定规则(如地域、设备)逐步切换到新版本(例如10%→30%→100%),持续观察反馈
A/B:同时向随机分组的用户展示不同版本(A组用旧版,B组用新版),通过统计指标(如点击率、转化率)判断哪个版本更优
蓝绿发布金丝雀发布灰度发布A/B测试主要目标零停机、瞬时回滚用真实流量快速发现技术风险平稳、可控地逐步替换所有用户验证不同版本的业务效果流量路由全量切换(100%→0%)极小比例引流(如1%-5%)按比例分阶段扩大(10%→50%→100%)按规则/随机分配(如50%/50%)关注重点系统可用性与回滚速度系统稳定性指标(错误率、延迟)发布过程平稳性与综合反馈业务指标(转化率、留存率)所需资源两套完整环境,成本高一套环境,新版本实例较少一套环境,新旧版本实例共存一套或多套环境,并行运行多个版本用户选择全体用户同时切换小部分用户随机或按基础设施选择用户按比例或属性逐步迁移用户随机分组或按属性定向分配持续时间极短(切换在几分钟内)短(几小时到一天)中长(几天到数周)长(数周到数月)典型场景关键业务大版本升级、基础设施更换后端服务、中间件、数据库变更前端功能、用户界面更新UI设计、文案、算法策略、定价优化
联系我
联系我,做深入的交流
至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
istio
流量
分发
实战
配置
相关帖子
扣子Coze实战:1分钟生成100篇爆款小红书养生笔记
Nuxt3 与官网 SEO:从 TDK 配置到搜索引擎收录
从零开始学Flink:Flink 双流 JOIN 实战详解
OpenClaw 入门指南:从原理到实战
Claude Code 实战:从 Plan 模式到多 Agent 并行,NewsFlow 升级实录
OpenClaw+OpenViking + NVIDIA API 配置教程
OpenClaw+OpenViking + NVIDIA API 配置教程
OpenClaw+OpenViking + NVIDIA API 配置教程
企业健身房器材配置方案:拒绝纸上谈兵,上海皓衍让方案落地即实用
FastAPI实战:WebSocket长连接保持与心跳机制,从入门到填坑
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
扣子Coze实战:1分钟生成100篇爆款小红书养生笔记
0
12
姜删懔
2026-02-12
安全
Nuxt3 与官网 SEO:从 TDK 配置到搜索引擎收录
1
63
毕余馥
2026-02-13
业界
从零开始学Flink:Flink 双流 JOIN 实战详解
1
1018
戈森莉
2026-02-16
业界
OpenClaw 入门指南:从原理到实战
0
355
姜删懔
2026-02-17
安全
Claude Code 实战:从 Plan 模式到多 Agent 并行,NewsFlow 升级实录
0
875
第璋胁
2026-02-17
业界
OpenClaw+OpenViking + NVIDIA API 配置教程
0
530
染罕习
2026-02-18
业界
OpenClaw+OpenViking + NVIDIA API 配置教程
0
807
秤陷曲
2026-02-18
业界
OpenClaw+OpenViking + NVIDIA API 配置教程
0
3
晌集涟
2026-02-18
安全
企业健身房器材配置方案:拒绝纸上谈兵,上海皓衍让方案落地即实用
0
407
处匈跑
2026-02-19
业界
FastAPI实战:WebSocket长连接保持与心跳机制,从入门到填坑
0
663
暴灵珊
2026-02-19
回复
(10)
饨篦
2026-2-8 23:37:51
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
分享、互助 让互联网精神温暖你我
任静柔
2026-2-9 02:56:02
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
新版吗?好像是停更了吧。
骂治并
2026-2-9 03:06:11
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
谢谢楼主提供!
材部
2026-2-10 07:00:43
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
不错,里面软件多更新就更好了
篙菠
2026-2-10 17:45:32
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢发布原创作品,程序园因你更精彩
庞悦
2026-2-11 12:59:50
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这个有用。
莠畅缕
2026-2-11 13:40:58
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
鼓励转贴优秀软件安全工具和文档!
鞍注塔
2026-2-12 06:34:49
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
新版吗?好像是停更了吧。
史华乐
2026-2-12 22:42:15
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
谢谢楼主提供!
骆贵
4 天前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
用心讨论,共获提升!
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
焦尔蕾
4 天前
关注
0
粉丝关注
28
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
宋子
9898
6
韶又彤
9918
7
闰咄阅
9993
8
刎唇
9995
9
蓬森莉
9883
10
遗憩
10006
查看更多
今日好文热榜
385
SeeDance2.0提示词之跳舞女孩
6
SeeDance2.0提示词之跳舞女孩
680
国内零门槛首个免费 开源 7×24小时帮
570
[拆解LangChain执行引擎]非常规Pending Wri
65
AI开发-python-milvus向量数据库(2-8 -mil
77
[LKD/Linux 内核] 关于对 current_thread_i
6
[LKD/Linux 内核] 关于对 current_thread_i
5
[LKD/Linux 内核] 关于对 current_thread_i
537
杂题选做(3)
4
9、PipedInputStream和PipedOutputStream的
753
凸优化数学基础笔记(五):极小值点的判定
856
【节点】[MainLightRealtimeShadow节点]原
11
【渗透测试】HTB靶场之WingData 全过程wp
381
2023年电赛国赛经历
534
从零开始学Flink:实时数仓与维表时态Join
987
Stanford-CS336-Lecture-01 学习理解
663
FastAPI实战:WebSocket长连接保持与心跳机
362
FPGA使用镜像加载技术来切换运行中的比特流