仕事中の問題と解決メモ。

最近はPythonとGoogle Cloud Platformがメイン。株式会社ビズオーシャンで企画と開発運用、データ活用とか。https://github.com/uyamazak/

GKEのコスト節約を考える インスタンスをスケールアップしてノード数を5以下にする

oceanusはGKEで本番運用を行っているけど、Kubernetesのバージョンを上げるたびに、CPUの消費が上がって、ノードが必要になっている気がする。

アプリケーションは大して変更していないし、アクセスも急増しているわけではない。

そこで、なるべくコストを抑える方法を考えた。


GKEの料金は2017/11/18現在下記のようになっている

Google Kubernetes Engine の料金と割り当て  |  Kubernetes Engine ドキュメント  |  Google Cloud Platform

f:id:uyamazak:20171108164828p:plain

なるべく5ノード以下にする

デフォルトでは1時間単位になっているけど、今のサービスはそんなピークのある使用ではないので、1か月で考えた。

東京リージョンでは、無料枠である5ノードを超えると、それまで無料だったのに一気に146ドル増えてしまう。

※個人的な解釈だけど、GKEのノード ≒ GCEのVMインスタンスと考えて今のところ問題ない。


n1-standard-1を東京で1か月借りると約31ドルとなるので、4台以上追加できることとなる。

5ノード以下に抑えれば、n1-standard-1×4相当のリソースを増やせると考えると、ここは可能な限りリソースに振りたいところ。

これはCloud Console上でも下記のようにメッセージで注意してくれる

4ノードの時
f:id:uyamazak:20171108165720p:plain

6ノードにしたとき
f:id:uyamazak:20171108170147p:plain

1インスタンスのリソースを増せば、ノード数は減らせる

ここで注目したいのは、ノード数(≒VMインスタンス数)であって、vCPUやメモリではないところ。

つまりvCPUが8個必要な場合、vCPUが1つ付いているn1-standard-1(もしくは同等のカスタムインスタンス)を8つとしてしまうと、3個オーバーしてしまうが、vCPUが4付いたn1-standard-1を2つにすればvCPUは8あるけど、ノード数は2になるので、無料枠で収まる計算。

もちろんn1-standard-8を一つでもいい。

VMインスタンスを分ける必要がなく、単純にCPU数が必要であれば、ノード数を増やすスケールアウトではなく、スケールアップを行いなるべくノード数を抑える方がいいと今のところ考えている。

見積もり

下記ツールで上記の条件で計算してみた

cloud.google.com

f:id:uyamazak:20171108171816p:plain

上記の通り、同じCPU数、同じメモリでありインスタンス料金は同じ$249.37/月だけど、n1-standard-1を8つの場合 Container Engine Cost: $146.00が余計にかかってしまう。

オートスケールをうまく使う

まだノードの自動スケールはベータ版だけど、これがちゃんと使えるのであれば、普段はノード数を5以下に収まるようになるべく性能のいいインスタンスを使い、急激な負荷のときだけノード数が増えるようにしておけば、GKEは1時間$0.20なので、数時間であれば大した負担にはならないのでいいと思う。

最後に

1年以上GKEで本番運用をし、新規サービスもすべてGKEで出しているものの、まだ大きな負荷で困ったことがないので、もっとユーザーがたくさん来てくれるサービスを作りたいと思った(小並感)