Argo RolloutsでBlue/Greenデプロイを試す

最近今更ですがKubernetes周りを勉強し始めました。
その中でArgo Rolloutsを試しに動かしたりBlue/Greenデプロイの流れを再現したりしたのでとりあえずブログに残しておきます。

Argo Rolloutsとは

KubernetesでBlue/Greenデプロイやカナリアデプロイなどを簡単に実現できるOSSツールです。

https://argoproj.github.io/argo-rollouts/

他にもArgo WorkflowsやArgo CDなどもあります。

https://argoproj.github.io

Blue/Greenデプロイとは

アプリケーションをデプロイする際に、既存の環境の隣にデプロイしてからルーティングを切り替えることでリリースする手法です。 実際に切り替える前にテストができたり、新旧バージョンのトラフィックが混ざったりしないなどのメリットがあります。

https://argoproj.github.io/argo-rollouts/concepts/#blue-green

インストール

Docker Desktop for MacでKubernetes有効にした環境で実施しています。
ドキュメントに沿ってControllorとkubectlのプラグインをインストールします。

https://argoproj.github.io/argo-rollouts/installation/#controller-installation

1kubectl create namespace argo-rollouts
2kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
1brew install argoproj/tap/kubectl-argo-rollouts
 1[koh@Kohs-MacBook-Pro-M1-222] ~
 2% kubectl get all -n argo-rollouts
 3NAME                                 READY   STATUS    RESTARTS   AGE
 4pod/argo-rollouts-85b47cbc5f-8lhxl   1/1     Running   0          3d
 5
 6NAME                            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
 7service/argo-rollouts-metrics   ClusterIP   10.105.204.36   <none>        8090/TCP   3d
 8
 9NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
10deployment.apps/argo-rollouts   1/1     1            1           3d
11
12NAME                                       DESIRED   CURRENT   READY   AGE
13replicaset.apps/argo-rollouts-85b47cbc5f   1         1         1       3d
14[koh@Kohs-MacBook-Pro-M1-222] ~
15%

リソース作成

まずは公式のBlue/GreenのExampleの内容をコピーします。

