All technological notes.
canary deployment
load balancer.


Blue/Green:
A/B Testing:
# 00-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: canary
---
# 01-services.yaml
apiVersion: v1
kind: Service
metadata:
name: rollout-canary-public
namespace: canary
spec:
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
selector:
app: rollout-canary
---
apiVersion: v1
kind: Service
metadata:
name: rollout-canary-stable
namespace: canary
spec:
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
selector:
app: rollout-canary
---
apiVersion: v1
kind: Service
metadata:
name: rollout-canary-preview
namespace: canary
spec:
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
selector:
app: rollout-canary
---
# 02-rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollout-canary
namespace: canary
spec:
replicas: 10
selector:
matchLabels:
app: rollout-canary
template:
metadata:
labels:
app: rollout-canary
spec:
containers:
- name: rollout-canary
# image: argoproj/rollouts-demo:yellow
image: argoproj/rollouts-demo:red
ports:
- name: http
containerPort: 80
protocol: TCP
strategy:
canary:
canaryService: rollout-canary-preview
stableService: rollout-canary-stable
steps:
- setWeight: 30
- pause: {} # indefinite — manual promotion required
- setWeight: 50
- pause:
duration: 60s
kubectl apply -f .
# namespace/canary created
# service/rollout-canary-public created
# service/rollout-canary-stable created
# service/rollout-canary-preview created
# rollout.argoproj.io/rollout-canary created
kubectl argo rollouts get rollout rollout-canary -n canary
# Name: rollout-canary
# Namespace: canary
# Status: ✔ Healthy
# Strategy: Canary
# Step: 4/4
# SetWeight: 100
# ActualWeight: 100
# Images: argoproj/rollouts-demo:yellow (stable)
# Replicas:
# Desired: 10
# Current: 10
# Updated: 10
# Ready: 10
# Available: 10
# NAME KIND STATUS AGE INFO
# ⟳ rollout-canary Rollout ✔ Healthy 39s
# └──# revision:1
# └──⧉ rollout-canary-77d8f8dd9f ReplicaSet ✔ Healthy 39s stable
# ├──□ rollout-canary-77d8f8dd9f-2lmsz Pod ✔ Running 39s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-4pqw6 Pod ✔ Running 39s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-967v9 Pod ✔ Running 39s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-cmz5d Pod ✔ Running 39s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-gt56n Pod ✔ Running 39s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-jxd9j Pod ✔ Running 39s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-kdcnn Pod ✔ Running 39s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-px8pv Pod ✔ Running 39s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-rmrlq Pod ✔ Running 39s ready:1/1
# └──□ rollout-canary-77d8f8dd9f-vdjtr Pod ✔ Running 39s ready:1/1

image: argoproj/rollouts-demo:red
kubectl apply -f .
# namespace/canary unchanged
# service/rollout-canary-public unchanged
# service/rollout-canary-stable unchanged
# service/rollout-canary-preview unchanged
# rollout.argoproj.io/rollout-canary configured
kubectl argo rollouts get rollout rollout-canary -n canary
# Name: rollout-canary
# Namespace: canary
# Status: ॥ Paused
# Message: CanaryPauseStep
# Strategy: Canary
# Step: 1/4
# SetWeight: 30
# ActualWeight: 30
# Images: argoproj/rollouts-demo:red (canary)
# argoproj/rollouts-demo:yellow (stable)
# Replicas:
# Desired: 10
# Current: 10
# Updated: 3
# Ready: 10
# Available: 10
# NAME KIND STATUS AGE INFO
# ⟳ rollout-canary Rollout ॥ Paused 106s
# ├──# revision:2
# │ └──⧉ rollout-canary-dd97f65d4 ReplicaSet ✔ Healthy 21s canary
# │ ├──□ rollout-canary-dd97f65d4-29szj Pod ✔ Running 21s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-4vqvv Pod ✔ Running 21s ready:1/1
# │ └──□ rollout-canary-dd97f65d4-pgmm5 Pod ✔ Running 21s ready:1/1
# └──# revision:1
# └──⧉ rollout-canary-77d8f8dd9f ReplicaSet ✔ Healthy 106s stable
# ├──□ rollout-canary-77d8f8dd9f-967v9 Pod ✔ Running 106s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-cmz5d Pod ✔ Running 106s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-gt56n Pod ✔ Running 106s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-kdcnn Pod ✔ Running 106s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-px8pv Pod ✔ Running 106s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-rmrlq Pod ✔ Running 106s ready:1/1
# └──□ rollout-canary-77d8f8dd9f-vdjtr Pod ✔ Running 106s ready:1/1

