Day 1: Kubernetesの世界へようこそ
今日学ぶこと
- Kubernetesとは何か、なぜ必要なのか
- DockerからKubernetesへの自然な流れ
- Kubernetesのアーキテクチャと主要コンポーネント
- 宣言的モデルと望ましい状態(Desired State)
DockerからKubernetesへ
「10日で覚えるDocker」で、コンテナ技術の基礎を学びました。Dockerを使えば、アプリケーションをコンテナとしてパッケージ化し、どこでも同じように動かせます。Docker Composeを使えば、複数のコンテナを連携させることもできました。
しかし、本番環境で多数のコンテナを運用するとき、新たな課題が生まれます。
flowchart TB
subgraph Docker["Dockerだけの世界"]
D1["コンテナが落ちたら?"]
D2["サーバーが1台で足りなくなったら?"]
D3["ゼロダウンタイムで更新したい"]
D4["負荷に応じて自動スケールしたい"]
end
subgraph K8s["Kubernetesが解決"]
K1["自動復旧(Self-healing)"]
K2["複数ノードのクラスタ管理"]
K3["ローリングアップデート"]
K4["オートスケーリング"]
end
D1 --> K1
D2 --> K2
D3 --> K3
D4 --> K4
style Docker fill:#f59e0b,color:#fff
style K8s fill:#3b82f6,color:#fff
Docker Composeとの違い
Docker Composeは開発環境では強力なツールですが、本番環境には限界があります。
| 機能 | Docker Compose | Kubernetes |
|---|---|---|
| 対象 | 単一ホスト | 複数ノードのクラスタ |
| 自動復旧 | なし | コンテナ自動再起動 |
| スケーリング | 手動 | 自動スケーリング対応 |
| ロードバランシング | 自前で構成 | Service で自動 |
| ローリングアップデート | なし | 標準サポート |
| ヘルスチェック | 基本的 | 詳細なプローブ設定 |
| シークレット管理 | .env ファイル | Secret オブジェクト |
Kubernetesとは
Kubernetes(K8s)は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するオープンソースのコンテナオーケストレーションプラットフォームです。
Googleが社内で10年以上使用してきたコンテナ管理システム「Borg」の経験を基に開発され、2014年にオープンソースとして公開されました。現在はCloud Native Computing Foundation(CNCF)がメンテナンスしています。
名前の由来
「Kubernetes」はギリシャ語で「操舵手」や「パイロット」を意味します。K8sという略称は、「K」と「s」の間に8文字あることから来ています。
Kubernetesのアーキテクチャ
Kubernetesクラスタは、大きく分けて**コントロールプレーン(Control Plane)とワーカーノード(Worker Node)**で構成されます。
flowchart TB
subgraph CP["コントロールプレーン"]
API["API Server"]
ETCD["etcd"]
SCHED["Scheduler"]
CM["Controller Manager"]
end
subgraph W1["ワーカーノード 1"]
KL1["kubelet"]
KP1["kube-proxy"]
P1["Pod A"]
P2["Pod B"]
end
subgraph W2["ワーカーノード 2"]
KL2["kubelet"]
KP2["kube-proxy"]
P3["Pod C"]
P4["Pod D"]
end
API --> KL1
API --> KL2
API --> ETCD
SCHED --> API
CM --> API
style CP fill:#8b5cf6,color:#fff
style W1 fill:#3b82f6,color:#fff
style W2 fill:#3b82f6,color:#fff
コントロールプレーンのコンポーネント
| コンポーネント | 役割 |
|---|---|
| API Server | クラスタへの全リクエストの受付窓口。kubectlコマンドはここに送られる |
| etcd | クラスタの全状態を保存する分散キーバリューストア |
| Scheduler | 新しいPodをどのノードに配置するか決定する |
| Controller Manager | 望ましい状態を維持するための各種コントローラーを実行する |
ワーカーノードのコンポーネント
| コンポーネント | 役割 |
|---|---|
| kubelet | ノード上でPodの実行を管理するエージェント |
| kube-proxy | ネットワークルールを管理し、Podへの通信を制御する |
| コンテナランタイム | コンテナを実際に実行する(containerd等) |
宣言的モデル:Kubernetesの核心
Kubernetesの最も重要な概念は**宣言的モデル(Declarative Model)**です。
Dockerでは「コンテナを起動しろ」「コンテナを停止しろ」と**命令的(Imperative)**に操作しました。
Kubernetesでは「このアプリケーションが3つのレプリカで動いている状態にしてほしい」と**宣言的(Declarative)**に望ましい状態を記述します。
flowchart LR
subgraph Imperative["命令的(Docker)"]
I1["docker run app"]
I2["docker stop app"]
I3["docker run app"]
end
subgraph Declarative["宣言的(Kubernetes)"]
D1["望ましい状態:\nreplicas: 3"]
D2["Kubernetesが\n自動で維持"]
end
style Imperative fill:#f59e0b,color:#fff
style Declarative fill:#22c55e,color:#fff
宣言的モデルの仕組み
- ユーザーが望ましい状態を定義 → YAMLマニフェストで「レプリカ3つ」と記述
- API Serverに送信 → kubectlコマンドでクラスタに適用
- コントローラーが監視 → 現在の状態と望ましい状態を常に比較
- 差分を自動修正 → Podが落ちたら自動で新しいPodを起動
この「観察 → 比較 → 修正」のループを**Reconciliation Loop(調整ループ)**と呼びます。
Kubernetesの主要オブジェクト
Kubernetesには多くのオブジェクト(リソース)がありますが、この書籍で学ぶ主要なものを紹介します。
flowchart TB
subgraph Workload["ワークロード"]
POD["Pod"]
RS["ReplicaSet"]
DEP["Deployment"]
end
subgraph Network["ネットワーク"]
SVC["Service"]
ING["Ingress"]
end
subgraph Config["設定・ストレージ"]
CM["ConfigMap"]
SEC["Secret"]
PV["PersistentVolume"]
end
DEP --> RS
RS --> POD
SVC --> POD
ING --> SVC
CM --> POD
SEC --> POD
PV --> POD
style Workload fill:#3b82f6,color:#fff
style Network fill:#22c55e,color:#fff
style Config fill:#8b5cf6,color:#fff
| オブジェクト | 説明 | Docker対応概念 |
|---|---|---|
| Pod | コンテナの実行単位 | コンテナ |
| ReplicaSet | Podのレプリカ数を維持 | - |
| Deployment | ReplicaSetを管理し、更新を制御 | - |
| Service | Podへの安定したネットワークアクセス | ネットワーク |
| Ingress | 外部からのHTTPルーティング | ポートマッピング |
| ConfigMap | 設定データの管理 | 環境変数 |
| Secret | 機密データの管理 | .env ファイル |
| PersistentVolume | データの永続化 | Volume |
Kubernetesの利点
1. 自己修復(Self-healing)
コンテナが異常終了したり、ノードが故障した場合、Kubernetesは自動的にコンテナを再スケジュールします。
2. 水平スケーリング
負荷に応じてPodの数を自動的に増減できます(Horizontal Pod Autoscaler)。
3. ローリングアップデート
ダウンタイムなしで、段階的にアプリケーションを更新できます。問題が発生した場合はロールバックも可能です。
4. サービスディスカバリとロードバランシング
KubernetesはPodにDNS名を割り当て、トラフィックを自動的に分散します。
5. ストレージオーケストレーション
ローカルストレージ、クラウドプロバイダーのストレージなど、さまざまなストレージシステムを自動的にマウントできます。
6. 宣言的設定とバージョン管理
YAMLファイルで全てを記述するため、Gitでインフラ設定をバージョン管理できます(Infrastructure as Code)。
まとめ
| 概念 | 説明 |
|---|---|
| Kubernetes | コンテナオーケストレーションプラットフォーム |
| コントロールプレーン | クラスタの頭脳(API Server、etcd、Scheduler、Controller Manager) |
| ワーカーノード | コンテナが実際に動作するマシン(kubelet、kube-proxy) |
| 宣言的モデル | 「望ましい状態」を定義し、Kubernetesが自動で維持する |
| Reconciliation Loop | 現在の状態と望ましい状態の差分を自動修正するループ |
重要ポイント
- KubernetesはDockerの次のステップ。コンテナの運用・管理を自動化する
- 宣言的モデルにより「何をしたいか」を記述し、「どうやるか」はKubernetesに任せる
- コントロールプレーンとワーカーノードの2層構造でクラスタを構成する
練習問題
問題1: 基本
Docker ComposeとKubernetesの主な違いを3つ挙げてください。
問題2: アーキテクチャ
コントロールプレーンの4つのコンポーネントの名前と役割を説明してください。
チャレンジ問題
宣言的モデルと命令的モデルの違いを、日常生活の例えを使って説明してください。例えば、レストランでの注文やタクシーの行き先指定など。
参考リンク
次回予告: Day 2では「クラスタの構築とkubectl」について学びます。実際にKubernetes環境を準備し、最初のコマンドを実行しましょう。