2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rolling UpdateとBlue/Green Deploymentの違いを整理する

Posted at

はじめに

RollingUpdateとBlue/Green Deployment(以下BGデプロイ)の違いが脳内でごっちゃになってきたので、整理するためのメモです。
説明のために、以下構成のWEBサーバーのデプロイを考えます。
スクリーンショット 2024-06-05 7.36.37.png

LBがあって、サーバーが3台で冗長化されているシンプルな構成です。

Rolling Update

Rolling Updateは旧モジュールを残したまま新モジュールを少しずつ起動していき、新旧モジュールの比率を徐々に新に寄せていくデプロイ方式です。

<メリット>

  • 無停止でデプロイ可能
  • リソースコストが低い
    • 後述するBGデプロイは環境を丸ごと用意しないといけない

<デメリット>

  • 新旧モジュールが一時的に共存することになる
  • 新旧モジュールが共存してる状態でロールバックが必要になった際、煩雑な手順が発生しうる

やってみる

実際にKubernetesでRolling Updateを実施して、モジュールの入れ替わる様子を見ていきましょう。

まず以下のyamlを用意します。
https://github.com/tttol/bbf-kubernetes/blob/main/chapter-06/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.24.0
        ports:
        - containerPort: 80

nginxサーバーを3台立てるDeploymentです。
CLIから以下を実行してnginxサーバー×3を起動します。

$ kubectl apply -f deployment.yaml    
deployment.apps/nginx-deployment configured

kubectl get podで起動確認します。

$ kubectl get pod                 
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-696bfc48dd-csgxx   1/1     Running   0          58s
nginx-deployment-696bfc48dd-shsg4   1/1     Running   0          58s
nginx-deployment-696bfc48dd-wwh8l   1/1     Running   0          58s

次にnginxのバージョンを上げて再度デプロイします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
-        image: nginx:1.24.0
+        image: nginx:1.25.3
        ports:
        - containerPort: 80

デプロイの前に、別ターミナルでkubectl get pod --watchを実行しておき、Podの入れ替わり状況をリアルタイムでウォッチします。

$ kubectl get pod --watch
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-696bfc48dd-csgxx   1/1     Running   0          58s
nginx-deployment-696bfc48dd-shsg4   1/1     Running   0          58s
nginx-deployment-696bfc48dd-wwh8l   1/1     Running   0          58s

nginx:1.25.3をデプロイします。

$ kubectl apply -f deployment.yaml    
deployment.apps/nginx-deployment configured

別ターミナルの状況を見てみます。

kubectl get pod --watch
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-696bfc48dd-csgxx   1/1     Running   0          58s
nginx-deployment-696bfc48dd-shsg4   1/1     Running   0          58s
nginx-deployment-696bfc48dd-wwh8l   1/1     Running   0          58s
nginx-deployment-6f7c65f4f4-rnkjb   0/1     Pending   0          0s
nginx-deployment-6f7c65f4f4-rnkjb   0/1     Pending   0          0s
nginx-deployment-6f7c65f4f4-rnkjb   0/1     ContainerCreating   0          0s
nginx-deployment-6f7c65f4f4-rnkjb   1/1     Running             0          1s
nginx-deployment-696bfc48dd-csgxx   1/1     Terminating         0          70s
nginx-deployment-6f7c65f4f4-x257f   0/1     Pending             0          0s
nginx-deployment-6f7c65f4f4-x257f   0/1     Pending             0          0s
nginx-deployment-6f7c65f4f4-x257f   0/1     ContainerCreating   0          0s
nginx-deployment-696bfc48dd-csgxx   0/1     Terminating         0          70s
nginx-deployment-6f7c65f4f4-x257f   1/1     Running             0          1s
nginx-deployment-696bfc48dd-csgxx   0/1     Terminating         0          71s
nginx-deployment-696bfc48dd-csgxx   0/1     Terminating         0          71s
nginx-deployment-696bfc48dd-csgxx   0/1     Terminating         0          71s
nginx-deployment-696bfc48dd-wwh8l   1/1     Terminating         0          71s
nginx-deployment-6f7c65f4f4-x8nqc   0/1     Pending             0          0s
nginx-deployment-6f7c65f4f4-x8nqc   0/1     Pending             0          0s
nginx-deployment-6f7c65f4f4-x8nqc   0/1     ContainerCreating   0          0s
nginx-deployment-696bfc48dd-wwh8l   0/1     Terminating         0          71s
nginx-deployment-696bfc48dd-wwh8l   0/1     Terminating         0          72s
nginx-deployment-6f7c65f4f4-x8nqc   1/1     Running             0          1s
nginx-deployment-696bfc48dd-wwh8l   0/1     Terminating         0          72s
nginx-deployment-696bfc48dd-wwh8l   0/1     Terminating         0          72s
nginx-deployment-696bfc48dd-shsg4   1/1     Terminating         0          72s
nginx-deployment-696bfc48dd-shsg4   0/1     Terminating         0          72s
nginx-deployment-696bfc48dd-shsg4   0/1     Terminating         0          73s
nginx-deployment-696bfc48dd-shsg4   0/1     Terminating         0          73s
nginx-deployment-696bfc48dd-shsg4   0/1     Terminating         0          73s

これだけ見てもいまいちわかりにくいので、図にします。

RollingUpdate.jpg

  • 青・・・稼働中の旧Pod
  • 灰・・・終了した旧Pod
  • 黄・・・新Pod

「Podが1個増えては1個減る」を順番に繰り返していることがわかります。

BGデプロイ

BGデプロイは現環境の複製を丸々作り、複製した環境の動作確認がOKになったタイミングでトラフィックを新に切り替えるデプロイ方式です。
BGデプロイでは、旧モジュールをBlue環境・新モジュールをGreen環境と定義して、1つのアプリケーションに対してBlue/Greenの2つの環境を作成し、最終的にBlueを削除してGreenだけにします。

BGデプロイ.jpg

<メリット>

  • 無停止でデプロイ可能
  • ロールバックが容易
    • Blueをそのまま稼働させて、Greenを削除するだけ
    • 本番環境に影響が出にくい

<デメリット>

  • 環境を丸々複製するのでリソースコストが高い
    • 今回はシンプルなWEBサーバーを例に取ったが、アプリサーバー・DBサーバー・WEBサーバーなど様々なリソースが入り乱れるアーキテクチャではなかなか大変

参考

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?