GCPのサービスを技術開発で使用しており、「Cloud DNS、Compute Engine、Kubernetes Engine」のサービスを使用して冗長化に挑んでおります。調べてわかったことと検討していることがありますので情報を発信します。
環境の説明
- Cloud DNSは、グローバル ドメイン ネーム システム(DNS)
- Compute Enginは、VMインスタンス
- Kubernetes Engineは、コンテナ化されたアプリケーション管理
Kubernetes Engineでアプリケーションを実行しており、Compute Engineは、Kubernetes Engineへのプロキシとして使用しています。Cloud DNSからCompute Engineを経由して、Kubernetes Engineのアプリケーションへアクセスしています。なお、各サービスへの登録・更新・削除は、シェルクリプトでgcloudコマンドを使用して行なっております。
HTTP(S)Load Balancerを使用せずにCompute Engineをプロキシとして使用している経緯は、アプリケーションでWebSocketを使用しており、HTTP(S)Load Balancerの仕様でWebSocketのconnection lifetimeがあり、WebSocketの接続が切れると困るため、Compute Engineをプロキシとして使用しています。
Compute Engineの冗長化設定
Compute Engineは1インスタンスで稼働しており単一障害点となるため、複数台インスタンスを作成してCloud DNSでDNSラウンドロビンの設定を行いました。Cloud DNSのドキュメントには、DNSラウンドロビンの設定方法が載っていないことがわかり、gcloudコマンドでDNSラウンドロビンの設定を行う方法について調べました。
gcloudコマンドでDNSラウンドロビンの設定を行う方法
- gcloudのコマンドラインリファレンスのTXTレコードに複数のデータを登録するコマンドを基にして、以下のコマンドを実行すると、Aレコードに複数台の外部IPアドレスを設定できDNSラウンドロビンの設定を行うことができました。
gcloud dns record-sets transaction add -z=MANAGED_ZONE --name=my.domain. --ttl=1234 --type=A "1.2.3.4" "5.6.7.8"
Kubernetes Engineの冗長化検討
Kubernetes Engineは、ノードバージョンアップやマシンタイプ変更などの計画停止を無停止で行う必要があるため、どのような冗長構成にするか現在検討しております。具体的には、以下のような内容を検討しております。
- アプリケーション用のコンテナを複数作成して冗長化する
- 構成案1:複数コンテナは、別々のノードに配置して1つのコンテナが停止している場合に片系で動く構成にする
- クラスタを複数作成して、別々のノードに配置する。もしくは、本番環境での Kubernetes Engine の準備を参考にするとクラスタ1つでマルチゾーン構成にして、別々のノードに配置するという方法でも実現できるかもしれない
- 構成案2:複数コンテナは、同じノードに配置して順序を保つ構成にする(1つのコンテナが停止して起動まで完了した後に、次のコンテナの停止/起動を行う)
- 構成案1:複数コンテナは、別々のノードに配置して1つのコンテナが停止している場合に片系で動く構成にする
最後に
GCPのサービスで冗長構成の環境構築は、さまざまなことを検討する必要があり難しいと感じています。
また、数日前にKubernetesの深刻な脆弱性が発見されて、Kubernetes Engineでノードバージョンアップを実施した際は、異なるマシンタイプへのワークロードの移行の手順を参考にアプリケーションを新バージョンのノードに移行する作業を実施して、作業中にアプリケーションが數十分停止したため無停止で行うことの重要性を肌で感じました。
本記事を通して、SRAの社内にGCPのサービスを使用している技術者がいるということを知っていただけると嬉しいと思っております。