Docker: Kubernetes の基礎

最終更新:2026-08-26

⚠️ 推奨される前提条件: 以下のような状況に該当する場合にのみ、このレッスンを進めてください。

  • 単一の Docker インスタンスではもはやトラフィックを捌ききれない
  • 自動スケーリング、セルフヒーリング、マルチノードの高可用性が必要
  • チームが K8s への移行を決定した

もし Docker + Compose でプロジェクトに十分であれば、このレッスンをスキップしてレッスン 24 に進みましょう

1. 学べること



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) アーキテクチャ概要

100%
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 を推奨します。

📖 まとめ


📝 練習問題

  1. 基礎問題 (難易度: ⭐): minikube を使ってローカル K8s クラスターを起動し、Nginx インスタンスをデプロイ、ポートフォワードでアクセスしてください。
  2. 応用問題 (難易度 ⭐⭐): YAML ファイルを使って デプロイ と Service を作成し、kubectl apply -f でデプロイ、ポートを公開してください。
  3. 挑戦問題 (難易度: ⭐⭐⭐): ローリングアップデート (nginx: 1.25 → 1.26) を実行し、kubectl rollout status を観察、その後 kubectl rollout undo でロールバックしてください。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%