Chuyển đến nội dung chính

レッスン7:クラウドネイティブアーキテクチャとデザインパターン

クラウドネイティブの原則、マイクロサービスvsモノリス、Service Mesh、12-Factor App、イミュータブルインフラストラクチャとクラウドネイティブデザインパターン。

クラウドネイティブアーキテクチャ — マイクロサービスvsモノリス、12-Factor App

1. クラウドネイティブ — CNCFの定義

CNCF(Cloud Native Computing Foundation)によると、クラウドネイティブとは、パブリック、プライベート、ハイブリッドクラウドなどの動的環境でスケーラブルなアプリケーションを構築・実行する方法であり、コンテナ、マイクロサービス、宣言型API、イミュータブルインフラストラクチャを活用します。

原則意味例
Containerizedアプリと依存関係をパッケージ化Dockerイメージ
Dynamically orchestrated自動スケジューリング、スケーリング、自己修復Kubernetes
Microservices疎結合、単一責任認証サービス、決済サービス
Declarative APIs手順ではなく望ましい状態を記述kubectl apply -f deployment.yaml
Immutable infrastructure実行中のものは変更せず、置き換える新イメージバージョン → ローリングアップデート

2. マイクロサービスvsモノリス

MONOLITH                          MICROSERVICES
─────────────────────             ──────────────────────────────
┌──────────────────┐              ┌────────┐ ┌────────┐ ┌─────┐
│  Auth    │  UI   │              │  Auth  │ │  Cart  │ │  UI │
│  Cart    │  API  │              │Service │ │Service │ │Svc  │
│  Payment │  DB   │              └────────┘ └────────┘ └─────┘
└──────────────────┘                   │          │         │
  Deploy as 1 unit                     └─── API Gateway ───┘
                                            │
                                       Client/Browser
観点モノリスマイクロサービス
デプロイ一括デプロイサービスごとに独立
スケーリングアプリ全体をスケールボトルネックのサービスのみスケール
複雑さ低い(単一コードベース)高い(分散システム)
障害分離1つのバグで全体がダウン障害はサービス内に限定
技術単一スタックポリグロット(サービスごとに最適なツール)

3. 12-Factor App

12-Factor Appメソドロジーはクラウドネイティブアプリケーションのベストプラクティスを定義しています:

#ファクタークラウドネイティブでの実践
1Codebaseアプリごとに1リポジトリ、複数デプロイ
2Dependencies明示的に宣言(package.json、go.mod)
3Config環境変数に保存(ConfigMap、Secrets)
4Backing servicesDB、キャッシュ = URLで接続するアタッチドリソース
5Build/Release/Run厳密な分離(CIでビルド、CDでデプロイ)
6Processesステートレスプロセス、状態は外部に保存
7Port bindingポート経由でサービスを公開(Webサーバーレイヤー不要)
8Concurrencyプロセスモデルでスケール(HPA)
9Disposability高速起動、グレースフルシャットダウン
10Dev/Prod parity環境間で同じツール/サービスを使用
11Logsイベントストリームとして扱う(stdout、ファイルではない)
12Admin processesワンオフの管理タスクをJobとして実行

試験のポイント: ファクター3、6、9、11はKCNAの問題によく出ます。ファクター3(環境変数にconfig)→ ConfigMap/Secret。ファクター6(ステートレス)→ 外部ストレージを使う理由。ファクター11(ログはストリーム)→ stdout → ログアグリゲーター。

4. Service Mesh

マイクロサービスが増えると、mTLS、リトライ、サーキットブレーカー、オブザーバビリティの管理が必要になります。Service Meshは各Podにサイドカープロキシを注入することでこの問題を解決します。

Without Service Mesh:          With Service Mesh (Istio):
  App A ──────────────► App B    App A ──► [Envoy] ──► [Envoy] ──► App B
  (manual TLS, retry code)         sidecar           sidecar
                                 (auto mTLS, metrics, retry, tracing)
機能Service Meshが提供するもの
mTLS相互認証サービス間のトラフィックを自動暗号化
トラフィック管理カナリア、A/B、重み付きルーティング
オブザーバビリティ自動メトリクス、トレーシング、アクセスログ
レジリエンスリトライ、タイムアウト、サーキットブレーカー

5. チートシート

試験の質問回答
CNCFが定義するクラウドネイティブの要素は?コンテナ、マイクロサービス、宣言型API、イミュータブルインフラ
12-Factorに従ってconfigをどこに保存すべき?環境変数(ハードコードしない)
12-Factorに従ったログの扱い方は?ストリームとして扱う(stdout/stderr)
Service MeshはPodに何を注入する?サイドカープロキシ(Envoy)
マイクロサービスはどの部分をスケールする?ボトルネックのあるサービスのみ

6. 練習問題

Q1: 12-Factor Appメソドロジーに従って、アプリケーションはデータベース接続文字列をどのように保存すべきですか?

  • A) ソースコードにハードコード
  • B) リポジトリにコミットされる設定ファイル
  • C) 環境変数として(Kubernetes ConfigMapまたはSecret) ✓
  • D) ビルド引数としてコンテナイメージに

解説:ファクター3(Config)は「設定を環境に保存する」と述べています。Kubernetesでは、機密でない設定にはConfigMap、機密の値にはSecretを使用し、環境変数として注入します。

Q2: マイクロサービスアーキテクチャでService Meshを使用する主な利点は何ですか?

  • A) コンテナオーケストレーションのKubernetesを置き換える
  • B) アプリケーションコードを変更せずにインフラレベルのネットワーク機能(mTLS、リトライ、オブザーバビリティ)を提供する ✓
  • C) アプリケーション設定を保存する
  • D) コンテナ再起動時にアプリケーション状態を永続化する

解説:Service Meshはサイドカープロキシを介して横断的関心事(セキュリティ、オブザーバビリティ、レジリエンス)をインフラ層に移動します。開発者は各サービスにリトライロジックやmTLSを実装する必要がありません。

Q3: 「イミュータブルインフラストラクチャ」を従来のインフラストラクチャと区別する特徴は何ですか?

  • A) サーバーは再起動されない
  • B) 実行中のシステムはインプレースで変更されるのではなく、置き換えられる ✓
  • C) 設定変更には手動承認が必要
  • D) インフラストラクチャはYAMLファイルのみで定義される

解説:イミュータブルインフラストラクチャとは、実行中のコンテナを更新/パッチすることなく、新しいイメージをビルドしてデプロイし、古いコンテナを置き換えることを意味します。これにより構成のドリフトが排除され、再現性が向上します。