[Book] [OK!] GitOps Cookbook: 08. Advanced Topics: 8.6 Use Advanced Deployment Techniques


Задача:
При деплое использовать blue-green или canary


Делаю:
2025.12.10


Устанавливаю argo-rollouts


$ cat << 'EOF' | kubectl create -f -
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: bgd-rollouts
spec:
  replicas: 5
  strategy:
    canary:
      steps:
      - setWeight: 20
      - pause: {}
      - setWeight: 40
      - pause:
          duration: 30s
      - setWeight: 60
      - pause:
          duration: 30s
      - setWeight: 80
      - pause:
          duration: 30s
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: bgd-rollouts
  template:
    metadata:
      labels:
        app: bgd-rollouts
    spec:
      containers:
      - image: quay.io/rhdevelopers/bgd:1.0.0
        name: bgd
        env:
        - name: COLOR
          value: "blue"
        resources: {}
EOF


$ kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
bgd-rollouts-679cdfcfd-279mg   1/1     Running   0          27s
bgd-rollouts-679cdfcfd-drl5z   1/1     Running   0          27s
bgd-rollouts-679cdfcfd-fsjml   1/1     Running   0          27s
bgd-rollouts-679cdfcfd-m4m9n   1/1     Running   0          27s
bgd-rollouts-679cdfcfd-pffjd   1/1     Running   0          27s


$ kubectl argo rollouts get rollout bgd-rollouts


...
name: bgd
env:
- name: COLOR
value: "green"
resources: {}


$ kubectl get pods


$ kubectl argo rollouts get rollout bgd-rollouts
Name:            bgd-rollouts
Namespace:       default
Status:          ✔ Healthy
Strategy:        Canary
  Step:          8/8
  SetWeight:     100
  ActualWeight:  100
Images:          quay.io/rhdevelopers/bgd:1.0.0 (stable)
Replicas:
  Desired:       5
  Current:       5
  Updated:       5
  Ready:         5
  Available:     5

NAME                                     KIND        STATUS     AGE  INFO
⟳ bgd-rollouts                           Rollout     ✔ Healthy  71s
└──# revision:1
   └──⧉ bgd-rollouts-679cdfcfd           ReplicaSet  ✔ Healthy  71s  stable
      ├──□ bgd-rollouts-679cdfcfd-279mg  Pod         ✔ Running  71s  ready:1/1
      ├──□ bgd-rollouts-679cdfcfd-drl5z  Pod         ✔ Running  71s  ready:1/1
      ├──□ bgd-rollouts-679cdfcfd-fsjml  Pod         ✔ Running  71s  ready:1/1
      ├──□ bgd-rollouts-679cdfcfd-m4m9n  Pod         ✔ Running  71s  ready:1/1
      └──□ bgd-rollouts-679cdfcfd-pffjd  Pod         ✔ Running  71s  ready:1/1


$ cat << 'EOF' | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: bgd-rollouts
spec:
  replicas: 5
  strategy:
    canary:
      steps:
      - setWeight: 20
      - pause: {}
      - setWeight: 40
      - pause:
          duration: 30s
      - setWeight: 60
      - pause:
          duration: 30s
      - setWeight: 80
      - pause:
          duration: 30s
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: bgd-rollouts
  template:
    metadata:
      labels:
        app: bgd-rollouts
    spec:
      containers:
      - image: quay.io/rhdevelopers/bgd:1.0.0
        name: bgd
        env:
        - name: COLOR
          value: "green"
        resources: {}
EOF


// 1 pod пошел обновляться
$ kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
bgd-rollouts-679cdfcfd-279mg   1/1     Running   0          4m30s
bgd-rollouts-679cdfcfd-drl5z   1/1     Running   0          4m30s
bgd-rollouts-679cdfcfd-fsjml   1/1     Running   0          4m30s
bgd-rollouts-679cdfcfd-pffjd   1/1     Running   0          4m30s
bgd-rollouts-c5495c6ff-6nfwq   1/1     Running   0          19s


$ kubectl argo rollouts get rollout bgd-rollouts
Name:            bgd-rollouts
Namespace:       default
Status:          ॥ Paused
Message:         CanaryPauseStep
Strategy:        Canary
  Step:          1/8
  SetWeight:     20
  ActualWeight:  20
Images:          quay.io/rhdevelopers/bgd:1.0.0 (canary, stable)
Replicas:
  Desired:       5
  Current:       5
  Updated:       1
  Ready:         5
  Available:     5

