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 从创建到完成灰度的完整状态流转过程:
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。