コンテナオーケストレーション

英語名 Container Orchestration
読み方 コンテナ オーケストレーション
難易度
所要時間 基盤構築に2〜4週間
提唱者 Google Borg の思想を基に Kubernetes として公開(2014年)
目次

ひとことで言うと
#

多数のコンテナの配置、スケーリング、ネットワーク、障害復旧を自動管理する仕組み。手動でDockerコンテナを管理する限界を超え、本番環境でのコンテナ運用を現実的にする。

押さえておきたい用語
#

押さえておきたい用語
Pod(ポッド)
Kubernetesにおけるデプロイの最小単位のこと。1つ以上のコンテナをまとめて管理し、同じネットワーク名前空間とストレージを共有する。
Deployment(デプロイメント)
Podの望ましい状態(レプリカ数、イメージバージョンなど)を宣言的に定義するリソースのこと。ローリングアップデートやロールバックを自動管理する。
HPA(Horizontal Pod Autoscaler)
CPU使用率やカスタムメトリクスに基づいてPodの数を自動で増減させる仕組みのこと。トラフィックの変動に応じたスケーリングを実現する。
マニフェスト(Manifest)
Kubernetesリソースのあるべき状態をYAMLまたはJSONで記述した設定ファイルのこと。宣言的管理の基盤となる。

コンテナオーケストレーションの全体像
#

コンテナオーケストレーション:宣言的管理と自動運用の仕組み
宣言的定義Manifestで望ましい状態を記述するレプリカ数: 3CPU制限: 500mメモリ: 512MiBヘルスチェック: /healthzオーケストレーター宣言と現実の差分を自動で解消するスケジューリングヘルスチェック監視障害自動復旧ローリングアップデート実行環境宣言通りの状態でコンテナが稼働するPod A (稼働中)Pod B (稼働中)Pod C (稼働中)障害時は自動で再起動オートスケーリング(HPA)CPU使用率70%超 → 自動でPod数を増加(最大10レプリカ)負荷低下 → 自動でPod数を削減(最小2レプリカ)スケーリングの上限値は必ず設定する(暴走防止)
コンテナオーケストレーション導入フロー
1
ツール選定
K8s / ECS / Swarmなど規模に合ったツールを選ぶ
2
コンテナ化
Dockerfileを最適化しイメージを作成
3
マニフェスト定義
レプリカ数・リソース制限・ヘルスチェックを宣言
4
スケーリング設定
HPAと監視基盤を構築
本番運用開始
障害復旧・ローリングアップデートを自動化

こんな悩みに効く
#

  • コンテナの数が増えすぎて、手動での管理が限界を迎えている
  • コンテナが落ちたことに気づけず、手動で再起動している
  • トラフィックに応じたスケーリングを自動化したい

基本の使い方
#

ステップ1: オーケストレーションツールを選定する

プロジェクトに合ったツールを選ぶ。

  • Kubernetes(K8s): デファクトスタンダード。大規模・複雑な構成向け
  • Amazon ECS: AWSネイティブ。K8sより学習コストが低い
  • Docker Swarm: シンプル。小規模な構成向け
  • Nomad: HashiCorp製。コンテナ以外のワークロードも管理可能

ポイント: 規模が小さいうちはECSやSwarmでも十分。K8sは学習コストが高い。

ステップ2: アプリケーションをコンテナ化する

デプロイ対象のアプリケーションをコンテナイメージにする。

  • Dockerfileを最適化する(マルチステージビルド、レイヤーキャッシュ)
  • イメージサイズを小さく保つ(軽量ベースイメージの使用)
  • 環境変数で設定を外部化する(12 Factor App準拠)

ポイント: 良いコンテナイメージ=小さく、セキュアで、再現性がある。

ステップ3: デプロイメント定義を作成する

宣言的にデプロイ構成を記述する。

  • レプリカ数、リソース制限(CPU/メモリ)、ヘルスチェックを定義
  • ローリングアップデート戦略を設定する
  • ConfigMapやSecretで設定と機密情報を管理する

