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などもあります。
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をクリックすると詳細や右上に操作するボタンがあります。
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も試してみたいです。