はじめまして、ソリューションアーキテクトの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 上で実現することはできます。