[Lauro Fialho Müller] GitOps in Practice with Argo CD and Argo Rollouts [ENG, 2026]: Argo Rollouts: Core Strategies
Делаю:
2026.01.29
Blue-Green Deployments
https://github.com/lm-academy/argo-rollouts-course/tree/main/blue-green
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: bluegreen-lab
EOF
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: rollout-bluegreen-active
namespace: bluegreen-lab
spec:
type: NodePort
ports:
- port: 3000
protocol: TCP
name: http
selector:
app: rollout-bluegreen
---
apiVersion: v1
kind: Service
metadata:
name: rollout-bluegreen-preview
namespace: bluegreen-lab
spec:
type: NodePort
ports:
- port: 3000
protocol: TCP
name: http
selector:
app: rollout-bluegreen
EOF
$ cat << EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollout-bluegreen
namespace: bluegreen-lab
spec:
replicas: 5
selector:
matchLabels:
app: rollout-bluegreen
template:
metadata:
labels:
app: rollout-bluegreen
spec:
containers:
- name: app
image: lmacademy/simple-color-app:1.0.0
env:
- name: APP_COLOR
value: 'blue'
strategy:
blueGreen:
activeService: rollout-bluegreen-active
previewService: rollout-bluegreen-preview
autoPromotionEnabled: false
EOF
$ kubectl argo rollouts get rollout rollout-bluegreen -n bluegreen-lab
Name: rollout-bluegreen
Namespace: bluegreen-lab
Status: ✔ Healthy
Strategy: BlueGreen
Images: lmacademy/simple-color-app:1.0.0 (stable, active)
Replicas:
Desired: 5
Current: 5
Updated: 5
Ready: 5
Available: 5
NAME KIND STATUS AGE INFO
⟳ rollout-bluegreen Rollout ✔ Healthy 17m
└──# revision:1
└──⧉ rollout-bluegreen-78bd5bfc4d ReplicaSet ✔ Healthy 17m stable,active
├──□ rollout-bluegreen-78bd5bfc4d-5bt42 Pod ✔ Running 17m ready:1/1
├──□ rollout-bluegreen-78bd5bfc4d-njdlm Pod ✔ Running 17m ready:1/1
├──□ rollout-bluegreen-78bd5bfc4d-tf8b2 Pod ✔ Running 17m ready:1/1
├──□ rollout-bluegreen-78bd5bfc4d-tz8q6 Pod ✔ Running 17m ready:1/1
└──□ rollout-bluegreen-78bd5bfc4d-vm4h6 Pod ✔ Running 17m ready:1/1
$ cat << EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollout-bluegreen
namespace: bluegreen-lab
spec:
replicas: 5
selector:
matchLabels:
app: rollout-bluegreen
template:
metadata:
labels:
app: rollout-bluegreen
spec:
containers:
- name: app
image: lmacademy/simple-color-app:1.0.0
env:
- name: APP_COLOR
value: 'green'
strategy:
blueGreen:
activeService: rollout-bluegreen-active
previewService: rollout-bluegreen-preview
autoPromotionEnabled: false
EOF
$ kubectl argo rollouts get rollout rollout-bluegreen -n bluegreen-lab
Name: rollout-bluegreen
Namespace: bluegreen-lab
Status: ॥ Paused
Message: BlueGreenPause
Strategy: BlueGreen
Images: lmacademy/simple-color-app:1.0.0 (active, preview, stable)
Replicas:
Desired: 5
Current: 10
Updated: 5
Ready: 5
Available: 5
NAME KIND STATUS AGE INFO
⟳ rollout-bluegreen Rollout ॥ Paused 24m
├──# revision:2
│ └──⧉ rollout-bluegreen-7f7bb56c9 ReplicaSet ✔ Healthy 15s preview
│ ├──□ rollout-bluegreen-7f7bb56c9-9rq7d Pod ✔ Running 15s ready:1/1
│ ├──□ rollout-bluegreen-7f7bb56c9-fhvgb Pod ✔ Running 15s ready:1/1
│ ├──□ rollout-bluegreen-7f7bb56c9-hg45c Pod ✔ Running 15s ready:1/1
│ ├──□ rollout-bluegreen-7f7bb56c9-scf59 Pod ✔ Running 15s ready:1/1
│ └──□ rollout-bluegreen-7f7bb56c9-vbkwx Pod ✔ Running 15s ready:1/1
└──# revision:1
└──⧉ rollout-bluegreen-78bd5bfc4d ReplicaSet ✔ Healthy 24m stable,active
├──□ rollout-bluegreen-78bd5bfc4d-5bt42 Pod ✔ Running 24m ready:1/1
├──□ rollout-bluegreen-78bd5bfc4d-njdlm Pod ✔ Running 24m ready:1/1
├──□ rollout-bluegreen-78bd5bfc4d-tf8b2 Pod ✔ Running 24m ready:1/1
├──□ rollout-bluegreen-78bd5bfc4d-tz8q6 Pod ✔ Running 24m ready:1/1
└──□ rollout-bluegreen-78bd5bfc4d-vm4h6 Pod ✔ Running 24m ready:1/1
http://localhost:3100/rollouts/bluegreen-lab
$ kubectl port-forward svc/rollout-bluegreen-active -n bluegreen-lab 3001:3000
$ kubectl port-forward svc/rollout-bluegreen-preview -n bluegreen-lab 3002:3000
http://localhost:3001
http://localhost:3002
$ kubectl argo rollouts promote rollout-bluegreen -n bluegreen-lab
Canary Deployments
https://github.com/lm-academy/argo-rollouts-course/tree/main/canary
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: canary-lab
EOF
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: rollout-canary-public
namespace: canary-lab
spec:
type: NodePort
ports:
- port: 3000
name: http
selector:
app: rollout-canary
---
apiVersion: v1
kind: Service
metadata:
name: rollout-canary-stable
namespace: canary-lab
spec:
type: NodePort
ports:
- port: 3000
name: http
selector:
app: rollout-canary
---
apiVersion: v1
kind: Service
metadata:
name: rollout-canary-preview
namespace: canary-lab
spec:
type: NodePort
ports:
- port: 3000
name: http
selector:
app: rollout-canary
EOF
$ cat << EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollout-canary
namespace: canary-lab
spec:
replicas: 10
selector:
matchLabels:
app: rollout-canary
template:
metadata:
labels:
app: rollout-canary
spec:
containers:
- name: rollout-canary
image: lmacademy/simple-color-app:1.0.0
env:
- name: APP_COLOR
value: 'blue'
strategy:
canary:
canaryService: rollout-canary-preview
stableService: rollout-canary-stable
steps:
- setWeight: 20
- pause: {}
- setWeight: 50
- pause:
duration: 30s
EOF
$ kubectl get svc -n canary-lab
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rollout-canary-preview NodePort 10.96.53.213 <none> 3000:31746/TCP 11m
rollout-canary-public NodePort 10.96.173.245 <none> 3000:32148/TCP 11m
rollout-canary-stable NodePort 10.96.35.165 <none> 3000:32094/TCP 11m
http://localhost:3100/rollouts/canary-lab
$ kubectl argo rollouts get rollout rollout-canary -n canary-lab
Name: rollout-canary
Namespace: canary-lab
Status: ✔ Healthy
Strategy: Canary
Step: 4/4
SetWeight: 100
ActualWeight: 100
Images: lmacademy/simple-color-app:1.0.0 (stable)
Replicas:
Desired: 10
Current: 10
Updated: 10
Ready: 10
Available: 10
NAME KIND STATUS AGE INFO
⟳ rollout-canary Rollout ✔ Healthy 61s
└──# revision:1
└──⧉ rollout-canary-5c8bf656db ReplicaSet ✔ Healthy 61s stable
├──□ rollout-canary-5c8bf656db-2c8mm Pod ✔ Running 61s ready:1/1
├──□ rollout-canary-5c8bf656db-4jmd6 Pod ✔ Running 61s ready:1/1
├──□ rollout-canary-5c8bf656db-bsfsr Pod ✔ Running 61s ready:1/1
├──□ rollout-canary-5c8bf656db-cz8mq Pod ✔ Running 61s ready:1/1
├──□ rollout-canary-5c8bf656db-hnc9c Pod ✔ Running 61s ready:1/1
├──□ rollout-canary-5c8bf656db-hv9hw Pod ✔ Running 61s ready:1/1
├──□ rollout-canary-5c8bf656db-q5rqt Pod ✔ Running 61s ready:1/1
├──□ rollout-canary-5c8bf656db-rhffj Pod ✔ Running 61s ready:1/1
├──□ rollout-canary-5c8bf656db-wwwqh Pod ✔ Running 61s ready:1/1
└──□ rollout-canary-5c8bf656db-x687t Pod ✔ Running 61s ready:1/1
$ cat << EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollout-canary
namespace: canary-lab
spec:
replicas: 10
selector:
matchLabels:
app: rollout-canary
template:
metadata:
labels:
app: rollout-canary
spec:
containers:
- name: rollout-canary
image: lmacademy/simple-color-app:1.0.0
env:
- name: APP_COLOR
value: 'green'
strategy:
canary:
canaryService: rollout-canary-preview
stableService: rollout-canary-stable
steps:
- setWeight: 20
- pause: {}
- setWeight: 50
- pause:
duration: 30s
EOF
$ kubectl port-forward svc/rollout-canary-public -n canary-lab 3000:3000
http://localhost:3000
// Не меняется. Ожидал, что будет отдавать часть
$ ./test-requests.sh http://localhost:3000/ -1 0.2
$ kubectl argo rollouts get rollout rollout-canary -n canary-lab
Name: rollout-canary
Namespace: canary-lab
Status: ॥ Paused
Message: CanaryPauseStep
Strategy: Canary
Step: 1/4
SetWeight: 20
ActualWeight: 20
Images: lmacademy/simple-color-app:1.0.0 (canary, stable)
Replicas:
Desired: 10
Current: 10
Updated: 2
Ready: 10
Available: 10
NAME KIND STATUS AGE INFO
⟳ rollout-canary Rollout ॥ Paused 45m
├──# revision:2
│ └──⧉ rollout-canary-6d79bd67cd ReplicaSet ✔ Healthy 6m1s canary
│ ├──□ rollout-canary-6d79bd67cd-n5n9f Pod ✔ Running 6m1s ready:1/1
│ └──□ rollout-canary-6d79bd67cd-slfmx Pod ✔ Running 6m1s ready:1/1
└──# revision:1
└──⧉ rollout-canary-5c8bf656db ReplicaSet ✔ Healthy 45m stable
├──□ rollout-canary-5c8bf656db-2c8mm Pod ✔ Running 45m ready:1/1
├──□ rollout-canary-5c8bf656db-4jmd6 Pod ✔ Running 45m ready:1/1
├──□ rollout-canary-5c8bf656db-bsfsr Pod ✔ Running 45m ready:1/1
├──□ rollout-canary-5c8bf656db-cz8mq Pod ✔ Running 45m ready:1/1
├──□ rollout-canary-5c8bf656db-hnc9c Pod ✔ Running 45m ready:1/1
├──□ rollout-canary-5c8bf656db-q5rqt Pod ✔ Running 45m ready:1/1
├──□ rollout-canary-5c8bf656db-rhffj Pod ✔ Running 45m ready:1/1
└──□ rollout-canary-5c8bf656db-x687t Pod ✔ Running 45m ready:1/1
$ kubectl argo rollouts promote rollout-canary -n canary-lab