KubernetesクラスタでアリババクラウドSLBを使ってカナリアリリースを実現する

皆さん、お久しぶりです。ソリューションアーキテクト の Wangzz です。

前回Alibaba Cloud Kubernetes 上の Blue/Green デプロイ方法を紹介しましたが、今回はもう一つ近いリリース手法、カナリアリリースを紹介したいと思います。よろしくお願いします。

何で「カナリア」という名前ですか?

カナリアは炭鉱で鳥かごにいれられて天井近くに吊るされており、有毒ガスが発生すると騒ぐため「問題の発生を先んじて発見する象徴」として使われています(カナリアにとっては迷惑な話でしょうが)。

カナリアリリースは現バージョンのサービスが動作している状態で、新バージョンのサービスを並列してリリースし、段階的にアクセス先を新バージョンに切り替えていきながら、何か障害が発生したら現バージョンに切り戻す(ロールバックする)という手法です。

一見、前回紹介した Blue/Green デプロイメントと近いですが、前回の Blue/Greenと違うのは、7層である Ingress ですと、tcp/udp を利用しているサービスにとって対応は難しいです。そのため、今回はアリババクラウド上の SLB を利用して 4 層でカナリアリリースの実現方法を紹介したいと思います。

Step1、

まずは Kubernetes クラスタが既に存在していることを想定し、テンプレートにより現バージョンのアプリケーションをデプロイします。

今回では、DeploymentとServiceをデプロイします。

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
         app: 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: nginx
   name: nginx
 spec:
   ports:
   - port: 80
     protocol: TCP
     targetPort: 80
   selector:
     app: nginx
   sessionAffinity: None
   type: LoadBalancer

上記 YAML ファイルの最後に「type: LoadBalancer」の記載はアリババクラウドにある SLB を使って Service をデプロイする設定となります。

デプロイが終わりましたら、デプロイメントとサービスの方で確認することは可能です。

ちなみに、サービス自体に対して、ブラウザとコマンドで確認することも可能です。サービスの「外部エンドポイント」にある IP アドレスをクリックすることでブラウザで開くことはできます。

コマンドですと、以下のようになります。

[root@iZ6we1j97divkkgv4zj7i6Z ~]# for x in {1..10}; do curl 47.91.2.243:80; done
old
old
old
old
old
old
old
old
old
old

Step2、

新バージョンのサービスをデプロイします。今回は new-nginx という新バージョンをでプロします。

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
         app: nginx
     spec:
       containers:
       - image: registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginx
         imagePullPolicy: Always
         name: new-nginx
         ports:
         - containerPort: 80
           protocol: TCP
       restartPolicy: Always

デプロイが終わりましたら、デプロイメントの方で確認することはできます。

今現サービス、新サービス共にポッド数は1:1ですので、基本両サービスに半分半分で処理を受けております。

[root@iZ6we1j97divkkgv4zj7i6Z ~]# for x in {1..10}; do curl 47.91.2.243:80; done
new
old
new
new
new
new
old
old
new
old

Step3、

SLB に基づいたカナリアリリースは SLB のバックエンドにある Pod の数を調整することにより Weight の大きいサービスに切り替えることはできます。今回の例では新サービスの Weight を調整してみましょう。

デプロイメントでは new-nginx の設定ファイル(YAML)を開いて編集を行います。

上記場所「replicas」を「1」から「3」に変えてみましょう。

更新後、デプロイメント画面ではポッド数量は「3/3」に変更されます。

では、CURL コマンドでもう一回確認してみましょう。

[root@iZ6we1j97divkkgv4zj7i6Z ~]# for x in {1..10}; do curl 47.91.2.243:80; done
new
new
new
old
new
new
old
old
new
new

新サービスがアクセスされることは若干多めになりました。

まとめ

LoadBalancer の形でデプロイした Service に対して、replicas の数を調整することにより、アクセス Weight を動的に変更することはできます。また、SLB の特徴を利用し、4 層である tcp/udp のアプリケーションにもカナリアリリースを実現することは可能になります。

 

この記事をシェアする