NAME                                     KIND        STATUS     AGE    INFO
⟳ bgd-rollouts                           Rollout     ॥ Paused   5m23s
├──# revision:2
│  └──⧉ bgd-rollouts-c5495c6ff           ReplicaSet  ✔ Healthy  72s    canary
│     └──□ bgd-rollouts-c5495c6ff-6nfwq  Pod         ✔ Running  72s    ready:1/1
└──# revision:1
   └──⧉ bgd-rollouts-679cdfcfd           ReplicaSet  ✔ Healthy  5m23s  stable
      ├──□ bgd-rollouts-679cdfcfd-279mg  Pod         ✔ Running  5m23s  ready:1/1
      ├──□ bgd-rollouts-679cdfcfd-drl5z  Pod         ✔ Running  5m23s  ready:1/1
      ├──□ bgd-rollouts-679cdfcfd-fsjml  Pod         ✔ Running  5m23s  ready:1/1
      └──□ bgd-rollouts-679cdfcfd-pffjd  Pod         ✔ Running  5m23s  ready:1/1


// Подтверждаем руками обновление
$ kubectl argo rollouts promote bgd-rollouts


$ kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
bgd-rollouts-c5495c6ff-5tjnw   1/1     Running   0          31s
bgd-rollouts-c5495c6ff-6nfwq   1/1     Running   0          3m11s
bgd-rollouts-c5495c6ff-mxjpc   1/1     Running   0          63s
bgd-rollouts-c5495c6ff-qxzsj   1/1     Running   0          18s
bgd-rollouts-c5495c6ff-rsx8n   1/1     Running   0          11s


$ kubectl argo rollouts get rollout bgd-rollouts
Name:            bgd-rollouts
Namespace:       default
Status:          ✔ Healthy
Strategy:        Canary
  Step:          8/8
  SetWeight:     100
  ActualWeight:  100
Images:          quay.io/rhdevelopers/bgd:1.0.0 (stable)
Replicas:
  Desired:       5
  Current:       5
  Updated:       5
  Ready:         5
  Available:     5

NAME                                     KIND        STATUS        AGE    INFO
⟳ bgd-rollouts                           Rollout     ✔ Healthy     7m51s
├──# revision:2
│  └──⧉ bgd-rollouts-c5495c6ff           ReplicaSet  ✔ Healthy     3m40s  stable
│     ├──□ bgd-rollouts-c5495c6ff-6nfwq  Pod         ✔ Running     3m40s  ready:1/1
│     ├──□ bgd-rollouts-c5495c6ff-mxjpc  Pod         ✔ Running     92s    ready:1/1
│     ├──□ bgd-rollouts-c5495c6ff-5tjnw  Pod         ✔ Running     60s    ready:1/1
│     ├──□ bgd-rollouts-c5495c6ff-qxzsj  Pod         ✔ Running     47s    ready:1/1
│     └──□ bgd-rollouts-c5495c6ff-rsx8n  Pod         ✔ Running     40s    ready:1/1
└──# revision:1
   └──⧉ bgd-rollouts-679cdfcfd           ReplicaSet  • ScaledDown  7m51s


$ kubectl get rollout
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
bgd-rollouts   5         5         5            5           13m


$ kubectl delete rollout bgd-rollouts
rollout.argoproj.io "bgd-rollouts" deleted


Пример с ISTIO

Устанавливаю argo-rollouts


$ cat << 'EOF' | kubectl create -f -
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: bgdapp
  labels:
    app: bgdapp
spec:
  strategy:
    canary:
      steps:
      - setWeight: 20
      - pause:
          duration: "1m"
      - setWeight: 50
      - pause:
          duration: "2m"
      canaryService: bgd-canary
      stableService: bgd
      trafficRouting:
        istio:
          virtualService:
            name: bgd
            routes:
            - primary
  replicas: 1
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: bgdapp
      version: v1
  template:
    metadata:
      labels:
        app: bgdapp
        version: v1
      annotations:
        sidecar.istio.io/inject: "true"
    spec:
      containers:
      - image: quay.io/rhdevelopers/bgd:1.0.0
        name: bgd
        env:
        - name: COLOR
          value: "blue"
        resources: {}
EOF


$ cat << 'EOF' | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
  name: bgd
  labels:
    app: bgdapp
spec:
  ports:
  - name: http
    port: 8080
  selector:
    app: bgdapp
EOF


$ cat << 'EOF' | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
  name: bgd-canary
  labels:
    app: bgdapp
spec:
  ports:
  - name: http
    port: 8080
  selector:
    app: bgdapp
EOF


