皆さん、お久しぶりです。ソリューションアーキテクト の 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 のアプリケーションにもカナリアリリースを実現することは可能になります。