kubectl argo rollouts promote rollout-canary -n canary
# rollout 'rollout-canary' promoted
kubectl argo rollouts get rollout rollout-canary -n canary
# Name: rollout-canary
# Namespace: canary
# Status: ॥ Paused
# Message: CanaryPauseStep
# Strategy: Canary
# Step: 3/4
# SetWeight: 50
# ActualWeight: 50
# Images: argoproj/rollouts-demo:red (canary)
# argoproj/rollouts-demo:yellow (stable)
# Replicas:
# Desired: 10
# Current: 10
# Updated: 5
# Ready: 10
# Available: 10
# NAME KIND STATUS AGE INFO
# ⟳ rollout-canary Rollout ॥ Paused 4m45s
# ├──# revision:2
# │ └──⧉ rollout-canary-dd97f65d4 ReplicaSet ✔ Healthy 3m20s canary
# │ ├──□ rollout-canary-dd97f65d4-29szj Pod ✔ Running 3m20s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-4vqvv Pod ✔ Running 3m20s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-pgmm5 Pod ✔ Running 3m20s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-7gvfw Pod ✔ Running 11s ready:1/1
# │ └──□ rollout-canary-dd97f65d4-lfc8x Pod ✔ Running 11s ready:1/1
# └──# revision:1
# └──⧉ rollout-canary-77d8f8dd9f ReplicaSet ✔ Healthy 4m45s stable
# ├──□ rollout-canary-77d8f8dd9f-967v9 Pod ◌ Terminating 4m45s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-cmz5d Pod ✔ Running 4m45s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-gt56n Pod ✔ Running 4m45s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-kdcnn Pod ✔ Running 4m45s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-px8pv Pod ✔ Running 4m45s ready:1/1
# ├──□ rollout-canary-77d8f8dd9f-rmrlq Pod ◌ Terminating 4m45s ready:1/1
# └──□ rollout-canary-77d8f8dd9f-vdjtr Pod ✔ Running 4m45s ready:1/1

kubectl argo rollouts get rollout rollout-canary -n canary
# Name: rollout-canary
# Namespace: canary
# Status: ✔ Healthy
# Strategy: Canary
# Step: 4/4
# SetWeight: 100
# ActualWeight: 100
# Images: argoproj/rollouts-demo:red (stable)
# Replicas:
# Desired: 10
# Current: 10
# Updated: 10
# Ready: 10
# Available: 10
# NAME KIND STATUS AGE INFO
# ⟳ rollout-canary Rollout ✔ Healthy 7m6s
# ├──# revision:2
# │ └──⧉ rollout-canary-dd97f65d4 ReplicaSet ✔ Healthy 5m41s stable
# │ ├──□ rollout-canary-dd97f65d4-29szj Pod ✔ Running 5m41s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-4vqvv Pod ✔ Running 5m41s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-pgmm5 Pod ✔ Running 5m41s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-7gvfw Pod ✔ Running 2m32s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-lfc8x Pod ✔ Running 2m32s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-4879x Pod ✔ Running 89s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-68ltg Pod ✔ Running 89s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-cmlxg Pod ✔ Running 89s ready:1/1
# │ ├──□ rollout-canary-dd97f65d4-j6zmh Pod ✔ Running 89s ready:1/1
# │ └──□ rollout-canary-dd97f65d4-xpx5n Pod ✔ Running 89s ready:1/1
# └──# revision:1
# └──⧉ rollout-canary-77d8f8dd9f ReplicaSet • ScaledDown 7m6s

kubectl get rollouts -n canary
# NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
# rollout-canary 10 10 10 10 9m47s
kubectl delete rollouts rollout-canary -n canary
# rollout.argoproj.io "rollout-canary" deleted from canary namespace