はじめに
前回まででアプリケーション側のパイプラインの実装が終わりました。
今回はインフラ側のパイプラインを実装します。
具体的には更新されたアプリケーションを含むDocker imageをBlue Green Deploymentによってデプロイします。
Blue Green Deployment(設定)
Blue Green DeploymentをArgoCDで実装します。
Rolloutのインストール
$ kubectl create namespace argo-rollouts
namespace/argo-rollouts created
$ kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
$ curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-arm64
$ chmod +x kubectl-argo-rollouts-linux-arm64
$ sudo mv kubectl-argo-rollouts-linux-arm64 /usr/local/bin/kubectl-argo-rollouts
## 確認
$ kubectl argo rollouts version
kubectl-argo-rollouts: v1.8.3+49fa151
BuildDate: 2025-06-04T22:15:54Z
GitCommit: 49fa1516cf71672b69e265267da4e1d16e1fe114
GitTreeState: clean
GoVersion: go1.23.9
Compiler: gc
Platform: linux/arm64Rolloutの実装
もともと、kindがDeploymentだったマニフェストファイルをRolloutに変更します。
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: {{ .Values.appName }}
namespace: {{ .Values.namespace }}
labels:
app: {{ .Values.appName }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Values.appName }}
strategy:
blueGreen:
activeService: {{ .Values.service.name }}
previewService: {{ .Values.service.name }}-preview
autoPromotionEnabled: true
previewReplicaCount: 1
autoPromotionSeconds: 300
scaleDownDelaySeconds: 30
template:
metadata:
labels:
app: {{ .Values.appName }}
spec:
containers:
- name: {{ .Values.appName }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.service.port }}
name: backend-port
env:
- name: OLLAMA_URL
value: "http://ref-voice-ollama-svc:11434"
imagePullSecrets:
- name: {{ .Values.image.pullSecret }}serviceは2つ用意する必要があります。
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.service.name }}
namespace: {{ .Values.namespace }}
labels:
app: {{ .Values.appName }}
spec:
selector:
app: {{ .Values.appName }}
ports:
- name: http
protocol: TCP
port: {{ .Values.service.port }}
targetPort: {{ .Values.service.targetPort }}
type: {{ .Values.service.type }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.service.name }}-preview
namespace: {{ .Values.namespace }}
labels:
app: {{ .Values.appName }}
spec:
selector:
app: {{ .Values.appName }}
ports:
- name: http
protocol: TCP
port: {{ .Values.service.port }}
targetPort: {{ .Values.service.targetPort }}
type: {{ .Values.service.type }}(変数としてvalues.yamlにて設定がされていて、各値が代入されています。)
Blue Green Deployment(実行)
ArgoCDにてSyncしたタイミングでblue green deploymentが開始されます。
kubectl argo rollouts get rollout -n <namespace名> <rollout名> --watchというコマンドで挙動を確認できるので、どのような挙動になるかを確認してみました。
revision 3を間違えてしまったため、正しいアプリケーションのデータでSyncし、revision 4が払い出されている様子です。Brue Greenの状態👇
NAME KIND STATUS AGE INFO
⟳ ref-voice-backend Rollout ◌ Progressing 24h
├──# revision:4
│ └──⧉ ref-voice-backend-7b546b7679 ReplicaSet ◌ Progressing 19s preview
│ └──□ ref-voice-backend-7b546b7679-nb44w Pod ◌ ContainerCreating 19s ready:0/1
├──# revision:3
│ └──⧉ ref-voice-backend-69f8c996f5 ReplicaSet ◌ Progressing 4m4s delay:10s
│ ├──□ ref-voice-backend-69f8c996f5-8f497 Pod ⚠ ImagePullBackOff 4m4s ready:0/1
│ └──□ ref-voice-backend-69f8c996f5-7gv88 Pod ⚠ ErrImagePull 19s ready:0/1
├──# revision:2
│ └──⧉ ref-voice-backend-5db9dcb468 ReplicaSet ✔ Healthy 22h stable,active
│ ├──□ ref-voice-backend-5db9dcb468-2v44t Pod ✔ Running 22h ready:1/1
│ └──□ ref-voice-backend-5db9dcb468-p4bb6 Pod ✔ Running 21h ready:1/1
└──# revision:1
└──⧉ ref-voice-backend-589f4f5ccc ReplicaSet • ScaledDown 24h
Name: ref-voice-backend
Namespace: ref-voice
Status: ◌ Progressing
Message: more replicas need to be updated
Strategy: BlueGreen
Images: appare99/ref-voice-backend:v1.0.32 (stable, active)
appare99/ref-voice-backend:v1.0.33
appare99/ref-voice-backend:v1.0.51 (preview)
Replicas:
Desired: 2
Current: 5
Updated: 1
Ready: 2
Available: 2時間が経つと、きちんとrevision 3は自動的にScaledDownになります。
revision 4にてcontainerが1つ作成中であることがわかります。Brue Greenの状態👇
NAME KIND STATUS AGE INFO
⟳ ref-voice-backend Rollout ◌ Progressing 24h
├──# revision:4
│ └──⧉ ref-voice-backend-7b546b7679 ReplicaSet ◌ Progressing 32s preview
│ └──□ ref-voice-backend-7b546b7679-nb44w Pod ◌ ContainerCreating 32s ready:0/1
├──# revision:3
│ └──⧉ ref-voice-backend-69f8c996f5 ReplicaSet • ScaledDown 4m17s
├──# revision:2
│ └──⧉ ref-voice-backend-5db9dcb468 ReplicaSet ✔ Healthy 22h stable,active
│ ├──□ ref-voice-backend-5db9dcb468-2v44t Pod ✔ Running 22h ready:1/1
│ └──□ ref-voice-backend-5db9dcb468-p4bb6 Pod ✔ Running 21h ready:1/1
└──# revision:1
└──⧉ ref-voice-backend-589f4f5ccc ReplicaSet • ScaledDown 24h
Name: ref-voice-backend
Namespace: ref-voice
Status: ◌ Progressing
Message: more replicas need to be updated
Strategy: BlueGreen
Images: appare99/ref-voice-backend:v1.0.32 (stable, active)
appare99/ref-voice-backend:v1.0.51 (preview)
Replicas:
Desired: 2
Current: 3
Updated: 1
Ready: 2
Available: 2podの様子を見てみると、ここできちんと、新しいpodが立ち上がり中であることが分かります。
NAME READY STATUS RESTARTS AGE
ref-voice-backend-5db9dcb468-2v44t 1/1 Running 0 22h
ref-voice-backend-5db9dcb468-p4bb6 1/1 Running 0 21h
ref-voice-backend-7b546b7679-nb44w 0/1 ContainerCreating 0 115s1つ目のpodができたら(Runningになったら)、2つ目のpodが立ち上がり始めます。
Brue Greenの状態👇
NAME KIND STATUS AGE INFO
⟳ ref-voice-backend Rollout ◌ Progressing 24h
├──# revision:4
│ └──⧉ ref-voice-backend-7b546b7679 ReplicaSet ◌ Progressing 10m preview
│ ├──□ ref-voice-backend-7b546b7679-nb44w Pod ✔ Running 10m ready:1/1
│ └──□ ref-voice-backend-7b546b7679-m65tg Pod ◌ ContainerCreating 51s ready:0/1
├──# revision:3
│ └──⧉ ref-voice-backend-69f8c996f5 ReplicaSet • ScaledDown 14m
├──# revision:2
│ └──⧉ ref-voice-backend-5db9dcb468 ReplicaSet ✔ Healthy 22h stable,active
│ ├──□ ref-voice-backend-5db9dcb468-2v44t Pod ✔ Running 22h ready:1/1
│ └──□ ref-voice-backend-5db9dcb468-p4bb6 Pod ✔ Running 22h ready:1/1
└──# revision:1
└──⧉ ref-voice-backend-589f4f5ccc ReplicaSet • ScaledDown 24h
Name: ref-voice-backend
Namespace: ref-voice
Status: ◌ Progressing
Message: active service cutover pending
Strategy: BlueGreen
Images: appare99/ref-voice-backend:v1.0.32 (stable, active)
appare99/ref-voice-backend:v1.0.51 (preview)
Replicas:
Desired: 2
Current: 4
Updated: 2
Ready: 2
Available: 2新しい1つ目のpodができたら続いて2つめのpodも起動し始めます。
NAME READY STATUS RESTARTS AGE
ref-voice-backend-5db9dcb468-2v44t 1/1 Running 0 22h
ref-voice-backend-5db9dcb468-p4bb6 1/1 Running 0 22h
ref-voice-backend-7b546b7679-m65tg 0/1 ContainerCreating 0 74s
ref-voice-backend-7b546b7679-nb44w 1/1 Running 0 11mBrue Greenの状態👇
NAME KIND STATUS AGE INFO
⟳ ref-voice-backend Rollout ✔ Healthy 24h
├──# revision:4
│ └──⧉ ref-voice-backend-7b546b7679 ReplicaSet ✔ Healthy 23m stable,active
│ ├──□ ref-voice-backend-7b546b7679-nb44w Pod ✔ Running 23m ready:1/1
│ ├──□ ref-voice-backend-7b546b7679-m65tg Pod ContainerStatusUnknown 13m ready:0/1,restarts:1
│ └──□ ref-voice-backend-7b546b7679-9s6sh Pod ✔ Running 4m53s ready:1/1
├──# revision:3
│ └──⧉ ref-voice-backend-69f8c996f5 ReplicaSet • ScaledDown 26m
├──# revision:2
│ └──⧉ ref-voice-backend-5db9dcb468 ReplicaSet ✔ Healthy 22h delay:20s
│ ├──□ ref-voice-backend-5db9dcb468-2v44t Pod ✔ Running 22h ready:1/1
│ └──□ ref-voice-backend-5db9dcb468-p4bb6 Pod ✔ Running 22h ready:1/1
└──# revision:1
└──⧉ ref-voice-backend-589f4f5ccc ReplicaSet • ScaledDown 24h
Name: ref-voice-backend
Namespace: ref-voice
Status: ✔ Healthy
Strategy: BlueGreen
Images: appare99/ref-voice-backend:v1.0.32
appare99/ref-voice-backend:v1.0.51 (stable, active)
Replicas:
Desired: 2
Current: 4
Updated: 2
Ready: 2
Available: 2そしてBlueとGreenのどちらも動いている状態になります。
ref-voice-backend-5db9dcb468-2v44t 1/1 Running 0 22h
ref-voice-backend-5db9dcb468-p4bb6 1/1 Running 0 22h
ref-voice-backend-7b546b7679-9s6sh 1/1 Running 0 5m10s
ref-voice-backend-7b546b7679-m65tg 0/1 ContainerStatusUnknown 1 13m
ref-voice-backend-7b546b7679-nb44w 1/1 Running 0 23mBrue Greenの状態👇
⟳ ref-voice-backend Rollout ✔ Healthy 24h
├──# revision:4
│ └──⧉ ref-voice-backend-7b546b7679 ReplicaSet ✔ Healthy 28m stable,active
│ ├──□ ref-voice-backend-7b546b7679-nb44w Pod ✔ Running 28m ready:1/1
│ ├──□ ref-voice-backend-7b546b7679-m65tg Pod ContainerStatusUnknown 18m ready:0/1,restarts:1
│ └──□ ref-voice-backend-7b546b7679-9s6sh Pod ✔ Running 9m51s ready:1/1
├──# revision:3
│ └──⧉ ref-voice-backend-69f8c996f5 ReplicaSet • ScaledDown 31m
├──# revision:2
│ └──⧉ ref-voice-backend-5db9dcb468 ReplicaSet ◌ Progressing 22h
│ ├──□ ref-voice-backend-5db9dcb468-2v44t Pod ✔ Running 22h ready:1/1
│ └──□ ref-voice-backend-5db9dcb468-p4bb6 Pod ✔ Running 22h ready:1/1
└──# revision:1
└──⧉ ref-voice-backend-589f4f5ccc ReplicaSet • ScaledDown 24h
Name: ref-voice-backend
Namespace: ref-voice
Status: ✔ Healthy
Strategy: BlueGreen
Images: appare99/ref-voice-backend:v1.0.32
appare99/ref-voice-backend:v1.0.51 (stable, active)
Replicas:
Desired: 2
Current: 4
Updated: 2
Ready: 2
Available: 2最後に全て新しい方に移行が完了します。
NAME KIND STATUS AGE INFO
⟳ ref-voice-backend Rollout ✔ Healthy 24h
├──# revision:4
│ └──⧉ ref-voice-backend-7b546b7679 ReplicaSet ✔ Healthy 36m stable,active
│ ├──□ ref-voice-backend-7b546b7679-nb44w Pod ✔ Running 36m ready:1/1
│ ├──□ ref-voice-backend-7b546b7679-m65tg Pod ContainerStatusUnknown 26m ready:0/1,restarts:1
│ └──□ ref-voice-backend-7b546b7679-9s6sh Pod ✔ Running 18m ready:1/1
├──# revision:3
│ └──⧉ ref-voice-backend-69f8c996f5 ReplicaSet • ScaledDown 40m
├──# revision:2
│ └──⧉ ref-voice-backend-5db9dcb468 ReplicaSet • ScaledDown 22h
└──# revision:1
└──⧉ ref-voice-backend-589f4f5ccc ReplicaSet • ScaledDown 24h
Name: ref-voice-backend
Namespace: ref-voice
Status: ✔ Healthy
Strategy: BlueGreen
Images: appare99/ref-voice-backend:v1.0.51 (stable, active)
Replicas:
Desired: 2
Current: 2
Updated: 2
Ready: 2
Available: 2podの方も確認すると新しいものしか残っていません。
NAME READY STATUS RESTARTS AGE
ref-voice-backend-7b546b7679-9s6sh 1/1 Running 0 18m
ref-voice-backend-7b546b7679-m65tg 0/1 ContainerStatusUnknown 1 27m
ref-voice-backend-7b546b7679-nb44w 1/1 Running 0 37mこれで、Blue Green Deploymentが完了しました。
最後に
Blue Green Deploymentの実装自体はかなり簡単にできました。
