Docker: Kubernetes の基礎
最終更新:2026-08-26
⚠️ 推奨される前提条件: 以下のような状況に該当する場合にのみ、このレッスンを進めてください。
- 単一の Docker インスタンスではもはやトラフィックを捌ききれない
- 自動スケーリング、セルフヒーリング、マルチノードの高可用性が必要
- チームが K8s への移行を決定した
もし Docker + Compose でプロジェクトに十分であれば、このレッスンをスキップしてレッスン 24 に進みましょう。
1. 学べること
- K8s コアアーキテクチャとコンセプト
- Pod / デプロイ / Service の 3 つのコアオブジェクト
- よく使う kubectl コマンド
- Compose から K8s への移行アプローチ
- ローカル Minikube クラスターのセットアップ
2. クラスター拡張の物語
(1) 悩み: Swarm ではもはや不十分
Alice がデプロイした Swarm クラスターではもはや不十分でした。5 つのレプリカではトラフィックを捌ききれず、ローリングアップデートも十分に柔軟ではなく、自動スケーリングもなく、設定管理も不十分でした。チームは Kubernetes への移行を決めますが、Alice は K8s の Pod、デプロイ、Service の前で完全に途方に暮れていました。
(2) minikube でローカル学習するソリューション
Bob は Alice のラップトップに minikube を使って K8s 開発環境をセットアップしました。
BASH
# ローカル K8s クラスターを起動
minikube start --driver=docker
# アプリケーションをデプロイ
kubectl create deployment nginx --image=nginx:1.25-alpine --replicas=3
kubectl expose deployment nginx --port=80 --type=NodePort
(3) 効果: 5 分で K8s のコアコンセプトを理解
Alice は K8s の Pod と Docker コンテナには多くの類似点があることを発見しました。デプロイ は Compose の replicas に対応し、Service は Docker のネットワークとポートマッピングに対応します。
3. K8s のコアアーキテクチャ
(1) アーキテクチャ概要
graph TB
K["kubectl CLI"] --> API["API Server<br/>REST API エントリ"]
API --> SCHED["Scheduler<br/>Pod スケジューリング"]
API --> ETCD["etcd<br/>クラスター状態ストア"]
API --> CTRL["Controller Manager<br/>Deployment / ReplicaSet"]
API --> KUBELET["Kubelet<br/>ノードエージェント"]
KUBELET --> CRI["コンテナランタイム<br/>containerd / Docker"]
CRI --> POD["Pod<br/>コンテナグループ"]
(2) K8s コアコンポーネント
| コンポーネント | 機能 | Docker との対比 |
|---|---|---|
| API Server | クラスター API エントリポイント | Docker デーモン API |
| etcd | 状態ストア | Docker の内部状態 |
| Scheduler | Pod スケジューリング | Swarm スケジューラ |
| Kubelet | ノードエージェント | Docker デーモン (単一ノード) |
| Kube-proxy | ネットワークプロキシ | Docker ルーティングメッシュ |
4. K8s のコアコンセプト
(1) Pod / デプロイ / Service
| K8s コンセプト | 目的 | Docker との対比 |
|---|---|---|
| Pod | 最小スケジューリング単位 (1 つ以上のコンテナ) | コンテナ (ただし複数を含むこともある) |
| デプロイ | 宣言的なレプリカ管理 | Compose replicas + 再起動 |
| Service | 安定したネットワーク識別子 + 負荷分散 | Docker DNS + ルーティングメッシュ |
| Ingress | HTTP Ingress ルート | Nginx リバースプロキシ |
| ConfigMap | 設定管理 | 環境変数 / env_file |
| Secret | 機密情報 | Docker Secret |
| PV / PVC | 永続ストレージ | 名前付きボリューム |
(2) Docker Compose → K8s コンセプトマップ
| Docker Compose | Kubernetes | 説明 |
|---|---|---|
service |
Deployment + Service |
サービス定義 |
replicas |
Deployment.spec.replicas |
コピー数 |
ports |
Service.spec.ports |
ポートマッピング |
volumes |
PV + PVC |
永続ストレージ |
environment |
ConfigMap + Secret |
設定管理 |
depends_on |
initContainers / 順次起動 |
依存関係制御 |
healthcheck |
livenessProbe + readinessProbe |
ヘルスチェック |
5. よく使う kubectl コマンド
▶ サンプル: minikube でクラスターを起動 (難易度: ⭐⭐)
BASH
# ローカル K8s クラスターを起動
minikube start --driver=docker --kubernetes-version=v1.28.0
# クラスターの状態を確認
kubectl cluster-info
kubectl get nodes
💻 出力:
TEXT
📖 参照専用
Kubernetes control plane is running at https://127.0.0.1:32768
CoreDNS is running at https://127.0.0.1:32768/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 60s v1.28.0
▶ サンプル: kubectl create deployment (難易度 ⭐⭐)
BASH
# 3 レプリカで Deployment を作成
kubectl create deployment nginx --image=nginx:1.25-alpine --replicas=3
# Deployment の状態を確認
kubectl get deployments
kubectl get pods
💻 出力:
TEXT
📖 参照専用
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 3/3 3 3 30s
NAME READY STATUS RESTARTS AGE
nginx-6c8b5f4d8f-abc12 1/1 Running 0 30s
nginx-6c8b5f4d8f-def34 1/1 Running 0 30s
nginx-6c8b5f4d8f-ghi56 1/1 Running 0 30s
▶ サンプル: kubectl expose service (難易度 ⭐⭐)
BASH
# Deployment を Service として公開
kubectl expose deployment nginx --port=80 --type=NodePort
# Service の URL を取得
minikube service nginx --url
# またはポートフォワードを使ってローカルアクセス
kubectl port-forward svc/nginx 8080:80
▶ サンプル: kubectl scale でスケーリング (難易度: ⭐⭐)
BASH
# 5 レプリカにスケール
kubectl scale deployment nginx --replicas=5
# 確認
kubectl get pods
▶ サンプル: kubectl rollout (難易度: ⭐⭐⭐)
BASH
# イメージを更新
kubectl set image deployment/nginx nginx=nginx:1.26-alpine
# ローリングアップデートの状態を確認
kubectl rollout status deployment/nginx
# 問題が発生した場合はロールバック
kubectl rollout undo deployment/nginx
# ローリングアップデートの履歴を表示
kubectl rollout history deployment/nginx
6. YAML 宣言的設定
(1) デプロイ + Service YAML
YAML
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
resources:
limits:
cpu: "0.5"
memory: "128Mi"
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: NodePort
BASH
# YAML を適用
kubectl apply -f nginx-deployment.yaml
# 確認
kubectl get all
7. 単一ノード vs マルチノード K8s
| ディメンション | minikube | kind | 本番クラスター |
|---|---|---|---|
| ノード数 | 1 | 1 以上 | 3 以上 |
| 目的 | 学習 / 開発 | CI テスト | 本番 |
| インストール | minikube start | kind create クラスタ | kubeadm / クラウドサービス |
| 高可用性 | ❌ | ❌ | ✅ |
| 自動スケーリング | ❌ | ❌ | ✅ (HPA) |
8. 完全なサンプル: minikube でアプリケーションをデプロイ
BASH
# ============================================
# 完全な手順: minikube 上の K8s
# カバー範囲: クラスター、デプロイ、サービス、スケール、更新
# ============================================
# 1. minikube クラスターを起動
minikube start --driver=docker
# 2. Deployment を作成
kubectl create deployment web --image=nginx:1.25-alpine --replicas=2
# 3. Service として公開
kubectl expose deployment web --port=80 --type=NodePort
# 4. アプリケーションにアクセス
minikube service web --url
# または: kubectl port-forward svc/web 8080:80
# 5. 5 レプリカにスケール
kubectl scale deployment web --replicas=5
kubectl get pods -w
# 6. ローリングアップデート
kubectl set image deployment/web nginx=nginx:1.26-alpine
kubectl rollout status deployment/web
# 7. ロールバック
kubectl rollout undo deployment/web
# 8. クリーンアップ
kubectl delete deployment web
kubectl delete service web
minikube stop
❓ よくある質問
Q K8s と Docker Swarm のどちらを選ぶべきですか?
A Swarm はシンプルで学習しやすく、小規模チーム (20 人未満) と単純なユースケースに適しています。K8s は強力ですが複雑で、大規模チーム、自動スケーリングが必要なシナリオ、堅牢なエコシステムを必要とする場合に適しています。目安: 単一マシンで 3〜5 ノードの場合は Swarm、5 ノード以上または高度な機能が必要な場合は K8s。
Q Pod とコンテナの違いは何ですか?
A Pod は K8s における最小のスケジューリング単位で、1 つ以上のコンテナを含むことができます。Pod 内のコンテナはネットワークとストレージを共有します。多くの Pod は 1 つのコンテナだけを含み、この場合 Pod はコンテナとほぼ等価です。複数コンテナ Pod は、密結合なシナリオ (アプリとサイドカープロキシなど) で使用されます。
Q K8s には何台のサーバーが必要ですか?
A 学習用: 1 台 (Minikube)。開発用: 1〜3 台。本番用: マスターノード 3 台以上 + ワーカーノード N 台。クラウドプロバイダーのマネージド K8s サービス (EKS / GKE / AKS) を使う場合、マスターノードを管理する必要はなく、ワーカーノード 1 台でも十分です。
Q Compose から直接 K8s を学ぶべきですか?
A まず Docker + Compose (本コースのレッスン 1〜22) をマスタしてから K8s に進むことをおすすめします。Compose はユースケースの 80% をカバーし、クラスターが必要な場合にのみ K8s が必要です。いきなり K8s に飛び込むと概念に圧倒される可能性が高いので、まずコンテナとオーケストレーションの基礎を理解してから、K8s の抽象を学びましょう。
Q 学習には minikube と kind のどちらが良いですか?
A minikube のほうが機能が豊富で (Dashboard、アドオン、複数ドライバー)、初心者に向いています。kind (Kubernetes in Docker) はより軽量で起動が高速なため、CI やマルチクラスターテストに最適です。学習には minikube を推奨します。
📖 まとめ
- K8s コアアーキテクチャ: API Server + etcd + Scheduler + Kubelet + Kube-proxy
- Pod (最小スケジューリング単位) ≈ コンテナ、デプロイ (レプリカ管理) ≈ Compose replicas、Service (ネットワーク) ≈ Docker DNS
- kubectl は K8s の CLI であり、docker コマンドに相当する
- minikube: ワンコマンドでローカル K8s クラスターを起動 — 学習に最適
- K8s の宣言的 YAML 設定は Compose の
docker-compose.ymlに対応する - Docker から K8s への移行: Compose service → デプロイ + Service、Volume → PV / PVC、env → ConfigMap + Secret
📝 練習問題
- 基礎問題 (難易度: ⭐): minikube を使ってローカル K8s クラスターを起動し、Nginx インスタンスをデプロイ、ポートフォワードでアクセスしてください。
- 応用問題 (難易度 ⭐⭐): YAML ファイルを使って デプロイ と Service を作成し、
kubectl apply -fでデプロイ、ポートを公開してください。 - 挑戦問題 (難易度: ⭐⭐⭐): ローリングアップデート (nginx: 1.25 → 1.26) を実行し、
kubectl rollout statusを観察、その後kubectl rollout undoでロールバックしてください。