基于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 权重信息。

相关推荐
大佐不会说日语~3 小时前
Redis高可用架构演进面试笔记
redis·面试·架构
德育处主任Pro5 小时前
亚马逊云科技实战架构:构建可扩展、高效率、无服务器应用
科技·架构·serverless
Bar_artist7 小时前
云渲染的算力困局与架构重构:一场正在发生的生产力革命
重构·架构
三桥君7 小时前
AI应用爆发式增长,如何设计一个真正支撑业务的AI系统架构?——解析AI系统架构设计核心要点
人工智能·架构
一休哥助手8 小时前
ChatGPT Agent架构深度解析:OpenAI如何构建统一智能体系统
人工智能·chatgpt·架构
数据智能老司机11 小时前
函数式事件驱动架构——交易系统(可观测性)
架构·scala·响应式设计
我不是程序猿儿12 小时前
【Servo】裸机还是RTOS驱动架构如何选?
驱动开发·fpga开发·架构·伺服驱动器·伺服
掘金安东尼12 小时前
用 Amazon CDK 构建现代化云架构:Python 编写部署脚本替代 YAML
架构
掘金安东尼12 小时前
数据湖实战:用 Amazon Glue + Athena 构建企业级数据分析基座
架构
掘金安东尼12 小时前
打赢“云灾难”:一文掌握亚马逊云科技上的灾备策略
架构