Kubernetes の実践的な概要
1台のサーバーでは問題なく動作していたWebアプリが、実際のトラフィックに耐えられず崩壊した経験があるなら、Kubernetes が解決しようとしている問題をすでに理解しているはずです。コンテナを大規模に管理すること——複数のマシンにまたがって、ゼロダウンタイムでデプロイし、自動的に復旧させること——は本当に難しい課題です。Kubernetes(K8s)は、業界がこの課題に対処するために選んだツールです。
本記事では、Kubernetes について明確な概要をお伝えします。Kubernetes とは何か、そのアーキテクチャはどのように機能し、各コアコンポーネントがどのように連携してモダンな Web アプリケーションを動かしているのかを解説します。
主なポイント
- Kubernetes は事実上のコンテナオーケストレーションプラットフォームであり、クラスター内のマシン全体にわたってスケジューリング、スケーリング、自己修復、トラフィックルーティングを自動化します。
- クラスターは2層構造です。意思決定を行う Control Plane(API Server、Scheduler、Controller Manager、etcd)と、ワークロードを実行する Worker Node(Kubelet、コンテナランタイム、kube-proxy)から構成されます。
- Pod はデプロイ可能な最小単位ですが、通常は Deployment と ReplicaSet を介して管理し、これらがレプリケーションとローリングアップデートを担当します。
- Service は一時的な Pod に安定したネットワークエンドポイントを提供し、Ingress や新しい Gateway API は外部からの HTTP/HTTPS ルーティングを処理します。
- ConfigMap と Secret は設定情報や機密データをコンテナイメージから切り離して保持するため、デプロイメントのポータビリティとセキュリティが向上します。
Kubernetes とは何か、なぜ存在するのか?
Kubernetes は、もともと Google によって開発され、2015年に Cloud Native Computing Foundation(CNCF) に寄贈されたオープンソースのコンテナオーケストレーションプラットフォームです。広く採用されており、コンテナオーケストレーションの標準プラットフォームと見なされています。
簡潔に言えば、Docker はアプリをコンテナにパッケージ化します。Kubernetes はそれらのコンテナをマシンクラスター上で実行・管理し、スケジューリング、スケーリング、自己修復、トラフィックルーティングを自動的に処理します。
Kubernetes アーキテクチャの基本:クラスターの構成
Kubernetes クラスターには、明確に分かれた2つの層があります。
Control Plane(頭脳)
Control Plane はクラスター全体に対する意思決定を行います。主なコンポーネントは以下の通りです:
- API Server — すべてのコマンドの単一のエントリーポイント。すべての
kubectlコマンドはここに送られます。 - Scheduler — 利用可能なリソースに基づいて、特定の Pod をどのワーカーノードで実行するかを決定します。
- Controller Manager — クラスターの実際の状態と望ましい状態を継続的に調整します。
- etcd — クラスターのすべての構成情報と状態を保持する分散型 Key-Value ストア。信頼できる唯一の情報源(Source of Truth)です。
Worker Node(アプリが実際に動く場所)
ワーカーノードは、コンテナ化されたワークロードを実行します。各ノードには以下が含まれます:
- Kubelet — コンテナが指定通りに動作していることを保証するノードエージェント。
- Container Runtime — イメージを取得してコンテナを実行します(モダンなクラスターでは通常 containerd が使われます)。
- Kube-proxy — Pod 同士、および Pod と Service の通信を可能にするためのネットワークルールを管理します。
Web アプリのための Kubernetes コアコンセプト
Pod
Pod は Kubernetes におけるデプロイ可能な最小単位です。ネットワークとストレージのコンテキストを共有する1つ以上のコンテナをラップします。通常はワークロードコントローラーが Pod を管理してくれるため、直接 Pod を作成することは稀です。
Deployment と ReplicaSet
Deployment は、何を実行したいかを記述する方法です。どのコンテナイメージを使うか、レプリカ数はいくつか、更新はどのように展開するかを定義します。その内部では ReplicaSet を管理しており、これが常に適切な数の Pod のコピーが稼働していることを保証します。Pod がクラッシュすると、ReplicaSet が自動的に置き換えます。
フロントエンドアプリの場合、Deployment で「私の React アプリのレプリカを3つ実行する」と指定するだけで、Kubernetes はゼロダウンタイムのローリングアップデートを含む残りの処理をすべて引き受けてくれます。
Service
Pod は一時的なものであり、IP アドレスは変化します。Service は Pod に安定したネットワークエンドポイントを提供します。主なタイプは以下の通りです:
| Type | ユースケース |
|---|---|
ClusterIP | サービス間の内部通信(デフォルトタイプ) |
NodePort | テスト用に静的ポートでサービスを公開 |
LoadBalancer | クラウドが管理する外部アクセス(本番環境で最も一般的) |
Ingress と Gateway API
HTTP/HTTPS のルーティング——たとえば /api のトラフィックをあるサービスに、/ を別のサービスに送る——には、Ingress または新しい Gateway API を使います。Gateway API はエコシステムが現在向かっている方向性であり、より柔軟性が高く、ロールベースの設定が可能です。新しく始めるのであれば、従来の Ingress コントローラーよりも Gateway API を検討する価値があります。
Discover how at OpenReplay.com.
ConfigMap と Secret
設定情報をコンテナイメージから分離しておきましょう。ConfigMap は機密でない設定(API URL、機能フラグなど)を保持します。Secret は機密データ(トークン、パスワードなど)を保持します。どちらも環境変数として Pod に注入したり、ファイルとしてマウントしたりできます。
すべてがどのように連携するか
Kubernetes 上にフルスタックアプリをデプロイする場合、流れは以下のようになります:
- アプリのコンテナとレプリカ数を記述した Deployment YAML を作成します。
- Scheduler が、空き容量のあるワーカーノードに Pod を配置します。
- Service がそれらの Pod に安定した内部アドレスを付与します。
- Ingress または Gateway が外部の HTTP トラフィックをその Service にルーティングします。
- Pod がダウンすると、ReplicaSet が置き換えます。トラフィックが急増した場合は、Deployment をスケールします。
まとめ
Kubernetes アーキテクチャの基本は次の点に集約されます:Control Plane が意思決定し、ワーカーノードが実行する。そして Pod、Deployment、Service などの抽象化が、アプリケーションを記述・管理するための一貫した手段を提供する。Web アプリに関して言えば、Deployment、Service、ルーティングを理解すれば大半は事足ります。それ以外の要素——ストレージ、Namespace、リソース制限など——は、基礎を押さえた後にその上に積み上げていくものです。
FAQ
おそらく不要です。Kubernetes はクラスターのメンテナンス、YAML の設定、急な学習曲線など、運用上の実質的なオーバーヘッドをもたらします。小規模プロジェクトや初期段階のアプリには、Vercel、Render などのマネージドプラットフォームや、Docker Compose を使った単一の VPS の方が、通常は迅速かつ低コストです。複数サービスのオーケストレーション、予測可能なスケーリング、環境間で厳格な稼働時間の保証が必要になったときに Kubernetes を導入しましょう。
Docker はコンテナをビルド、パッケージ化、実行するためのツールチェーンです。単一のホスト上で個々のコンテナをビルドして実行します。Kubernetes は、多数のコンテナを多数のマシンにまたがって管理するオーケストレーターであり、スケジューリング、スケーリング、ネットワーキング、復旧を担当します。両者は補完的なツールです。Docker がコンテナを作成し、Kubernetes がそれらをクラスター全体で大規模に実行します。
新しいプロジェクトを始めるのであれば、長期的には Gateway API の方が良い選択です。より表現力の高いモデルを提供し、インフラチームとアプリケーションチーム間の責務分離が明確で、エコシステムが向かう先でもあります。Ingress は依然として広くサポートされており、既存の構成にはまったく問題ありませんが、新しいクラスターでは、選択したコントローラーが対応している限り、まず Gateway API の検討から始めるべきです。
機密値には ConfigMap ではなく Secret を使用してください。base64 エンコーディングは暗号化ではない点に注意し、etcd における保存時の暗号化を有効にし、RBAC でアクセスを制限してください。本番グレードのシークレット管理には、HashiCorp Vault、AWS Secrets Manager、External Secrets Operator のような外部ツールを統合し、認証情報を Pod に安全に注入することを推奨します。
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.