基于Argo Rollouts在K8S上的应用发布实践

Argo Rollouts介绍

Argo Rollouts 是一个开源的 Kubernetes 控制器和一组自定义资源定义(CRD),旨在为 Kubernetes 提供高级的应用发布策略。它是 Argo 项目家族的一部分,专注于实现渐进式交付(Progressive Delivery),通过蓝绿部署(Blue-Green)、金丝雀部署(Canary)以及其他高级部署功能,帮助开发者以更安全、可控的方式在 Kubernetes 集群中发布应用。

Argo Rollouts原理

与原生deployment的区别

特性 Kubernetes Deployment Argo Rollouts
目的 提供基础的滚动更新(RollingUpdate)和副本数维护 提供高级部署策略(蓝绿、金丝雀、渐进式交付等)
抽象层级 直接管理 ReplicaSet(RS)的生命周期 也管理 ReplicaSet,但引入更复杂的流量控制和分析逻辑
更新策略 仅支持 RollingUpdate 或 Recreate 支持 BlueGreen、Canary 及自定义步骤
流量管理 依赖 Service 的标签选择器(一刀切切换) 集成 Ingress/Gateway 控制器(如 Nginx, Istio)实现流量按比例分配
自动决策 支持基于 Prometheus/Kayenta 等指标的自动渐进或回滚
ReplicaSet 管理方式 线性替换(新 RS 扩,旧 RS 缩) 多 RS 共存 + 精细化流量控制
版本历史 保留旧 RS(用于回滚) 保留策略更灵活,可关联分析运行记录
适用场景 简单应用发布 要求零停机、低风险发布的复杂生产环境

实现原理

Rollouts 蓝绿发布

示意图

示例代码

yaml 复制代码
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollout-bluegreen
spec:
  replicas: 2
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: rollout-bluegreen
  template:
    metadata:
      labels:
        app: rollout-bluegreen
    spec:
      containers:
      - name: rollouts-demo
        image: argoproj/rollouts-demo:blue
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
  strategy:
    blueGreen: 
      activeService: rollout-bluegreen-active
      previewService: rollout-bluegreen-preview
      autoPromotionEnabled: false
---
apiVersion: v1
kind: Service
metadata:
  name: rollout-bluegreen-active
  labels:
    app: rollout-bluegreen
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: rollout-bluegreen
---
apiVersion: v1
kind: Service
metadata:
  name: rollout-bluegreen-preview
  labels:
    app: rollout-bluegreen
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: rollout-bluegreen

蓝绿发布

  1. get rollout details "kubectl get rollout rollout-bluegreen"
  1. update rollout image: "kubectl argo rollouts set image rollout-bluegreen rollout-demo=argoproj/rollouts-demo:yellow"
  1. promote rollout : "kubectl argo rollouts promote rollout-bluegreen"

Rollouts 金丝雀发布

示意图

集成 nginx ingress

示例代码

yaml 复制代码
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-demo
spec:
  replicas: 1
  strategy:
    canary:
      canaryService: rollouts-demo-canary
      stableService: rollouts-demo-stable
      trafficRouting:
        nginx:
          stableIngress: rollouts-demo-stable
      steps:
      - setWeight: 5
      - pause: {}
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: rollouts-demo
  template:
    metadata:
      labels:
        app: rollouts-demo
    spec:
      containers:
      - name: rollouts-demo
        image: argoproj/rollouts-demo:blue
        ports:
        - name: http
          containerPort: 8080
          protocol: TCP
        resources:
          requests:
            memory: 32Mi
            cpu: 5m
---
apiVersion: v1
kind: Service
metadata:
  name: rollouts-demo-canary
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: rollouts-demo
---
apiVersion: v1
kind: Service
metadata:
  name: rollouts-demo-stable
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: rollouts-demo
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rollouts-demo-stable
spec:
  ingressClassName: nginx
  rules:
  - host: rollouts-demo.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: rollouts-demo-stable
            port:
              number: 80

金丝雀发布

会同时创建2个ingress,一个ingress 是stable的,一个ingress 是rollout自动创建的金丝雀发布使用的ingress,其中包含了权重信息。

集成 istio

示例代码

yaml 复制代码
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-demo
spec:
  replicas: 3
  strategy:
    canary:
      canaryService: rollouts-demo-canary
      stableService: rollouts-demo-stable
      trafficRouting:
        istio:
          virtualServices:
          - name: rollouts-demo-vsvc1
            routes:
            - primary 
      steps:
      - setWeight: 10 # 设置 canary 服务权重
      - pause: {}
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: rollouts-demo
  template:
    metadata:
      labels:
        app: rollouts-demo
        istio-injection: enabled
    spec:
      containers:
      - name: rollouts-demo
        image: argoproj/rollouts-demo:blue
        ports:
        - name: http
          containerPort: 8080
          protocol: TCP
        resources:
          requests:
            memory: 32Mi
            cpu: 5m
---
apiVersion: v1
kind: Service
metadata:
  name: rollouts-demo-canary
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: rollouts-demo
---
apiVersion: v1
kind: Service
metadata:
  name: rollouts-demo-stable
spec:
  ports:
  - port: 80
    targetPort: http
    protocol: TCP
    name: http
  selector:
    app: rollouts-demo
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: rollouts-demo-vsvc1
spec:
  gateways:
  - rollouts-demo-gateway
  hosts:
  - rollouts-demo-vsvc1.local
  http:
  - name: primary
    route:
    - destination:
        host: rollouts-demo-stable
        port:
          number: 15372
      weight: 100 # promote canary之后,rollout会重新设置权重
    - destination:
        host: rollouts-demo-canary
        port:
          number: 15372
      weight: 0

金丝雀发布

rollout会自动修改绑定的virtualServices 中的canary 权重信息。

相关推荐
龙山云仓2 小时前
MES系统超融合架构
大数据·数据库·人工智能·sql·机器学习·架构·全文检索
未来龙皇小蓝2 小时前
RBAC前端架构-02:集成Vue Router、Vuex和Axios实现基本认证实现
前端·vue.js·架构
Tadas-Gao2 小时前
深度学习与机器学习的知识路径:从必要基石到独立范式
人工智能·深度学习·机器学习·架构·大模型·llm
啊森要自信3 小时前
CANN ops-cv:揭秘视觉算子的硬件感知优化与内存高效利用设计精髓
人工智能·深度学习·架构·transformer·cann
国强_dev3 小时前
轻量级实时数仓架构选型指南
架构
roman_日积跬步-终至千里3 小时前
【系统架构设计-综合题】计算机系统基础(1)
架构
C澒3 小时前
多场景多角色前端架构方案:基于页面协议化与模块标准化的通用能力沉淀
前端·架构·系统架构·前端框架
代码游侠3 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
yunteng52113 小时前
通用架构(同城双活)(单点接入)
架构·同城双活·单点接入
麦聪聊数据14 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构