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 ゾーンを使用してください。
 
構成の補足説明 
- Azure Cache For Redisの利用 - データの読み書きを高速化し、アプリケーションの応答性を向上させるためにAzure Cache For Redisを SQLDataBase のキャッシュとして利用しています。
 
- Azure Key Vaultの利用 - 機密情報を安全に管理するために Azure Key Vault を利用しています。機密情報を読み出す時はKubernetesのExternal Secret Operatorを利用し安全な読み出しを行います。
 
- Azure Container Registryの利用 - アプリケーションのバージョン管理と外部への流出を防ぐためAzure Container Registryを利用し管理します。
 
処理フロー 
- アプリケーションの FQDN に対する HTTPS リクエストを、Azure Application Gatewayが処理する。ここで、NSGのルールに準拠しないリクエストは拒否され、準拠するリクエストのみが AKS クラスタにデプロイされたアプリケーションにルーティングされる。 
- アプリケーションが実行される。ここで、アプリケーションは必要に応じて MySQL データベースやシークレットにアクセスする。 
- アプリケーションが処理を終えて、クライアントに処理結果を返す。 
他の方式との比較 
AKS と Azure App Service 
- アプリケーション層を実現するコンピューティングサービスとして、AKS の他に Azure App Service を使用する選択肢も考えられます。
- AKSを用いた方式は以下の特徴があります - メリット - Kubernetesのリソースを活用することで要件にあった細かな運用が可能
- 多様なスケーリングの設定が可能
 
- デメリット - Kubernetesに慣れていないと運用を実施できるようになるまで高い学習コストがかかる
- 利用料金が高額
 
- AKSはサービスが大規模で運用者がKubernetesの運用に慣れている場合に向いています
 
- メリット 
- Azure App Serviceを用いた方式は以下の特徴があります - メリット - マネージドサービスのため、スケールやセキュリティ機能が充実しており簡単な設定で運用が可能
- 低い学習コスト、低額な利用料金
 
- デメリット - 多様なスケーリング制御や細かな運用は不可能
 
- 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 InfrastructureAssemblyLine によってデプロイされたリソースの情報を取得し、リソースデプロイに活用する。
 
- build- デプロイするアプリケーションのコンテナイメージをビルドする。
 
- deploy- バックエンドアプリケーション用のクラウドリソースをデプロイする。
 
追加可能な Option 
アプリケーションの公開範囲を制限したい 
機能説明 
アプリケーションにアクセスできるソース IP アドレスを制限します。アクセスを許可したい IP アドレスをパラメータで指定することで、指定した IP アドレスが ポリシーに設定され、それ以外の IP アドレスからのアクセスが拒否されます。この Option を使用しない場合は、インターネットの全ての IP アドレスからのアクセスが許可されます。
利用場面 
- アプリケーションにアクセスできるクライアントを制限してセキュリティを向上したい。
コンテナの脆弱性検知をしたい 
機能説明 
アプリケーションのコンテナイメージがビルドされて Azure Container Registry にプッシュされた後に、Trivy を用いたコンテナイメージの脆弱性診断を実施し、診断結果を表示します。デフォルトでは、何らかの脆弱性が検知されると Pipeline の実行が失敗します。パラメータを設定することで、特定の重大度の脆弱性のみを検知対象にしたり、脆弱性が検知された場合も Pipeline を失敗させずに処理を継続させたりできます。
利用場面 
- デプロイするアプリケーションのセキュリティリスクを評価したい。
備考 
- この Option を追加すると、Azure API Backend ApplicationAssemblyLine に、ビルドされたコンテナイメージの脆弱性診断を実施するscanPipeline が追加されます。
非機能要件 
可用性 
冗長化構成 
- 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 のルールに準拠しないリクエストは拒否され、準拠するリクエストのみが受理されます。