$ cat << 'EOF' | kubectl create -f -
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bgd
spec:
  hosts:
  - bgd
  http:
  - route:
    - destination:
        host: bgd
      weight: 100
    - destination:
        host: bgd-canary
      weight: 0
    name: primary
EOF


$ kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
bgdapp-5cf67bf7f6-stdb9   1/1     Running   0          83s


$ kubectl argo rollouts get rollout bgdapp
Name:            bgdapp
Namespace:       default
Status:          ✔ Healthy
Strategy:        Canary
  Step:          4/4
  SetWeight:     100
  ActualWeight:  100
Images:          quay.io/rhdevelopers/bgd:1.0.0 (stable)
Replicas:
  Desired:       1
  Current:       1
  Updated:       1
  Ready:         1
  Available:     1

NAME                                KIND        STATUS     AGE    INFO
⟳ bgdapp                            Rollout     ✔ Healthy  19m
└──# revision:1
   └──⧉ bgdapp-5cf67bf7f6           ReplicaSet  ✔ Healthy  2m36s  stable
      └──□ bgdapp-5cf67bf7f6-stdb9  Pod         ✔ Running  2m26s  ready:1/1


$ cat << 'EOF' | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: bgdapp
  labels:
    app: bgdapp
spec:
  strategy:
    canary:
      steps:
      - setWeight: 20
      - pause:
          duration: "1m"
      - setWeight: 50
      - pause:
          duration: "2m"
      canaryService: bgd-canary
      stableService: bgd
      trafficRouting:
        istio:
          virtualService:
            name: bgd
            routes:
            - primary
  replicas: 1
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: bgdapp
      version: v1
  template:
    metadata:
      labels:
        app: bgdapp
        version: v1
      annotations:
        sidecar.istio.io/inject: "true"
    spec:
      containers:
      - image: quay.io/rhdevelopers/bgd:1.0.0
        name: bgd
        env:
        - name: COLOR
          value: "red"
        resources: {}
EOF


$ kubectl argo rollouts get rollout bgdapp
Name:            bgdapp
Namespace:       default
Status:          ॥ Paused
Message:         CanaryPauseStep
Strategy:        Canary
  Step:          1/4
  SetWeight:     20
  ActualWeight:  20
Images:          quay.io/rhdevelopers/bgd:1.0.0 (canary, stable)
Replicas:
  Desired:       1
  Current:       2
  Updated:       1
  Ready:         2
  Available:     2

NAME                                KIND        STATUS     AGE    INFO
⟳ bgdapp                            Rollout     ॥ Paused   24m
├──# revision:2
│  └──⧉ bgdapp-6f556fdfcc           ReplicaSet  ✔ Healthy  14s    canary
│     └──□ bgdapp-6f556fdfcc-cgnmn  Pod         ✔ Running  14s    ready:1/1
└──# revision:1
   └──⧉ bgdapp-5cf67bf7f6           ReplicaSet  ✔ Healthy  8m2s   stable
      └──□ bgdapp-5cf67bf7f6-stdb9  Pod         ✔ Running  7m52s  ready:1/1


$ kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
bgdapp-5cf67bf7f6-stdb9   1/1     Running   0          8m35s
bgdapp-6f556fdfcc-cgnmn   1/1     Running   0          57s


// Подтверждаем руками обновление
$ kubectl argo rollouts promote bgdapp


$ kubectl argo rollouts promote bgdapp
rollout 'bgdapp' promoted


$ kubectl argo rollouts get rollout bgdapp
Name:            bgdapp
Namespace:       default
Status:          ✔ Healthy
Strategy:        Canary
  Step:          4/4
  SetWeight:     100
  ActualWeight:  100
Images:          quay.io/rhdevelopers/bgd:1.0.0 (stable)
Replicas:
  Desired:       1
  Current:       2
  Updated:       1
  Ready:         2
  Available:     2

NAME                                KIND        STATUS     AGE    INFO
⟳ bgdapp                            Rollout     ✔ Healthy  26m
├──# revision:2
│  └──⧉ bgdapp-6f556fdfcc           ReplicaSet  ✔ Healthy  101s   stable
│     └──□ bgdapp-6f556fdfcc-cgnmn  Pod         ✔ Running  101s   ready:1/1
└──# revision:1
   └──⧉ bgdapp-5cf67bf7f6           ReplicaSet  ✔ Healthy  9m29s  delay:27s
      └──□ bgdapp-5cf67bf7f6-stdb9  Pod         ✔ Running  9m19s  ready:1/1


$ kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
bgdapp-6f556fdfcc-cgnmn   1/1     Running   0          2m41s