4. 第一个 Rollout 资源:编写简单的 Rollout YAML 定义、使用 kubectl apply 部署、查看 Rollout 状态

在完成 Argo Rollouts 组件安装与 Ingress 配置后,我们正式进入第一个 Rollout 资源的实战编写与部署。本节将带领你从零编写一个完整的 Rollout YAML 定义,使用 kubectl apply 将其部署到集群,并通过多种命令实时查看 Rollout 的运行状态。

4.1 Rollout YAML 核心结构

Rollout 资源是 Argo Rollouts 的核心自定义资源(CRD),其 YAML 定义在 Deployment 的基础上扩展了灰度发布策略。一个标准的 Rollout YAML 包含以下四个核心部分:

部分 字段路径 说明
API 版本与元数据 apiVersion / kind / metadata 使用 argoproj.io/v1alpha1 版本,Kind 为 Rollout
副本与模板 spec.replicas / spec.template 与 Deployment 完全兼容的 Pod 模板定义
选择器与策略 spec.selector / spec.strategy 选择器用于匹配 Pod;策略定义灰度发布方式(Canary / BlueGreen)
灰度步骤 spec.strategy.canary.steps 定义灰度发布的阶段、流量比例、暂停条件等
关键区别: Rollout 的 spec.template 结构与 Deployment 完全一致,因此你可以将现有 Deployment 的 Pod 模板直接复制到 Rollout 中,无需修改容器定义。

4.2 编写第一个 Rollout YAML

以下是一个完整的 Rollout YAML 示例,部署一个名为 rollout-demo 的 Nginx 应用,采用 Canary 灰度策略,分两步将流量从 20% 逐步提升到 100%:

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: rollout-demo
  namespace: default
spec:
  replicas: 5
  selector:
    matchLabels:
      app: rollout-demo
  template:
    metadata:
      labels:
        app: rollout-demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.3
        ports:
        - containerPort: 80
  strategy:
    canary:
      steps:
      - setWeight: 20
      - pause: {}
      - setWeight: 100
      - pause: {duration: 30}
  revisionHistoryLimit: 2
灰度步骤解读:
  • setWeight: 20 — 将 20% 的流量路由到新版本 Pod
  • pause: {} — 无限期暂停,等待人工确认或自动分析通过
  • setWeight: 100 — 将 100% 流量切换到新版本
  • pause: {duration: 30} — 暂停 30 秒后自动完成灰度

4.3 使用 kubectl apply 部署

将上述 YAML 保存为 rollout-demo.yaml,然后执行以下命令部署到 Kubernetes 集群:

kubectl apply -f rollout-demo.yaml

部署成功后,Argo Rollouts 控制器会自动创建对应的 ReplicaSet 和 Pod。你可以通过以下命令验证资源是否创建:

kubectl get rollout,rs,pod -l app=rollout-demo

输出示例:

NAME                            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE
rollout.argoproj.io/rollout-demo   5         5         5            5

NAME                          DESIRED   CURRENT   READY   AGE
replicaset.apps/rollout-demo-6b4f7d8c9f   5         5         5       10s

NAME                                READY   STATUS    RESTARTS   AGE
pod/rollout-demo-6b4f7d8c9f-abc01   1/1     Running   0          10s
pod/rollout-demo-6b4f7d8c9f-abc02   1/1     Running   0          10s
pod/rollout-demo-6b4f7d8c9f-abc03   1/1     Running   0          10s
pod/rollout-demo-6b4f7d8c9f-abc04   1/1     Running   0          10s
pod/rollout-demo-6b4f7d8c9f-abc05   1/1     Running   0          10s

4.4 查看 Rollout 状态

Argo Rollouts 提供了多种方式来查看 Rollout 的详细状态,包括标准 kubectl 命令和专用插件。

4.4.1 使用 kubectl describe

kubectl describe rollout rollout-demo

输出中包含关键状态字段:

字段 说明
Status.CurrentStepIndex 当前执行的步骤索引(从 0 开始)
Status.CurrentSetWeight 当前新版本的流量权重百分比
Status.Canary.StableRS 稳定版本的 ReplicaSet 名称
Status.Canary.CurrentStepHash 当前步骤的哈希值,用于追踪步骤变更
Status.HPAReplicas HPA 控制的副本数(如果配置了 HPA)

4.4.2 使用 kubectl argo rollouts 插件

Argo Rollouts 提供了 kubectl 插件,可以更直观地查看 Rollout 状态和灰度进度:

kubectl argo rollouts get rollout rollout-demo

输出示例:

Name:            rollout-demo
Namespace:       default
Status:          ✔ Healthy
Strategy:        Canary
  Step           1/4
  SetWeight      20
  ActualWeight   20
Images:
  nginx:1.25.3 (stable)
Replicas:
  Desired:    5
  Current:    5
  Updated:    1
  Ready:      5
  Available:  5
注意: 如果 Rollout 处于暂停状态(pause: {}),Status 会显示 Paused,并且 CurrentStepIndex 会停留在暂停步骤。此时需要手动执行 kubectl argo rollouts promote rollout-demo 来继续下一步。

4.5 Rollout 状态流转图

以下 SVG 图展示了 Rollout 从创建到完成灰度的完整状态流转过程:

Rollout 状态流转图 创建 Rollout 启动灰度 步骤执行中 暂停等待 灰度完成 稳定运行 说明:创建 Rollout 后自动进入灰度流程,按 steps 定义逐步执行;遇到 pause 步骤时暂停等待人工 promote;所有步骤完成后进入稳定运行状态。

4.6 常见问题与排查

  • Rollout 一直处于 Paused 状态 — 检查 steps 中是否有 pause: {}(无限暂停),需要手动执行 kubectl argo rollouts promote 继续。
  • Pod 无法启动 — 使用 kubectl describe pod <pod-name> 查看事件,检查镜像名称、拉取策略、资源限制等。
  • Rollout 状态显示 Degraded — 表示灰度过程中出现异常,使用 kubectl argo rollouts get rollout rollout-demo --watch 实时观察状态变化。
  • Service 未正确路由流量 — 确认 Service 的 selector 与 Rollout 的 spec.selector.matchLabels 一致,且 Service 类型为 ClusterIP 或 LoadBalancer。
最佳实践: 首次部署 Rollout 时,建议先使用 --dry-run=client 参数验证 YAML 语法:kubectl apply -f rollout-demo.yaml --dry-run=client。确认无误后再正式 apply。