Appearance
Kubernetes で大規模なコンテナオーケストレーションが可能な Web API を構築する
概要
このアーキテクチャで達成できる要件
- 柔軟で細かなスケーリング制御が必要なアプリケーションをデプロイしたい
- アプリケーション運用・管理に Kubernetes を利用したい
構成図
構成説明
- GKE クラスタ等のリソースを作成するための VPC ネットワークおよびサブネットを作成します。
- コンテナアプリケーションをデプロイする基盤となる GKE クラスタを作成します。この GKE クラスタは、限定公開クラスタとして作成されます。
- GKE クラスタにデプロイされるアプリケーションがシークレットを扱えるように、GKE クラスタに External Secret Operator(ESO)をインストールします。これに伴い、ESO 用のサービスアカウントも作成します。ESO は Workload Identity 連携を用いて Secret Manager シークレットにアクセスします。
- GKE 限定公開クラスタからインターネットへのアウトバウンドアクセスを可能にするために、Cloud NAT ゲートウェイおよび Cloud Router を作成します。合わせて、外部静的 IP アドレスを作成し、Cloud NAT IP アドレスとして使用します。
- GKE クラスタにデプロイするアプリケーションのコンテナイメージを保存するための Artifact Registry リポジトリを作成します。
- データベースとなる Cloud SQL for MySQL インスタンスを作成します。インターネットからこのインスタンスに接続できるように、インスタンスにはパブリック IP アドレスを割り当てます。
- 各種シークレットが、Secret Manager シークレットとして作成されます。具体的には以下のシークレットが作成されます。
- GKE クラスタの kubeconfig
- Cloud SQL for MySQL の root ユーザ用パスワード
- アプリケーションは、以下の Kubernetes リソースとして GKE クラスタにデプロイされます。
- Deployment
- Service
- Ingress
- GKE クラスタで Ingress リソースを作成することで、外部アプリケーションロードバランサが作成されます。これに伴い、このロードバランサに割り当てるための外部静的 IP アドレスを作成します。
- アプリケーションに対する WAF として、Cloud Armor ポリシーを作成します。このポリシーを用いて、アプリケーションにアクセス可能なソース IP アドレスを制限できます。
- ロードバランサの IP アドレスにアプリケーション用の FQDN を対応づけるために、Cloud DNS の A レコードを作成します。合わせて、GKE クラスタで ManagedCertificate リソースを作成することで、Google マネージド SSL 証明書を作成し、HTTPS でアプリケーションにアクセスできるようにします。
- なお、Cloud DNS のゾーンは作成されないため、作成済みの Cloud DNS ゾーンを使用してください。
処理フロー
アプリケーションの FQDN に対する HTTPS リクエストを、外部アプリケーションロードバランサが処理する。ここで、Cloud Armor ポリシーのルールに準拠しないリクエストは拒否され、準拠するリクエストのみが GKE クラスタにデプロイされたアプリケーションにルーティングされる。
アプリケーションが実行される。ここで、アプリケーションは必要に応じて MySQL データベースやシークレットにアクセスする。
アプリケーションが処理を終えて、クライアントに処理結果を返す。
他の方式との比較
GKE と Cloud Run
- アプリケーション層を実現するコンピューティングサービスとして、GKE の他に Cloud Run を使用する選択肢も考えられます。
- GKE を用いた方式は、以下の場合に適しています。
- 開発者が Kubernetes を用いたアプリケーション運用・管理に慣れている。
- Cloud Run を用いた方式は、以下の場合に適しています。
- アプリケーションの実行環境の運用コストを軽減して、アプリケーションの開発に集中したい。
AssemblyLine 構成
このアーキテクチャでは、以下の AssemblyLine が生成されます。
GCP Shared Infrastructure
- バックエンドアプリケーションをデプロイするための基盤となるクラウドリソースをデプロイする。
GCP API Backend Application
- 基盤となるリソース上にバックエンドアプリケーションをデプロイする。
GCP Shared Infrastructure
この AssemblyLine は、以下の Pipeline から構成されます。
deploy
- 基盤となるクラウドリソースをデプロイする。
GCP API Backend Application
この AssemblyLine は、以下の Pipeline から構成されます。
build
- デプロイするアプリケーションのコンテナイメージをビルドする。
deploy
- バックエンドアプリケーション用のクラウドリソースをデプロイする。
追加可能な Option
アプリケーションの公開範囲を制限したい
機能説明
アプリケーションにアクセスできるソース IP アドレスを制限します。アクセスを許可したい IP アドレスをパラメータで指定することで、指定した IP アドレスが Cloud Armor ポリシーに設定され、それ以外の IP アドレスからのアクセスが拒否されます。この Option を使用しない場合は、インターネットの全ての IP アドレスからのアクセスが許可されます。
利用場面
- アプリケーションにアクセスできるクライアントを制限してセキュリティを向上したい。
コンテナの脆弱性検知をしたい
機能説明
アプリケーションのコンテナイメージがビルドされて Artifact Registry にプッシュされた後に、Trivy を用いたコンテナイメージの脆弱性診断を実施し、診断結果を表示します。デフォルトでは、何らかの脆弱性が検知されると Pipeline の実行が失敗します。パラメータを設定することで、特定の重大度の脆弱性のみを検知対象にしたり、脆弱性が検知された場合も Pipeline を失敗させずに処理を継続させたりできます。
利用場面
- デプロイするアプリケーションのセキュリティリスクを評価したい。
備考
- この Option を追加すると、
GCP API Backend Application
AssemblyLine に、ビルドされたコンテナイメージの脆弱性診断を実施するscan
Pipeline が追加されます。
Architecture Decision Records
GKE クラスタを限定公開クラスにする
Context
- GKE クラスタは、一般公開クラスタと限定公開クラスタのいずれかを選択できます。
- 限定公開クラスタでは、ノードにパブリック IP アドレスが付与されないため、インターネット上のクライアントはノードにアクセスできなくなります。
Decision
- 限定公開クラスタとして作成します。
- クラスタのセキュリティを向上できるため。
- 限定公開クラスタにした場合、クラスタからインターネットへのアウトバウンドアクセスを可能にするために追加の設定が必要となりますが、セキュリティ向上の方が優先度が高いと判断しました。
Cloud NAT ゲートウェイおよび Cloud Router を作成する
Context
- GKE クラスタを限定公開クラスタとして作成する場合、ノードにパブリック IP アドレスが付与されないため、そのままではクラスタからインターネットへのアウトバウンドアクセスが許可されません。
- このため、たとえばインターネットからクラスタに ESO をインストールするといった設定を実施できません。
Decision
- GKE クラスタと同じ VPC ネットワークおよびリージョンに Cloud NAT ゲートウェイを構成し、Cloud Router を作成します。
- Cloud NAT を構成することで、限定公開クラスタにもインターネットへのアウトバウンドアクセスを許可できるため。
Cloud NAT IP アドレスの割り当て方法として手動割り当てを使用する
Context
- Cloud NAT の実行時に使用されるソース IP アドレス(Cloud NAT IP アドレス)を割り振る方法として、自動割り当てと手動割り当てがあります。
- 自動割り当ての場合、Cloud NAT IP アドレスは使用量に応じて自動的に割り当てられます。使用量に応じて、不要になった Cloud NAT IP アドレスは削除されます。
- 手動割り当ての場合、事前に予約した外部静的 IP アドレスを割り当てます。
Decision
- 手動割り当てを使用します。
- GKE クラスタ上で実行するアプリケーションから外部にアクセスする際に、ソース IP アドレスによるアクセス制限が施されているサービス等にアクセスするケースを想定すると、ソース IP アドレスとなる Cloud NAT IP アドレスは変動しないことが望ましいと考えられるため。
非機能要件
可用性
冗長化構成
- デフォルトでは GKE クラスタはリージョンクラスタとして作成されるため、リージョン内の複数のゾーンにノードが分散して作成されます。パラメータを指定することで、一つのゾーンあたりに作成されるノードの数も変更できます。
リージョン構成
- サブネット:
asia-northeast1
- Cloud NAT ゲートウェイ:
asia-northeast1
- Cloud Router:
asia-northeast1
- GKE クラスタ: デフォルトは
asia-northeast1
。パラメータで変更可能。 - Cloud SQL for MySQL インスタンス:
asia-northeast1
運用・保守性
バックアップ
- バックアップ方式
- Cloud SQL for MySQL インスタンスでは、自動バックアップが毎日実行されます。自動バックアップは 7 つまで保持されます。
保守
- ソフトウェアの自動更新
- デフォルトでは GKE クラスタのリリースチャンネルとして
REGULAR
が設定されるため、リリースチャンネルに基づいてクラスタがアップグレードされます。 - パラメータを指定することで、別のリリースチャンネルに変更できます。また、クラスタの自動アップグレードの無効化も可能です。
- デフォルトでは GKE クラスタのリリースチャンネルとして
セキュリティ
アクセス制限
- アクセス制限方法
- パラメータで指定することで、GKE のコントロールプレーン承認済みネットワークに IP アドレスを登録できます。
- (【アプリケーションの公開範囲を制限したい】Option を追加した場合)パラメータで指定することで、アプリケーションにアクセスできるソース IP アドレスを Cloud Armor ポリシーによって制限できます。
ログ
- ログポリシー
- Google Cloud におけるデフォルトのロギング設定に基づいてログを保存します。
- ログ保存先
_Default
ログバケットに保存されます。
- ログ保存期間
- 30 日間保持されます。
データの暗号化
- Secret Manager に保存されるシークレットは、Google が管理する暗号鍵によって暗号化されます。
マルウェア対策
- (【コンテナの脆弱性検知をしたい】Option を追加した場合)Trivy を用いたコンテナイメージの脆弱性診断を実施します。
Web からの攻撃対策
- (【アプリケーションの公開範囲を制限したい】Option を追加した場合)Cloud Armor ポリシーのルールに準拠しないリクエストは拒否され、準拠するリクエストのみが受理されます。