ポイント: 「あるべき状態」を宣言し、オーケストレーターが実現してくれる。

ステップ4: オートスケーリングと監視を設定する

負荷に応じた自動スケーリングと監視体制を構築する。

  • HPA(Horizontal Pod Autoscaler)でCPU/メモリ使用率に基づくスケーリング
  • カスタムメトリクス(リクエスト数等)でのスケーリングも設定可能
  • Prometheus + Grafana でクラスタの状態を可視化する

ポイント: スケーリングの上限値は必ず設定する。暴走を防ぐためのセーフガード。

具体例
#

例1:ECサイトのマイクロサービス5つをKubernetesで運用する

構成: 商品・注文・在庫・決済・通知の5つのマイクロサービスをK8sクラスタで運用。

デプロイ: 各サービスのDeploymentマニフェストで、レプリカ数3、CPU制限500m、メモリ制限512MiB、ヘルスチェック(/healthz)を定義。

スケーリング: 商品サービスにHPAを設定。CPU使用率70%超でスケールアウト(最大10レプリカ)。セール時にトラフィックが10倍になっても自動対応。

障害復旧: 注文サービスのPodが1つクラッシュ → Kubernetesが即座に検知し、新しいPodを30秒以内に自動起動。ダウンタイムほぼゼロ。

結果: 手動運用時は障害対応に月20時間かかっていたが、K8s導入後は月2時間に削減。運用コスト90%減

例2:スタートアップがECSで段階的にコンテナ運用を始める

状況: エンジニア3人のスタートアップ。モノリスのRailsアプリをAWS上で運用中。K8sの学習コストは許容できない。

選定理由: Amazon ECSを選択。AWS上で既に運用しており、Fargateを使えばサーバー管理も不要。学習コストはK8sの1/3程度

構成: ECS Fargate + ALB。タスク定義でCPU 256、メモリ 512MB、desired count 2。CI/CDはGitHub Actions。

結果: EC2直接運用と比較して、デプロイ時間が30分→5分に短縮。月のインフラコストはFargate起動分で月額約$50増だが、デプロイの人的コスト削減で実質マイナス

例3:ブラックフライデーの10倍トラフィックをHPAで乗り切る

状況: EC事業者の年間最大セール。通常時の10倍のトラフィックが見込まれる。前年は手動スケーリングが間に合わず、カート機能が15分間ダウンした。

HPA設定: 商品APIにHPAを設定。CPU使用率60%超でスケールアウト、最小3 Pod、最大30 Pod。Cluster Autoscalerも併用し、ノード自体も自動追加。

セール当日の推移:

  • 21:00 セール開始 → 1分でPod数が3→12に自動拡張
  • 21:15 ピーク → Pod数24、レスポンスタイム200ms以下を維持
  • 23:00 トラフィック減少 → Pod数が24→6に自動縮小

結果: ダウンタイムゼロ。前年比で売上23%増。手動スケーリングなしでピークを乗り切り、エンジニアはセール当日もオンコール待機のみ。

やりがちな失敗パターン
#

  1. リソース制限を設定しない — 1つのコンテナがCPU/メモリを食い尽くし、他のコンテナに影響する。すべてのコンテナにリソースのrequestsとlimitsを設定すること
  2. ヘルスチェックを設定しない — コンテナがハングしてもオーケストレーターが検知できず、死んだプロセスにリクエストが送られ続ける。liveness/readiness probeを必ず設定すること
  3. いきなりKubernetesを導入する — コンテナ化もできていない段階でK8sを導入すると、学習コストに押しつぶされる。まずコンテナ化し、次にシンプルなオーケストレーションから始めること
  4. Podのログを永続化していない — Podが再起動するとログが消失する。FluentdやFluentBitでログを外部に転送する仕組みを最初から構築すること

まとめ
#

コンテナオーケストレーションはコンテナの本番運用に不可欠な技術。デプロイ、スケーリング、障害復旧を自動化することで、運用の負担を大幅に削減できる。ただし学習コストは高いので、プロジェクトの規模に合ったツールを選び、段階的に導入しよう