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

レッスン 1: クラウドネイティブとは何ですか? — 原則と 12 要素アプリ

CNCF に基づくクラウド ネイティブの定義、従来型とクラウド ネイティブの比較、12 要素アプリ手法、および最新のアプリケーションにとってクラウド ネイティブが避けられないトレンドである理由。

🏗️ アーキテクチャ — レッスン 1 レッスン 1: クラウドネイティブとは何ですか? — 原則と Twelve-Factor アプリ

クラウドネイティブのマイクロサービスアーキテクチャ

パート 1: クラウド ネイティブの基盤

xdev.asia

レッスン 1: クラウドネイティブとは何ですか? — 原則と 12 要素アプリ

はじめに

クラウド コンピューティングは、ソフトウェアの構築と運用の方法を完全に変えました。ただし、単にクラウド上でアプリケーションを実行することは「クラウド ネイティブ」と同義ではありません。このレッスンは、クラウド ネイティブの実際の意味、重要な理由、すべてのエンジニアが習得すべき基本原則を理解するのに役立ちます。


1. クラウドネイティブとは何ですか?

1.1 CNCF による定義

Cloud Native Computing Foundation (CNCF) — Kubernetes、Prometheus、Envoy などのプロジェクトを管理する組織によると、次のようになります。

クラウド ネイティブ テクノロジーにより、組織はパブリック クラウド、プライベート クラウド、ハイブリッド クラウドなどの最新の動的な環境でスケーラブルなアプリケーションを構築して実行できるようになります。コンテナー、サービス メッシュ、マイクロサービス、不変のインフラストラクチャ、宣言型 API は、このアプローチの例です。

簡単に言えば、クラウド ネイティブは、クラウド コンピューティングを最大限に活用するアプリケーションを構築するための アプローチです。

1.2 コア機能

Cloud Native Application
├── Containerized          → Đóng gói nhất quán, portable
├── Dynamically Orchestrated → Kubernetes tự động quản lý
├── Microservices-oriented  → Chia nhỏ, độc lập, dễ scale
├── Loosely Coupled         → Ít phụ thuộc lẫn nhau
├── Resilient              → Tự phục hồi khi có lỗi
├── Observable             → Giám sát toàn diện (metrics, logs, traces)
└── Automated              → CI/CD, IaC, GitOps

1.3 クラウドネイティブ ≠ 「クラウド上で実行」

AWS EC2 上で実行されているアプリケーションですが、依然としてモノリスであり、手動でデプロイされ、自動スケーリングはありません。クラウドネイティブではありません。

対照的に、完全なコンテナー、CI/CD、可観測性を備えたオンプレミスの Kubernetes クラスター上で実行されるアプリケーション — これがクラウド ネイティブです。

クラウド ネイティブは、実行場所ではなく、構築および運用方法に関するものです。


2. 従来型とクラウドネイティブの比較

特長伝統的なクラウドネイティブ
アーキテクチャモノリシックマイクロサービス
展開VM / ベアメタルコンテナ / Kubernetes
スケーリング垂直(拡大)水平 (スケールアウト)
リリースサイクル月刊 / 四半期毎日/時間ごと
障害対応失敗は何としてでも避けてください失敗を受け入れ、自己回復する
インフラストラクチャ変更可能 (適切に更新)不変 (完全な置き換え)
州ステートフルサーバーステートレス サービス + 外部状態
構成サーバー上の構成ファイル環境変数 / ConfigMap
ネットワーキング固定IPダイナミックDNS、サービスディスカバリ
モニタリング反応性 (いつそれが起こるかを知る)プロアクティブ (メトリクス、アラート、トレース)

実践例

従来のアプローチ:

Developer → Build WAR → Gửi cho Ops → Ops deploy lên Tomcat trên VM
→ Cần scale? Mua thêm server, cài đặt thủ công
→ Server die? Downtime cho đến khi fix xong

クラウドネイティブなアプローチ:

Developer → Git push → CI/CD tự động build container image
→ ArgoCD sync → Kubernetes deploy 3 replicas
→ Cần scale? HPA tự thêm pod
→ Pod die? Kubernetes tự restart trong giây

3. なぜクラウドネイティブなのか?

3.1 ビジネスの推進要因

  • 市場投入までの時間: 新機能を数週間ではなく数時間で導入します
  • スケーラビリティ: トラフィックの急増 (ブラック フライデー、フラッシュ セール) を自動的に処理します。
  • コスト効率: 不要な場合はスケールダウンし、使用した分だけ支払います
  • イノベーションのスピード: チームは独立して並行して開発します。

3.2 技術的な要因

  • 障害の切り分け: サービス A のエラーによってシステム全体がダウンすることはありません
  • テクノロジーの多様性: 各サービスは最適な言語/フレームワークを使用できます。
  • 独立した展開: サービス B を再展開せずにサービス A を更新します。
  • リソースの最適化: CPU/メモリがワークロードごとに正確に割り当てられます。

4. Twelve-Factor アプリ

2011 年に Heroku によって提案された Twelve-Factor App (12factor.net) 方法論は、クラウド ネイティブ アプリケーション設計の理論的基盤です。

4.1 12 要素の概要

要因 1: コードベース

単一のコードベースがバージョン管理によって管理され、複数の環境にデプロイされます。

Git Repository (1 codebase)
├── Deploy → Development
├── Deploy → Staging
└── Deploy → Production

ルール: 1 つのアプリ = 1 つのリポジトリ。共有コードがある場合は、ライブラリに分割します。

要因 2: 依存関係

依存関係を明確に宣言して分離します。

// package.json — khai báo rõ ràng
{
  "dependencies": {
    "express": "4.18.2",
    "pg": "8.11.0"
  }
}

