登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
科技
›
K8s 灰度发布实战:通过 Ingress 注解轻松实现流量分割 ...
K8s 灰度发布实战:通过 Ingress 注解轻松实现流量分割与渐进式发布
[ 复制链接 ]
缄戈
2025-6-9 18:33:04
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
在现代微服务架构中,应用的更新和发布是一个高频且关键的操作。如何在不影响用户体验的前提下,安全、平稳地将新版本应用推送到生产环境,是每个开发者和运维团队必须面对的挑战。灰度发布(Gray Release)作为一种渐进式发布策略,能够有效降低发布风险,而 Kubernetes 的 Ingress 注解功能为我们提供了一种简单而强大的实现方式。
本文将带你深入浅出地了解如何通过
Ingress 注解
在 Kubernetes 中实现灰度发布,并逐步掌握流量分割、权重控制等核心技巧。无论你是 Kubernetes 新手还是资深用户,都能从本文中获得实用的知识和操作指南。
什么是灰度发布?
灰度发布,也称为金丝雀发布(Canary Release),是一种渐进式的应用发布策略。它的核心思想是:
将新版本应用逐步推送给一小部分用户,观察其运行状态,确认无误后再逐步扩大范围,最终完成全量发布
。
相比于全量发布,灰度发布具有以下优势:
降低风险
:通过小范围验证,避免因新版本问题导致全局故障。
快速回滚
:如果新版本出现问题,可以快速切换回旧版本。
用户体验优化
:逐步发布可以减少对用户的影响。
Kubernetes 中的灰度发布实现方式
在 Kubernetes 中,灰度发布可以通过多种方式实现,例如:
Deployment + Service
:手动控制流量切换。
Istio
:通过服务网格实现高级流量管理。
Ingress 注解
:通过 Nginx Ingress Controller 的注解功能实现流量分割。
本文将重点介绍
Ingress 注解
的实现方式,因为它简单易用,且无需引入额外的组件。
通过 Ingress 注解实现灰度发布
Nginx Ingress Controller 提供了丰富的注解(Annotations),可以轻松实现灰度发布。以下是具体步骤:
1. 部署新旧版本应用
首先,我们需要部署两个版本的应用程序:
旧版本(v1)
:当前正在运行的生产版本。
新版本(v2)
:待发布的新版本。
1.1 创建 v1 版本 Deployment 和 Service
# v1 版本 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-v1
spec:
replicas: 3
template:
metadata:
labels:
app: my-app
version: v1
spec:
containers:
- name: my-app
image: my-app:v1
ports:
- containerPort: 80
# v1 版本 Service
apiVersion: v1
kind: Service
metadata:
name: my-app-v1
spec:
selector:
app: my-app
version: v1
ports:
- port: 80
targetPort: 80
复制代码
1.2 创建 v2 版本 Deployment 和 Service
# v2 版本 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-v2
spec:
replicas: 3
template:
metadata:
labels:
app: my-app
version: v2
spec:
containers:
- name: my-app
image: my-app:v2
ports:
- containerPort: 80
# v2 版本 Service
apiVersion: v1
kind: Service
metadata:
name: my-app-v2
spec:
selector:
app: my-app
version: v2
ports:
- port: 80
targetPort: 80
复制代码
2. 配置 Ingress 实现灰度发布
通过 Nginx Ingress Controller 的 canary 注解,我们可以轻松实现流量分割。
2.1 创建 Ingress 资源
以下是一个示例配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/canary: "true" # 启用灰度发布
nginx.ingress.kubernetes.io/canary-weight: "10" # 10% 流量到新版本
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-v2 # 新版本服务
port:
number: 80
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-v1 # 旧版本服务
port:
number: 80
复制代码
2.2 关键注解说明
nginx.ingress.kubernetes.io/canary: "true":启用灰度发布功能。
nginx.ingress.kubernetes.io/canary-weight: "10":将 10% 的流量分配到新版本(v2),剩余 90% 的流量继续使用旧版本(v1)。
3. 逐步调整流量权重
在灰度发布过程中,可以逐步增加新版本的流量比例。例如:
初始阶段:10% 流量到 v2。
验证通过后:将权重调整为 50%。
最终阶段:将权重调整为 100%,完成全量发布。
只需修改 canary-weight 注解的值即可:
nginx.ingress.kubernetes.io/canary-weight: "50" # 50% 流量到新版本
复制代码
4. 监控与回滚
在灰度发布过程中,务必监控新版本的运行状态,包括:
应用日志
:检查是否有错误或异常。
性能指标
:如响应时间、错误率等。
用户反馈
:收集用户的使用体验。
如果发现问题,可以通过调整 canary-weight 注解将流量切回旧版本:
nginx.ingress.kubernetes.io/canary-weight: "0" # 所有流量切回旧版本
复制代码
灰度发布的进阶用法
除了基于权重的流量分割,Nginx Ingress Controller 还支持以下灰度发布策略:
1. 基于请求头的流量分割
通过 nginx.ingress.kubernetes.io/canary-by-header 注解,将特定请求头的流量路由到新版本。
示例配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
nginx.ingress.kubernetes.io/canary-by-header-value: "true"
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-v2
port:
number: 80
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-v1
port:
number: 80
复制代码
说明
当请求头中包含 X-Canary: true 时,流量会被路由到新版本(v2)。
其他请求继续使用旧版本(v1)。
2. 基于 Cookie 的流量分割
通过 nginx.ingress.kubernetes.io/canary-by-cookie 注解,将特定 Cookie 的流量路由到新版本。
示例配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "canary"
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-v2
port:
number: 80
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-v1
port:
number: 80
复制代码
说明
当请求中包含 canary=true 的 Cookie 时,流量会被路由到新版本(v2)。
其他请求继续使用旧版本(v1)。
3. 组合使用
可以同时使用权重、请求头和 Cookie 实现更复杂的灰度发布策略。
示例配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "10"
nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
nginx.ingress.kubernetes.io/canary-by-header-value: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "canary"
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-v2
port:
number: 80
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-v1
port:
number: 80
复制代码
说明
10% 的流量会被分配到新版本(v2)。
如果请求头中包含 X-Canary: true 或 Cookie 中包含 canary=true,流量也会被路由到新版本。
总结
通过 Kubernetes 的 Ingress 注解,我们可以轻松实现灰度发布,逐步将新版本应用推送给用户,降低发布风险。无论是基于权重的流量分割,还是基于请求头或 Cookie 的精细化控制,Nginx Ingress Controller 都提供了强大的支持。
灰度发布不仅是技术上的优化,更是对用户体验的尊重。希望本文能帮助你掌握这一重要技能,让你的发布过程更加平稳、可靠!
立即尝试
:在你的 Kubernetes 集群中部署一个灰度发布示例,感受渐进式发布的魅力吧!如果你有任何问题或想法,欢迎在评论区留言讨论!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
发布
K8s
灰度
实战
通过
相关帖子
AgileConfig-1.11.0 发布:增强的权限管理
Flask 应用部署实战:Nginx 反向代理配置指南
JVM内存、GC与JConsole实战全解析:从理论到可视化的完整指南
K8S 中使用 YAML 安装 ECK
扣子Coze实战:智能体(Agent)1分钟自动仿写公众号爆文,一键自动发布
JVM内存、GC与JConsole实战全解析
观察者模式,发布/订阅模式,与回调函数
huggingface_hub 1.0 正式版现已发布:开源机器学习基础五周年回顾
XXL-TOOL v2.4.0 发布 | 布隆过滤器、Excel流式读写、高性能BeanCopy
时序数据库 TimechoDB V1.3.6 发布 | 优化查询与同步性能,强化内核稳定性
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
AgileConfig-1.11.0 发布:增强的权限管理
1
575
殷罗绮
2025-12-09
业界
Flask 应用部署实战:Nginx 反向代理配置指南
1
926
盒礁泅
2025-12-11
业界
JVM内存、GC与JConsole实战全解析:从理论到可视化的完整指南
0
821
于映雪
2025-12-12
业界
K8S 中使用 YAML 安装 ECK
0
737
全跺俚
2025-12-12
业界
扣子Coze实战:智能体(Agent)1分钟自动仿写公众号爆文,一键自动发布
0
13
高小雨
2025-12-13
业界
JVM内存、GC与JConsole实战全解析
0
690
洫伍俟
2025-12-13
安全
观察者模式,发布/订阅模式,与回调函数
0
39
粉押淫
2025-12-13
科技
huggingface_hub 1.0 正式版现已发布:开源机器学习基础五周年回顾
0
555
俏襟选
2025-12-13
业界
XXL-TOOL v2.4.0 发布 | 布隆过滤器、Excel流式读写、高性能BeanCopy
0
672
静轾
2025-12-15
安全
时序数据库 TimechoDB V1.3.6 发布 | 优化查询与同步性能,强化内核稳定性
1
431
祖娅曦
2025-12-15
回复
(5)
煞赶峙
2025-10-24 13:27:24
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
分享、互助 让互联网精神温暖你我
蒙飘
2025-10-26 01:15:57
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
喜欢鼓捣这些软件,现在用得少,谢谢分享!
任静柔
2025-10-30 00:46:47
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
热心回复!
豺独
2025-11-7 22:57:44
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享,下载保存了,貌似很强大
肿抢
5 天前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
喜欢鼓捣这些软件,现在用得少,谢谢分享!
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
缄戈
5 天前
关注
0
粉丝关注
18
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994893
kk14977
6845357
3934307807
991123
4
xiangqian
638210
5
韶又彤
9998
6
宋子
9983
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
311
《ESP32-S3使用指南—IDF版 V1.6》第五十五
941
纯前端调用大模型真的安全吗?我踩过的坑比
895
【分析式AI】-带你秒弄懂决策树与随机森林
97
DBLens 的数据安全、登录方式与离线使用说
71
国内开发者合规订阅 Claude Code 的 3 条最
153
Perforce QAC 2025.3 新版上线 | 速度与深
475
防止跨站脚本攻击(XSS)(完整版HTTP安全
352
Wayland下RDP服务器的搭建
887
Flink学习笔记:状态后端
532
csq-蓝桥杯python-基础语法2-列表与循环语
512
C#+VisionMaster 学习笔记(目录)-目录
586
ROS2核心概念之参数
88
【Agent】MemOS 源码笔记---(5)---记忆分类
129
.NET周刊【11月第4期 2025-11-23】
191
Oracle回滚与撤销(Undo)技术:从理论到实
223
吴恩达深度学习课程四:计算机视觉 第二周
854
jetson nano的ssh远程登录连接
638
Categraf 监控采集器常见问题汇总
825
11月和12月求职总结
950
2026年成都品牌主,如何选择AI优化搜索(AI