内部实现:Argo Rollouts 1.8 如何在 Kubernetes 1.33 和 Prometheus 3.1 中实现 Canary Deployments
Source: Dev.to
请提供您希望翻译的具体文本内容(文章正文),我将为您翻译成简体中文,并保留原有的 Markdown 格式和技术术语。谢谢!
Prerequisites and Stack Compatibility
Argo Rollouts 1.8 专为利用 Kubernetes 1.33 的增强工作负载 API 而构建,包括对 Deployment 和 ReplicaSet 生命周期钩子的稳定支持,以及 Prometheus 3.1 原生直方图指标用于低延迟金丝雀分析。关键兼容性说明:
- Kubernetes 1.33+ 是 Argo Rollouts 新的
Rollout控制器准入 webhook 的前置要求,这些 webhook 在创建时验证金丝雀配置。 - Prometheus 3.1 的
prometheus-operatorv0.70+ 集成实现了金丝雀分析规则的自动指标抓取。 - Argo Rollouts 1.8 不再支持 1.28 以下的 Kubernetes 版本,以符合上游的弃用策略。
Argo Rollouts 1.8 金丝雀架构
核心 Argo Rollouts 1.8 金丝雀工作流依赖于三个组件,已更新至 K8s 1.33 和 Prometheus 3.1:
| Component | Responsibility |
|---|---|
| Rollout Controller | 监视 Rollout 自定义资源(CR),管理金丝雀 ReplicaSet 的创建,并更新 Kubernetes Service 和 Ingress 对象以实现流量分配。 |
| Analysis Controller | 查询 Prometheus 3.1 获取金丝雀健康指标,评估分析模板,并向 Rollout Controller 发出信号以推进或中止金丝雀。 |
| Metrics Server | 聚合来自 K8s 1.33 的 kube-proxy 和 Prometheus 3.1 导出器的实时流量和错误率指标。 |
深入了解 Kubernetes 1.33 的流量拆分
Kubernetes 1.33 引入了对 Service traffic policy 增强的稳定支持,Argo Rollouts 1.8 利用该特性在无需第三方服务网格的情况下实现金丝雀流量拆分(仍然支持网格集成)。
工作流程
当 Rollout CR 使用新容器镜像进行更新时,Rollout 控制器会:
- 创建一个带有新镜像的金丝雀
ReplicaSet,最初将副本数设为 0。 - 更新主
Service的 selector,给金丝雀 Pod 添加rollout.argoproj.io/canary: "true"标签,给稳定 Pod 添加rollout.argoproj.io/stable: "true"标签。 - 使用 K8s 1.33 的
EndpointSliceAPI,根据Rollout规范中定义的金丝雀比例,在稳定和金丝雀EndpointSlice对象之间拆分流量。
示例 Rollout 流量拆分片段
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: canary-demo
spec:
replicas: 10
strategy:
canary:
steps:
- setWeight: 10
- pause: {duration: 5m}
- setWeight: 50
- pause: {duration: 10m}
- setWeight: 100
trafficRouting:
kubernetes:
service: canary-demo-svc
ingress:
name: canary-demo-ingress
selector:
matchLabels:
app: canary-demo
template:
metadata:
labels:
app: canary-demo
spec:
containers:
- name: demo-app
image: demo-app:v2.0.0
ports:
- containerPort: 8080
Prometheus 3.1 对金丝雀分析的集成
Argo Rollouts 1.8 利用 Prometheus 3.1 的原生直方图和指数桶度量,在查询延迟低于以前版本的情况下评估金丝雀健康状况。Analysis Controller 使用 PrometheusQuery API 按可配置的间隔轮询 Prometheus 3.1,然后将结果与用户定义的成功阈值进行比较。
Prometheus 3.1 示例 AnalysisTemplate
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: prometheus-canary-analysis
spec:
metrics:
- name: error-rate
successCondition: result[0] 0.05
provider:
prometheus:
address: http://prometheus.istio-system.svc:9090
query: |
sum(rate(http_requests_total{app="canary-demo", status=~"5.."}[5m])) /
sum(rate(http_requests_total{app="canary-demo"}[5m]))
Prometheus 3.1 的新 remote_write 优化将指标延迟降低至不足 1 秒,确保 Argo Rollouts 1.8 能够几乎实时地做出金丝雀推进决策。
Argo Rollouts 1.8 的关键优化
超出 K8s 1.33 与 Prometheus 3.1 的集成,Argo Rollouts 1.8 还包括若干底层改进:
- 降低内存占用 – 由于 K8s 1.33 的共享 informer 缓存优化,Rollout Controller 的内存使用量下降约 30 %。
- 原生支持 Prometheus 3.1
exemplar指标,实现金丝雀调试的追踪‑指标关联。 - 改进的金丝雀中止逻辑 – 当 Prometheus 3.1 报告阈值突破时,Rollout Controller 会自动缩减金丝雀
ReplicaSet,并在 2 秒内将 100 % 流量恢复到稳定版本。
结论
Argo Rollouts 1.8 与 Kubernetes 1.33 和 Prometheus 3.1 搭配使用,提供了一个稳健、低延迟的金丝雀部署工作流,无需依赖复杂的服务网格配置。它与 K8s 1.33 的流量路由 API 以及 Prometheus 3.1 的高性能指标引擎的紧密集成,使其成为运行现代云原生工作负载的团队的理想选择。
生产环境的 Kubernetes 工作负载。
完整的发行说明请参阅 Argo Rollouts 1.8 changelog。