网站首页 > 技术教程 正文
灰度发布支持的场景
1.新功能的逐步验证和反馈
场景描述:
对于一些 新功能,开发团队不希望一次性将其发布给所有用户,因为新功能可能会导致未知的错误、用户体验问题或性能问题。通过灰度发布,可以将该新功能逐步推送给部分用户,收集他们的反馈,并确保新功能能够顺利运行。
2.性能优化验证
场景描述:
在对现有应用进行性能优化(如数据库查询优化、缓存优化、系统架构调整等)时,开发团队希望通过灰度发布逐步验证新版本的性能表现,确保优化不会对系统的其他部分或用户产生负面影响。
3.高风险功能的逐步验证
场景描述:
有些功能或改动对系统稳定性、用户体验、数据一致性等方面有较大影响,开发团队希望通过灰度发布在有限范围内逐步验证,以降低失败风险。
灰度发布
*argo rollout 介绍和使用
Argo Rollouts 是一个 Kubernetes Operator 实现,它为 Kubernetes 提供更加高级的部署能力,如蓝绿、金丝雀、金丝雀分析、实验和渐进式交付功能,为云原生应用和服务实现自动化、基于 GitOps 的逐步交付。
支持如下特性:
- 蓝绿更新策略
- 金丝雀更新策略
- 更加细粒度、加权流量拆分
- 自动回滚
- 手动判断
- 可定制的指标查询和业务 KPI 分析
- Ingress 控制器集成:NGINX,ALB
- 服务网格集成:Istio,Linkerd,SMI
- Metrics 指标集成:Prometheus、Wavefront、Kayenta、Web、Kubernetes Jobs、Datadog、New Relic、Graphite、InfluxDB
如下图为argorollout的架构图形
相关组件如下:
Rollout Controller
这是主控制器,用于监控集群中的事件并在rollout类型的资源发生变化时做出反应。控制器读取rollout的所有的信息,并实集群处于rollout定义中描述的相公状态。argo Rollouts 不会篡改或响应正常 Deployment 资源上发生的任何变更,这意味着你可以在一个使用其他方法部署应用的集群中安装 Argo Rollouts。
Rollout 资源
Rollout 资源是 Argo Rollouts 引入和管理的一种自定义 Kubernetes 资源,它与原生的 Kubernetes Deployment 资源基本兼容,但有额外的字段来控制更加高级的部署方法,如金丝雀和蓝/绿部署。Argo Rollouts 控制器将只对 Rollout 资源中的变化做出反应,不会对正常的 Deployment 资源做任何事情,所以如果你想用 Argo Rollouts 管理你的 Deployment,你需要将你的 Deployment 迁移到 Rollouts。
AnalysisTemplate 与 AnalysisRun
Analysis 是一种自定义 Kubernetes 资源,它将 Rollout 连接到指标提供程序,并为某些指标定义特定阈值,这些阈值将决定 Rollout 是否成功。对于每个 Analysis,你可以定义一个或多个指标查询及其预期结果,如果指标查询正常,则 Rollout 将继续发布;如果指标显示失败,则自动回滚;如果指标无法提供成功/失败的结果,则暂停发布。
为了执行分析,Argo Rollouts 提供了两个自定义的 Kubernetes 资源:AnalysisTemplate 和 AnalysisRun。
AnalysisTemplate 包含有关要查询哪些指标的说明。附加到 Rollout 的实际结果是 AnalysisRun 自定义资源,可以在特定 的 Rollout 上定义 AnalysisTemplate,也可以在集群上定义全局的 AnalysisTemplate,以供多个 Rollout 共享作为 ClusterAnalysisTemplate,而 AnalysisRun 资源的范围仅限于特定的 rollout。
请注意,在 Rollout 中使用分析和指标是完全可选的,你可以通过 API 或 CLI 手动暂停和继续发布,也可以使用其他外部方法(例如冒烟测试)。你不需要仅使用 Argo Rollouts 的指标解决方案,你还可以在 Rollout 中混合自动(即基于分析)和手动步骤。
除了指标之外,你还可以通过运行 Kubernetes Job 或运行 webhook 来决定发布的成功与否。
Metric Providers
Argo Rollouts 包括多个流行指标提供程序的本机集成,您可以在分析资源中使用这些提供程序来自动升级或回滚部署。有关特定设置选项,请参阅每个提供商的文档。
Argo Rollouts 包括几个流行的指标提供者的集成,你可以在分析资源中使用,来自动升级或回滚发布。
安装与使用
$ kubectl create namespace argo-rollouts
$ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.6.0/install.yaml
下载客户端
# https://ghproxy.com/https://github.com//argoproj/argo-rollouts/releases/download/v1.6.0/kubectl-argo-rollouts-linux-amd64 $ curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.6.0/kubectl-argo-rollouts-linux-amd64
$ chmod +x ./kubectl-argo-rollouts-linux-amd64
$ sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
root@test-k8s-master1:~/test/argo-rollout# kubectl argo rollouts version
kubectl-argo-rollouts: v1.8.2+0775302
BuildDate: 2025-03-21T19:14:39Z
GitCommit: 0775302f6fd901f557a0c14be327e31ce75bb45a
GitTreeState: clean
GoVersion: go1.23.7
Compiler: gc
Platform: linux/amd64
实现金丝雀发布(灰度发布)
apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: myapp-rollout namespace: istio-demo spec: replicas: 5 strategy: canary: steps: - setWeight: 10 - pause: {} - setWeight: 15 # 这里将流量从 10% 增加到 15% - pause: {duration: 10} - setWeight: 20 # 进一步增加流量 - pause: {duration: 10} - setWeight: 30 # 继续增加 - pause: {duration: 10} - setWeight: 40 revisionHistoryLimit: 2 selector: matchLabels: app: front-tomcat template: metadata: labels: app: front-tomcat spec: containers: - name: front-tomcat image:
harbor.assistfc.com/middleware/tomcat-7.0:latest ports: - containerPort: 80`
对应svc的资源如下
# basic-service.yaml
apiVersion: v1
kind: Service
metadata:
name: rollouts-nginx
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: front-tomcat
常见的操作命令
查看更新rollout的版本
查看
root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts get rollout myapp-rollout -n istio-demo
Name: myapp-rollout
Namespace: istio-demo
Status: Healthy
Strategy: Canary
Step: 9/9
SetWeight: 100
ActualWeight: 100
Images: harbor.assistfc.com/middleware/tomcat-7.0:latest-1 (stable)
Replicas:
Desired: 5
Current: 5
Updated: 5
Ready: 5
Available: 5
NAME KIND STATUS AGE INFO
myapp-rollout Rollout Healthy 6h3m
├──# revision:2
│ └── myapp-rollout-9cc8fbbf9 ReplicaSet Healthy 5h2m stable
│ ├──□ myapp-rollout-9cc8fbbf9-kf6wl Pod Running 5h2m ready:1/1
│ ├──□ myapp-rollout-9cc8fbbf9-7vrdg Pod Running 4h59m ready:1/1
│ ├──□ myapp-rollout-9cc8fbbf9-4zq2k Pod Running 4h59m ready:1/1
│ ├──□ myapp-rollout-9cc8fbbf9-6hqsd Pod Running 4h59m ready:1/1
│ └──□ myapp-rollout-9cc8fbbf9-gr87n Pod Running 4h59m ready:1/1
└──# revision:1
└── myapp-rollout-7f4db77cf7 ReplicaSet o ScaledDown 6h3m
更新对应的rollout
kubectl argo rollouts set image myapp-rollout myapp-rollout=harbor.assistfc.com/middleware/tomcat-7.0:latest
root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts -n istio-demo get rollout myapp-rollout
Name: myapp-rollout
Namespace: istio-demo
Status: Paused
Message: CanaryPauseStep
Strategy: Canary
Step: 1/9
SetWeight: 10
ActualWeight: 16
Images: harbor.assistfc.com/middleware/tomcat-7.0:latest (canary)
harbor.assistfc.com/middleware/tomcat-7.0:latest-1 (stable)
Replicas:
Desired: 5
Current: 6
Updated: 1
Ready: 6
Available: 6
NAME KIND STATUS AGE INFO
myapp-rollout Rollout Paused 6h12m
├──# revision:3
│ └── myapp-rollout-7f4db77cf7 ReplicaSet Healthy 6h12m canary
│ └──□ myapp-rollout-7f4db77cf7-gp5zh Pod Running 59s ready:1/1
└──# revision:2
└── myapp-rollout-9cc8fbbf9 ReplicaSet Healthy 5h11m stable
├──□ myapp-rollout-9cc8fbbf9-kf6wl Pod Running 5h11m ready:1/1
├──□ myapp-rollout-9cc8fbbf9-7vrdg Pod Running 5h9m ready:1/1
├──□ myapp-rollout-9cc8fbbf9-4zq2k Pod Running 5h8m ready:1/1
├──□ myapp-rollout-9cc8fbbf9-6hqsd Pod Running 5h8m ready:1/1
└──□ myapp-rollout-9cc8fbbf9-gr87n Pod Running 5h8m ready:1/1
让发布的 东西继续运行
root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts promote myapp-rollout -n istio-demo
rollout 'myapp-rollout' promoted
root@test-k8s-master1:~/istio-demo/huidu-argorollout# kubectl argo rollouts -n istio-demo get rollout myapp-rollout
Name: myapp-rollout
Namespace: istio-demo
Status: Paused
Message: CanaryPauseStep
Strategy: Canary
Step: 3/9
SetWeight: 15
ActualWeight: 16
Images: harbor.assistfc.com/middleware/tomcat-7.0:latest (canary)
harbor.assistfc.com/middleware/tomcat-7.0:latest-1 (stable)
Replicas:
Desired: 5
Current: 6
Updated: 1
Ready: 6
Available: 6
NAME KIND STATUS AGE INFO
myapp-rollout Rollout Paused 6h17m
├──# revision:3
│ └── myapp-rollout-7f4db77cf7 ReplicaSet Healthy 6h17m canary
│ └──□ myapp-rollout-7f4db77cf7-gp5zh Pod Running 5m24s ready:1/1
└──# revision:2
└── myapp-rollout-9cc8fbbf9 ReplicaSet Healthy 5h16m stable
├──□ myapp-rollout-9cc8fbbf9-kf6wl Pod Running 5h16m ready:1/1
├──□ myapp-rollout-9cc8fbbf9-7vrdg Pod Running 5h13m ready:1/1
├──□ myapp-rollout-9cc8fbbf9-4zq2k Pod Running 5h13m ready:1/1
├──□ myapp-rollout-9cc8fbbf9-6hqsd Pod Running 5h13m ready:1/1
└──□ myapp-rollout-9cc8fbbf9-gr87n Pod Running 5h13m ready:1/1
至此实现灰度发布就ok了
猜你喜欢
- 2025-05-05 从virsh当中学习QEMU/KVM启动命令
- 2025-05-05 Win10 BCD文件损坏怎么修复?(bcd文件损坏win7)
- 2025-05-05 亚马逊春节假期期间的店铺管理设置
- 2025-05-05 1分钟总结常用k8s常用诊断教程(k8s常见故障)
- 2025-05-05 VisiPics重复图片查找软件中文汉化教程
- 2025-05-05 轻松掌握Java多线程 - 第二章:线程的生命周期
- 2025-05-05 德拉诺之王邪DK报告:PVE向小测试及分析
- 2025-05-05 桌面运维工具之打印机驱动安装(打印机机驱动安装)
你 发表评论:
欢迎- 05-05从virsh当中学习QEMU/KVM启动命令
- 05-05Win10 BCD文件损坏怎么修复?(bcd文件损坏win7)
- 05-05亚马逊春节假期期间的店铺管理设置
- 05-051分钟总结常用k8s常用诊断教程(k8s常见故障)
- 05-05VisiPics重复图片查找软件中文汉化教程
- 05-05微服务的发布实现方式1灰度实现(微服务实现原理)
- 05-05轻松掌握Java多线程 - 第二章:线程的生命周期
- 05-05德拉诺之王邪DK报告:PVE向小测试及分析
- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)