Appearance
Kubernetes で大規模なコンテナオーケストレーションが可能な Web API を構築する
概要
このアーキテクチャで達成できる要件
- 柔軟で細かなスケーリング制御が必要なアプリケーションをデプロイしたい
- アプリケーション運用・管理に Kubernetes を利用したい
構成図
構成説明
- AKS クラスタ等のリソースを作成するための VNet および以下のサブネットを作成します。
- Application Gatewayが所属するサブネット
- Azure Kubernetes Service(以下AKS)クラスタが所属するサブネット
- 受信セキュリティ規則を、Azure Network Security Group(NSG)に以下の通り設定します。
- Application Gateway用NSG: Application Gatewayの利用に必要な受信セキュリティ規則に加え、宛先ポート:443・プロトコル:TCPのアクセスを許可します。ソースIPアドレスには、任意のIPアドレスまたはCIDR範囲を指定できます。
- AKSクラスタ用NSG: Azureによってデフォルトで作成される受信セキュリティ規則のみが設定されます。
- コンテナアプリケーションをデプロイする基盤となる AKS クラスタを作成します。
- AKSクラスタにデプロイされるアプリケーションがシークレットを扱えるように、AKSクラスタにExternal Secrets Operator(ESO)をインストールします。これに伴い、ESO用のマネージドIDを作成します。ESOはこのマネージドIDを用いてKey Vaultのシークレットにアクセスします。
- AKS クラスタにデプロイされるアプリケーション用に使用する SSL 証明書を作成・管理するために、AKS クラスタに cert-manager をインストールします。
- AKS クラスタにデプロイするアプリケーションのコンテナイメージを保存するための Azure Container Registry リポジトリを作成します。
- データベースとなる Azure Database for MySQL インスタンスを作成します。インターネットからこのインスタンスに接続できるように、インスタンスにはパブリック IP アドレスを割り当てます。
- 各種シークレットが、Key Vault シークレットとして作成されます。具体的には以下のシークレットが作成されます。
- AKS クラスタの kubeconfig
- Azure Database for MySQL の root ユーザ用パスワード
- アプリケーションは、以下の Kubernetes リソースとして AKS クラスタにデプロイされます。
- Deployment
- Service
- Ingress
- Application Gateway を使用して、インターネット上のクライアントから AKS クラスタ内のサービスへのリクエストを受け付け、ルーティングします。
- Application Gatewayの IP アドレスにアプリケーション用の FQDN を対応づけるために、Azure DNS の A レコードを作成します。合わせて、AKSクラスタにインストールされたcert-managerを使用して、Let’s Encryptから証明書を取得し、HTTPSでアプリケーションにアクセスできるようにします。
- なお、Azure DNS のゾーンは作成されないため、作成済みの Azure DNS ゾーンを使用してください。
処理フロー
アプリケーションの FQDN に対する HTTPS リクエストを、Azure Application Gatewayが処理する。ここで、NSGのルールに準拠しないリクエストは拒否され、準拠するリクエストのみが AKS クラスタにデプロイされたアプリケーションにルーティングされる。
アプリケーションが実行される。ここで、アプリケーションは必要に応じて MySQL データベースやシークレットにアクセスする。
アプリケーションが処理を終えて、クライアントに処理結果を返す。
他の方式との比較
AKS と Azure App Service
- アプリケーション層を実現するコンピューティングサービスとして、AKS の他に Azure App Service を使用する選択肢も考えられます。
- AKS を用いた方式は、以下の場合に適しています。
- 開発者が Kubernetes を用いたアプリケーション運用・管理に慣れている。
- Azure App Service を用いた方式は、以下の場合に適しています。
- アプリケーションの実行環境の運用コストを軽減して、アプリケーションの開発に集中したい。
AssemblyLine 構成
このアーキテクチャでは、以下の AssemblyLine が生成されます。
Azure Shared Infrastructure
- バックエンドアプリケーションをデプロイするための基盤となるクラウドリソースをデプロイする。
Azure API Backend Application
- 基盤となるリソース上にバックエンドアプリケーションをデプロイする。
Azure Shared Infrastructure
この AssemblyLine は、以下の Pipeline から構成されます。
deploy
- 基盤となるクラウドリソースをデプロイする。
Azure API Backend Application
この AssemblyLine は、以下の Pipeline から構成されます。
refer
Azure Shared Infrastructure
AssemblyLine によってデプロイされたリソースの情報を取得し、リソースデプロイに活用する。
build
- デプロイするアプリケーションのコンテナイメージをビルドする。
deploy
- バックエンドアプリケーション用のクラウドリソースをデプロイする。
追加可能な Option
アプリケーションの公開範囲を制限したい
機能説明
アプリケーションにアクセスできるソース IP アドレスを制限します。アクセスを許可したい IP アドレスをパラメータで指定することで、指定した IP アドレスが ポリシーに設定され、それ以外の IP アドレスからのアクセスが拒否されます。この Option を使用しない場合は、インターネットの全ての IP アドレスからのアクセスが許可されます。
利用場面
- アプリケーションにアクセスできるクライアントを制限してセキュリティを向上したい。
コンテナの脆弱性検知をしたい
機能説明
アプリケーションのコンテナイメージがビルドされて Azure Container Registry にプッシュされた後に、Trivy を用いたコンテナイメージの脆弱性診断を実施し、診断結果を表示します。デフォルトでは、何らかの脆弱性が検知されると Pipeline の実行が失敗します。パラメータを設定することで、特定の重大度の脆弱性のみを検知対象にしたり、脆弱性が検知された場合も Pipeline を失敗させずに処理を継続させたりできます。
利用場面
- デプロイするアプリケーションのセキュリティリスクを評価したい。
備考
- この Option を追加すると、
Azure API Backend Application
AssemblyLine に、ビルドされたコンテナイメージの脆弱性診断を実施するscan
Pipeline が追加されます。
非機能要件
可用性
冗長化構成
- AKS クラスタでは、リージョン内の一つの可用性ゾーンにノードが作成されます。パラメータを指定することで、作成されるノードの数を変更できます。
リージョン構成
- サブネット:
japaneast
- Azure NAT ゲートウェイ:
japaneast
- AKS クラスタ: デフォルトは
japaneast
- Azure Database for MySQL インスタンス:
japaneast
運用・保守性
バックアップ
- バックアップ方式
- Azure Database for MySQL インスタンスでは、バックアップが毎日 1 回実行されます。バックアップは 7 日間保持されます。
保守
- ソフトウェアの自動更新
- AKS クラスタの自動アップグレードは無効化されます。
セキュリティ
アクセス制限
- アクセス制限方法
- (【アプリケーションの公開範囲を制限したい】Option を追加した場合)パラメータで指定することで、アプリケーションにアクセスできるソース IP アドレスを NSG によって制限できます。
ログ
- ログポリシー
- Azure におけるデフォルトのロギング設定に基づいてログを保存します。
- ログ保存先
- Log Analytics ワークスペースに保存されます。
- ログ保存期間
- デフォルトでは 30 日間保持されます。パラメータで指定することで、保持期間を変更できます。
データの暗号化
- Standard レベルの Azure Key Vault を使用するため、シークレットは Azure のソフトウェアによって保護されます。
マルウェア対策
- (【コンテナの脆弱性検知をしたい】Option を追加した場合)Trivy を用いたコンテナイメージの脆弱性診断を実施します。
Web からの攻撃対策
- (【アプリケーションの公開範囲を制限したい】Option を追加した場合)NSG のルールに準拠しないリクエストは拒否され、準拠するリクエストのみが受理されます。