決して、サーバーにプリインストールされているシステムレベルのパッケージに依存しないでください。

要素 3: 構成

設定を環境変数に保存します。

# ✅ Đúng: Config qua env vars
DATABASE_URL=postgresql://user:pass@host:5432/db
REDIS_URL=redis://cache:6379
API_KEY=sk-xxx

# ❌ Sai: Hardcode trong source code
const DB_HOST = "192.168.1.100";

要素 4: 支援サービス

バッキング サービスを接続されたリソースとして処理します。

App ──attach──▶ PostgreSQL (có thể thay bằng RDS bất cứ lúc nào)
App ──attach──▶ Redis (có thể thay bằng ElastiCache)
App ──attach──▶ S3 (có thể thay bằng MinIO)

バッキング サービスの変更 = 設定の変更、コードの変更ではありません。

要素 5: ビルド、リリース、実行

ビルド、リリース、実行の各段階を完全に分離。

Build Stage:   Source code → Executable (Docker image)
Release Stage: Image + Config → Versioned release (v1.2.3)
Run Stage:     Launch release trong execution environment

要素 6: プロセス

アプリケーションをステートレス プロセスとして実行します。

# ✅ Stateless: Session lưu ở Redis
Request → App Instance 1 ──session──▶ Redis
Request → App Instance 2 ──session──▶ Redis

# ❌ Stateful: Session lưu trong memory
Request → App Instance 1 (session ở đây)
Request → App Instance 2 (không có session!) ← BUG

要素 7: ポート バインド

ポートバインディング経由でサービスをエクスポートします。

アプリケーションには独自の HTTP サーバーが含まれています (外部 Tomcat/Apache は必要ありません)。

const app = express();
app.listen(process.env.PORT || 8080);

要素 8: 同時実行性

プロセスモデルによるスケールアウト。

Thay vì 1 process lớn dùng 16 cores:
├── Web process × 4 (handle HTTP requests)
├── Worker process × 8 (background jobs)
└── Clock process × 1 (scheduled tasks)

要素 9: 使い捨て可能性

高速起動、正常なシャットダウン。

Startup:  < 5 giây (lý tưởng < 1 giây)
Shutdown: SIGTERM → hoàn thành request đang xử lý → close connections → exit

要素 10: 開発/製品のパリティ

開発、ステージング、実稼働を可能な限り類似した状態に保ちます。

# ✅ Dev dùng PostgreSQL, Prod dùng PostgreSQL
# ❌ Dev dùng SQLite, Prod dùng PostgreSQL
# ❌ Dev dùng file system, Prod dùng S3

Docker Compose は、開発/運用の同等性の実現に役立ちます。

要素 11: ログ

ログをイベント ストリームとして処理します。

Application → stdout/stderr → Log collector (Fluent Bit) → Loki/Elasticsearch

アプリケーションはログ ファイルを決して管理しません。標準出力に書き込むだけです。

要素 12: 管理プロセス

管理/管理タスクを 1 回限りのプロセスとして実行します。

# Database migration
kubectl exec -it order-service-pod -- ./manage.py migrate

# Data cleanup
kubectl run --rm -it cleanup --image=myapp -- python cleanup_script.py

4.2 12 要素を超えて

Kevin Hoffman は、著書「Beyond the Twelve-Factor App」の中で、さらに 3 つの要素を追加しています。

  • 要素 13: API ファースト — API コントラクトを最初に設計し、後で実装します。
  • 要素 14: テレメトリ — メトリクス、ログ、トレースが必要です
  • 要素 15: 認証と認可 — 後付けではなく、設計によるセキュリティ

5. クラウドネイティブのランドスケープ

CNCF は、クラウド ネイティブ テクノロジー スタック全体のマップである クラウド ネイティブ ランドスケープ を維持しています。

┌─────────────────────────────────────────────────────────────┐
│                    Cloud Native Landscape                    │
├───────────────┬──────────────┬───────────────┬──────────────┤
│ App Definition│ Orchestration│  Runtime      │  Provisioning│
│ & Development │ & Management │               │              │
│               │              │               │              │
│ - Helm       │ - Kubernetes │ - containerd  │ - Terraform  │
│ - gRPC       │ - Istio      │ - CRI-O      │ - Ansible    │
│ - OpenAPI    │ - ArgoCD     │ - Envoy      │ - Crossplane │
│ - Dapr       │ - Keda       │ - CoreDNS    │ - Pulumi     │
├───────────────┼──────────────┼───────────────┼──────────────┤
│ Observability │ Serverless   │  Security     │  Database    │
│               │              │               │              │
│ - Prometheus │ - Knative    │ - Vault      │ - Vitess     │
│ - Grafana    │ - OpenFaaS   │ - Falco      │ - TiDB       │
│ - Jaeger     │ - Dapr       │ - OPA        │ - CockroachDB│
│ - Loki       │              │ - Trivy      │              │
└───────────────┴──────────────┴───────────────┴──────────────┘

6. まとめ

コンセプトテイクアウト
クラウドネイティブクラウド上で実行するだけでなく、クラウドを活用するアプリケーションを構築する方法
12要素ポータブルでスケーラブルな実稼働対応アプリケーション設計の 12 原則
不変のインフラストラクチャサーバーを修理せず、完全に交換してください。
ステートレスなデザイン外部サービスの状態、アプリインスタンスはいつでも置き換え可能
デフォルトで監視可能メトリクス、ログ、トレースは最初から必須の要件です。

次の記事: コンテナと Docker — Dockerfile のベスト プラクティスからイメージ セキュリティまで、クラウド ネイティブ アプリケーション パッケージ プラットフォーム。