見出し画像

10円/日 GKEインフラを構築してみた

Redmine(rails + postgres)と、個人サービスで利用しているmongoDBをGKEに引っ越ししてみました。
GKEは初めてだったので、いろいろ勉強しながら試行錯誤して構築。
まず、動く状態にしてから、運用コストを下げる方法を模索しました。

目標(ゴール)

・Heroku/Firebaseなどを利用している個人サービスをGKEに移す
・GKEをいろいろ実験して試す(勉強を兼ねて)
・ 安く楽に運用

前提読者

・ GCP/GKEを使っている(使ってみたい)
・ エンタープライズでない個人サービス(未収益化)を安く動かしたい

(運用コスト削減の)ポイント

・ プリエンティブルインスタンスを利用
・LBやNginx-Ingressは使わない
・ EIPの付け直しの自動化

プリエンティブルインスタンスの利用

GKE クラスタを構成するリソースとして、管理VMとノードVMのマシンリソースが必要になります。

管理VMは、1アカウント分のみ無料で使えますが、ノードVMの利用料はシステムコストに返ってきます。推奨設定で構築していくと、ミニマムで3~5万/月ほどのコスト感になります。

そこで、まず、VMのコスト削減として、プリエンティブルVMの利用を考えました。プリエンティブルVMの採用で問題となるのが次。

・ 瞬断に耐えられるアプリケーションの設計
・ データの永続化
・ GKE のアプリケーションPodのIPがノードVMの再起動で変更される
・ GCP EIPの(ノードへの)接続が外れる

上二つは、プリエンティブルVMに限らないですね。下二つは、後の「EIPの付け直しの自動化」で対応しました。(EIPの話もプリエンティブルVMの問題というよりは、LBを利用しないために発生する問題ですね。)

そして、多少のダウンタイム(1日に15分とか)は、許容できるので思いきって1ノード1VMの構成。VMのタイプは、試行錯誤しながら、e2-smallに落ち着きました。このあたりは、GKEクラスタ上で何を動かすのかで調整が必要かと思います。(Grafana + Prometheusもやってみたのですがヘビーすぎてコスト高で挫折してます)

LBやNginx-Ingressを使わない

GKEの準備してるLBを利用すると、すごく便利で構築も早いのですが、今回の目的だとコスト面で折り合いがつかないため却下しました。そのため、EIPをノードVMに接続して利用しています。(ここからが泥沼のはじまり)

EIPの付け直しの自動化

ノードVMが再構成されるときにEIPが外れるのなら、外れたのを検知して付け直そう。なのですが、これが一筋縄では行きません。まずかったのは、自分自身のIPの付け直しをしようと設計していたところです。ネットワークパケットの流れを想像すれば当然なのですが、コマンドの途中で応答不能になってしまいアタフタしました。

解決策として、下記の処理の流れとしています。
 1. EIPが外れていることを検知
 2. EIPの接続設定を行うVMを起動
 3. 起動したVMからEIPの接続を実行
 4. VMの終了

ついでにアプリケーションPodのIPも変更されてしまうので、ServiceのIP設定を更新します。少し複雑になってしまったので、EIP付け直しの処理については、Slackに動作のトレースを通知して確認したりしてます。

まとめ

・ コストのレポートを眺めながら、上記の方策でシェイプアップの結果、10円/日のサービスインフラを実現。(CPU6円、RAM3円、ほか1円。下は10日からPDのコストがありますが、PDは必要に応じて)

画像1

・ プリエンティブルVMを積極利用することにより、障害に強いシステムの勉強にもなった。もちろんGKEの勉強にも。

追記

・GoogleのGKEの無料枠は縮小の傾向にあるので注意が必要。今回は管理VMの料金はもちろん入っていないですが、無料枠を除いたコストの見積もりもしておいた方がいいです。管理VMは、$0.1/h = $72/mon ≒ 8,000yen/mon (割引なしだと)
・GCP/GKEまわりの機能強化も早く、バックアップ/ログ回りなども日々使いやすく開発レスで運用できるようになってきている。
・EIP付替えは面倒であれば、LBを利用した方が吉です。LBは2,000yen/monくらい。
・こんなせこいGKEの使い方はニーズがないかもですが、こんな感じいっぱいサービスを開発してみて、そのまま簡単に本番環境も作れるので便利です。日常的に瞬断されているので、障害テストや復旧もばっちり。詳細はニーズがあれば。








この記事が気に入ったらサポートをしてみませんか?