KubernetesでIngressを利用してBlue/Greenデプロイメントを実現する

はじめまして、ソリューションアーキテクトのWangzzです。

先日@mosuke5 から以下の話がありましたが、今日はその継続話題として、アリババクラウド上のContainerService (K8S) の使い方について紹介したいと思います、よろしくお願いします。

https://techblog.sbcloud.co.jp/2018/07/09/basic-kubernetes/

今日紹介したいのはBlue/Greenデプロイメントというものですが、以前にも以下のようなブログがありましたが、今日はそのK8S上の実現方法を紹介したいと思います。

https://qiita.com/mosuke5/items/43044a0aabb8dde0841a

アプリケーションをバージョンアップする場合、よくあるケースとして、新しいバージョンをリリースして、一部のアクセスを新バージョンでテストを行います。Kubernets の Ingress resource 機能ですと一つのPathでは一つのServiceしか動けない。そのため、今日はアリババの Container Service のルート機能を使って Blue/Green デプロイメントを実現の仕方を紹介したいと思います。

Step 1、

前回の紹介もあったので、Kubernetesクラスタの作成を省略しますが、まずテンプレートによりアプリケーションを作成します。

今回のサンプルでは、Deployment、Service及びIngress三の要素があります。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
   labels:
     run: old-nginx
   name: old-nginx
spec:
   replicas: 1
   selector:
     matchLabels:
       run: old-nginx
   template:
     metadata:
       labels:
         run: old-nginx
     spec:
       containers:
       - image: registry.cn-hangzhou.aliyuncs.com/xianlu/old-nginx
         imagePullPolicy: Always
         name: old-nginx
         ports:
         - containerPort: 80
           protocol: TCP
       restartPolicy: Always
 ---
 apiVersion: v1
 kind: Service
 metadata:
   labels:
     run: old-nginx
   name: old-nginx
 spec:
   ports:
   - port: 80
     protocol: TCP
     targetPort: 80
   selector:
     run: old-nginx
   sessionAffinity: None
   type: NodePort
 ---
 apiVersion: extensions/v1beta1
 kind: Ingress
 metadata:
   name: echo
 spec:
   backend:
     serviceName: default-http-backend
     servicePort: 80
   rules:
   - host: mini-echo.io 
     http:
       paths:
       - path: /
         backend:
           serviceName: old-nginx
           servicePort: 80

 

デプロイが成功したら、左の「アプリケーション」→「Ingress」メニューで最新のルールを確認できます。

実際アクセス見てみましょう。

ZhizhengnoMacBook-puro:~ zhizhengwang$ curl -H "Host:mini-echo.io" http://47.91.2.136
old

Step 2、

では、次「新しいバージョン」のアプリをデプロイしましょう。Step1と同じようにテンプレートから作成します。新バージョンの Deployment と Service は以下となります。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
   labels:
     run: new-nginx
   name: new-nginx
spec:
   replicas: 1
   selector:
     matchLabels:
       run: new-nginx
   template:
     metadata:
       labels:
         run: new-nginx
     spec:
       containers:
       - image: registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginx
         imagePullPolicy: Always
         name: new-nginx
         ports:
         - containerPort: 80
           protocol: TCP
       restartPolicy: Always
 ---
 apiVersion: v1
 kind: Service
 metadata:
   labels:
     run: new-nginx
   name: new-nginx
 spec:
   ports:
   - port: 80
     protocol: TCP
     targetPort: 80
   selector:
     run: new-nginx
   sessionAffinity: None
   type: NodePort

 

Step 3、

いよいよこれから本番に入ります。Ingressを編集することにより、Blue/Greenデプロイメントを実現する。

まずはIngressページに入り、この前作成したIngressの更新を行う。

今回直接YAMLファイルを編集しますので、「YAMLの表示」リンクをクリックします。

内容について以下のように修正を行います。

1、annotationsを追加すること

annotations:
  ingress.aliyun.weight/new-nginx:'50'

new-nginx: ’50’ の数字 50 はアクセスのウェイトとなります。50%の意味をしています。つまり 50% のアクセスを new-nginx に行かせるようにします。

2、新たなserviceNameを追加すること。今回では古いバージョンのサービスと並列で同じPath配下で設定することにします。そうすると同じPathでは二つのサービスが動けるようになります。

全体のYAMLファイルは以下のようになります。

更新されましたら、Ingress画面ではルールは以下のように変われます。

また、実際テストしてみましょう。

ZhizhengnoMacBook-puro:~ zhizhengwang$ curl -H "Host:mini-echo.io" http://47.91.2.136
new
ZhizhengnoMacBook-puro:~ zhizhengwang$ curl -H "Host:mini-echo.io" http://47.91.2.136
old
ZhizhengnoMacBook-puro:~ zhizhengwang$ curl -H "Host:mini-echo.io" http://47.91.2.136
old
ZhizhengnoMacBook-puro:~ zhizhengwang$ curl -H "Host:mini-echo.io" http://47.91.2.136
new
ZhizhengnoMacBook-puro:~ zhizhengwang$ curl -H "Host:mini-echo.io" http://47.91.2.136
new
ZhizhengnoMacBook-puro:~ zhizhengwang$ curl -H "Host:mini-echo.io" http://47.91.2.136
new
ZhizhengnoMacBook-puro:~ zhizhengwang$ curl -H "Host:mini-echo.io" http://47.91.2.136
old
ZhizhengnoMacBook-puro:~ zhizhengwang$ curl -H "Host:mini-echo.io" http://47.91.2.136
new
ZhizhengnoMacBook-puro:~ zhizhengwang$ curl -H "Host:mini-echo.io" http://47.91.2.136
old
ZhizhengnoMacBook-puro:~ zhizhengwang$ curl -H "Host:mini-echo.io" http://47.91.2.136
old

 

同じアクセスを 10 回で試してみたら、5 回程度は new-nginx にアクセスすることになりました。

まとめ

Ingress のウェイト設定値 ingress.aliyun.weight/new-nginx: "50" を調整することにより、Blue/Greenデプロイのアクセス比率を調整することはできます。新バージョンのテストを完了したら、Ingress のルートウェイトを 100 に設定すれば、全てのアクセスは新サービスに流れるようになります。その後古いバージョンを削除することも可能です。そのウェイト設定の調整によりBlue/Greenデプロイメントを Kubenetes 上で実現することはできます。

 

この記事をシェアする