https://argoproj.github.io/argo-rollouts/features/bluegreen/#example

 1[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
 2% cat bg-rollout.yml
 3apiVersion: argoproj.io/v1alpha1
 4kind: Rollout
 5metadata:
 6  name: rollout-bluegreen
 7spec:
 8  replicas: 2
 9  revisionHistoryLimit: 2
10  selector:
11    matchLabels:
12      app: rollout-bluegreen
13  template:
14    metadata:
15      labels:
16        app: rollout-bluegreen
17    spec:
18      containers:
19      - name: rollouts-demo
20        image: argoproj/rollouts-demo:blue
21        imagePullPolicy: Always
22        ports:
23        - containerPort: 8080
24  strategy:
25    blueGreen:
26      # activeService specifies the service to update with the new template hash at time of promotion.
27      # This field is mandatory for the blueGreen update strategy.
28      activeService: rollout-bluegreen-active
29      # previewService specifies the service to update with the new template hash before promotion.
30      # This allows the preview stack to be reachable without serving production traffic.
31      # This field is optional.
32      previewService: rollout-bluegreen-preview
33      # autoPromotionEnabled disables automated promotion of the new stack by pausing the rollout
34      # immediately before the promotion. If omitted, the default behavior is to promote the new
35      # stack as soon as the ReplicaSet are completely ready/available.
36      # Rollouts can be resumed using: `kubectl argo rollouts promote ROLLOUT`
37      autoPromotionEnabled: false
38
39[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
40%

後はactive/previewそれぞれのServiceを作成します。

 1[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
 2% cat bg-service-active.yml
 3apiVersion: v1
 4kind: Service
 5metadata:
 6  name: rollout-bluegreen-active
 7spec:
 8  ports:
 9  - port: 80
10    targetPort: http
11    protocol: TCP
12    name: http
13  selector:
14    app: rollout-bluegreen
15[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
16% cat bg-service-preview.yml
17apiVersion: v1
18kind: Service
19metadata:
20  name: rollout-bluegreen-preview
21spec:
22  ports:
23  - port: 80
24    targetPort: http
25    protocol: TCP
26    name: http
27  selector:
28    app: rollout-bluegreen
29[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
30%

そしてそれらをapplyします。

 1[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
 2% ls
 3bg-rollout.yml          bg-service-active.yml   bg-service-preview.yml
 4[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
 5% kubectl apply -f .
 6rollout.argoproj.io/rollout-bluegreen created
 7service/rollout-bluegreen-active created
 8service/rollout-bluegreen-preview created
 9[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
10%

Argo Rolloutsにはダッシュボード機能があるのでそこからも確認してみます。

1[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
2% kubectl argo rollouts dashboard
3INFO[0000] Argo Rollouts Dashboard is now available at http://localhost:3100/rollouts

http://localhost:3100/rolloutsにアクセスするとrollout-bluegreenができています。

ダッシュボード

rollout-bluegreenをクリックすると詳細や右上に操作するボタンがあります。

Rollout詳細

CLIの場合は下記で表示できます。

 1[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
 2% kubectl argo rollouts get rollout rollout-bluegreen
 3
 4Name:            rollout-bluegreen
 5Namespace:       argocd
 6Status:          ✔ Healthy
 7Strategy:        BlueGreen
 8Images:          argoproj/rollouts-demo:blue (stable, active)
 9Replicas:
10  Desired:       2
11  Current:       2
12  Updated:       2
13  Ready:         2
14  Available:     2
15
16NAME                                           KIND        STATUS     AGE  INFO
17⟳ rollout-bluegreen                            Rollout     ✔ Healthy  10m
18└──# revision:1
19   └──⧉ rollout-bluegreen-5ffd47b8d4           ReplicaSet  ✔ Healthy  10m  stable,active
20      ├──□ rollout-bluegreen-5ffd47b8d4-qm2fl  Pod         ✔ Running  10m  ready:1/1
21      └──□ rollout-bluegreen-5ffd47b8d4-x7t4f  Pod         ✔ Running  10m  ready:1/1

また --watchをつけるとリアルタイムで更新してくれるのでオプションつけた上で作業するとわかりやすいです。

Rollout実施

まず現在使用しているイメージを更新します。
元のTagがblueだったところをYellowにします。

1[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
2% kubectl argo rollouts set image rollout-bluegreen rollouts-demo=argoproj/rollouts-demo:yellow
3
4rollout "rollout-bluegreen" image updated
5[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
6%
 1% kubectl argo rollouts get rollout rollout-bluegreen
 2Name:            rollout-bluegreen
 3Namespace:       argocd
 4Status:          ॥ Paused
 5Message:         BlueGreenPause
 6Strategy:        BlueGreen
 7Images:          argoproj/rollouts-demo:blue (stable, active)
 8                 argoproj/rollouts-demo:yellow (preview)
 9Replicas:
10  Desired:       2
11  Current:       4
12  Updated:       2
13  Ready:         2
14  Available:     2
15
16NAME                                           KIND        STATUS     AGE  INFO
17⟳ rollout-bluegreen                            Rollout     ॥ Paused   14m
18├──# revision:2
19│  └──⧉ rollout-bluegreen-674b45d9b4           ReplicaSet  ✔ Healthy  48s  preview
20│     ├──□ rollout-bluegreen-674b45d9b4-8sdnz  Pod         ✔ Running  48s  ready:1/1
21│     └──□ rollout-bluegreen-674b45d9b4-gm9gm  Pod         ✔ Running  48s  ready:1/1
22└──# revision:1
23   └──⧉ rollout-bluegreen-5ffd47b8d4           ReplicaSet  ✔ Healthy  14m  stable,active
24      ├──□ rollout-bluegreen-5ffd47b8d4-qm2fl  Pod         ✔ Running  14m  ready:1/1
25      └──□ rollout-bluegreen-5ffd47b8d4-x7t4f  Pod         ✔ Running  14m  ready:1/1
26[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
27%

するとrevision:2がpreviewとして立ち上がります。
またその状態で止まるので実際にはこのタイミングでpreview側の動作確認などを実施するイメージです。

この後に切り替え実施(promote)します。

1[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
2% kubectl argo rollouts promote rollout-bluegreen
3
4rollout 'rollout-bluegreen' promoted
5[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
6%

そうするとactiveとpreviewが入れ替わり、その後入れ替わったpreview(revision:1)の方が停止します。

 1
 2[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
 3% kubectl argo rollouts get rollout rollout-bluegreen
 4Name:            rollout-bluegreen
 5Namespace:       argocd
 6Status:          ✔ Healthy
 7Strategy:        BlueGreen
 8Images:          argoproj/rollouts-demo:blue
 9                 argoproj/rollouts-demo:yellow (stable, active)
10Replicas:
11  Desired:       2
12  Current:       4
13  Updated:       2
14  Ready:         2
15  Available:     2
16
17NAME                                           KIND        STATUS     AGE   INFO
18⟳ rollout-bluegreen                            Rollout     ✔ Healthy  17m
19├──# revision:2
20│  └──⧉ rollout-bluegreen-674b45d9b4           ReplicaSet  ✔ Healthy  4m9s  stable,active
21│     ├──□ rollout-bluegreen-674b45d9b4-8sdnz  Pod         ✔ Running  4m9s  ready:1/1
22│     └──□ rollout-bluegreen-674b45d9b4-gm9gm  Pod         ✔ Running  4m9s  ready:1/1
23└──# revision:1
24   └──⧉ rollout-bluegreen-5ffd47b8d4           ReplicaSet  ✔ Healthy  17m   delay:14s
25      ├──□ rollout-bluegreen-5ffd47b8d4-qm2fl  Pod         ✔ Running  17m   ready:1/1
26      └──□ rollout-bluegreen-5ffd47b8d4-x7t4f  Pod         ✔ Running  17m   ready:1/1
27[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
28%
29
30...
31
32[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
33% kubectl argo rollouts get rollout rollout-bluegreen
34Name:            rollout-bluegreen
35Namespace:       argocd
36Status:          ✔ Healthy
37Strategy:        BlueGreen
38Images:          argoproj/rollouts-demo:yellow (stable, active)
39Replicas:
40  Desired:       2
41  Current:       2
42  Updated:       2
43  Ready:         2
44  Available:     2
45
46NAME                                           KIND        STATUS        AGE    INFO
47⟳ rollout-bluegreen                            Rollout     ✔ Healthy     21m
48├──# revision:2
49│  └──⧉ rollout-bluegreen-674b45d9b4           ReplicaSet  ✔ Healthy     7m40s  stable,active
50│     ├──□ rollout-bluegreen-674b45d9b4-8sdnz  Pod         ✔ Running     7m40s  ready:1/1
51│     └──□ rollout-bluegreen-674b45d9b4-gm9gm  Pod         ✔ Running     7m40s  ready:1/1
52└──# revision:1
53   └──⧉ rollout-bluegreen-5ffd47b8d4           ReplicaSet  • ScaledDown  20m
54[koh@Kohs-MacBook-Pro-M1-222] ~/work/argo
55%

またダッシュボードからみるとRivisionが2になっていてtagも変わってることが確認できます。

切り替え後ダッシュボード

まとめ

このように簡単にBlue/Greenデプロイを実施できる + 簡単に中断や切り戻しもできたりオプションで細かい動作も制御できそうなのでとてもいい感じです。
他にもArgo WorkflowsやArgoCDも試してみたいです。