おうちk8sでCI/CDの導入2(ArgoCDのRolloutでBlue Green Deploymentをする)

スポンサーリンク
Uncategorized

はじめに

前回まででアプリケーション側のパイプラインの実装が終わりました。

今回はインフラ側のパイプラインを実装します。

具体的には更新されたアプリケーションを含む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/arm64

Rolloutの実装

もともと、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:     2

podの様子を見てみると、ここできちんと、新しい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          115s

1つ目の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          11m

Brue 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          23m

Brue 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:     2

podの方も確認すると新しいものしか残っていません。

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の実装自体はかなり簡単にできました。

タイトルとURLをコピーしました