GCP Cloud Load Balancingでエンドポイントごとのカナリアリリースをする
はじめに
GCPでCloud Run上で動いているバックエンドAPIサーバーのリプレースをするときに、エンドポイントごとに新しいアプリケーションに切り替える方法について調べたのでまとめます。
Cloud Runのデプロイでは段階的なロールアウトをサポートしています。アプリケーション全体の段階的なロールアウトをすることはできますが、エンドポイントごとに段階的なロールアウトをすることはできません。
GCPではCloud Load Balancingを使ってエンドポイントごとにトラフィックの向き先を変えられます。重みづけベースのトラフィックの分割をすることもできるのでカナリアリリースすることも可能です。
本記事では、Cloud Load Balancingを利用したエンドポイントごとの重みづけベースのトラフィックの分割する手順を紹介します。
実際にやってみる
アーキテクチャ
以下のようなアーキテクチャで実験します。
アプリケーションコード
カナリアリリースにおけるBlueとGreenのアプリケーションをGoで作成します。
- Blue
package main
import (
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request){
_, _ = rw.Write([]byte("blue"))
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
- Green
package main
import (
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request){
_, _ = rw.Write([]byte("green"))
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
Google Artifact Registry
Cloud Run
Cloud Load Balancing
「グローバル外部 HTTP(S) ロードバランサ」と「リージョン外部 HTTP(S) ロードバランサ」で重み付けベースのトラフィック分割をサポートしています。今回は「グローバル外部 HTTP(S) ロードバランサ」を使います。
フロントエンドの構成
バックエンドの構成
BlueとGreen用にバックエンドサービスを2つ作成し、1つのLoad Balancerに紐づけます。
- Serverless NEG
- Backend Service
- 全体
ルーティングルール
ルーティングルールで、エンドポイントごとに重み付きベースのトラフィックの分割を指定します。
defaultService: projects/<project id>/global/backendServices/canary-release-sample-blue
name: matcher
routeRules:
- matchRules:
- prefixMatch: /
priority: 1
routeAction:
weightedBackendServices:
- backendService: projects/<project id>/global/backendServices/canary-release-sample-blue
weight: 90
- backendService: projects/<project id>/global/backendServices/canary-release-sample-green
weight: 10
全体
カナリアリリース
BlueとGreenでレスポンスが90:10の割合で分割されていることを確認した。
他の方法
Cloud Runを利用しているときに、エンドポイントごとにカナリアリリースするための他の方法を調べました。
プロキシサーバーを自前で立てる
プロキシサーバーを自前で立てて、プロキシサーバーの機能でトラフィックを分割できます。
自前でHA ProxyをCloud Runにデプロイした場合の構成図を書いてみました。Cloud Load Balancingを使う場合と異なり、自前でインフラを管理しなければならないので、特別な理由がない限りCloud Load Balancingを使う、でいいと思います。
まとめ
Cloud Runで動いているアプリケーションに対して、Cloud Load Balancingを利用したエンドポイントごとのカナリアリリースするための方法を実験してみました。エンドポイントごとにカナリアリリースする機会は多くないので、Cloud Runのアプリケーションに対してどのサービスが使えそうか網羅的に調べられたのは良かったです。
Discussion