Dockerでコンテナ技術に慣れ親しんだ開発者なら、次に直面するのが「複数のコンテナをどう管理するか」という課題です。1つや2つのコンテナなら手動でも何とかなりますが、本格的なアプリケーションを運用するとなると話は別。そこで登場するのがKubernetes(k8s)です。
今回は、Dockerの基礎知識をお持ちの方に向けて、Kubernetesの世界への扉を開く実践的なガイドをお届けします。
なぜKubernetesが必要なのか?Dockerだけでは解決できない課題
Dockerを使ったコンテナ開発に慣れてくると、いくつかの壁にぶつかります。私自身、個人開発でDockerを使い始めた頃は、これらの課題に直面しました。
スケーリングの課題
アクセスが増えてサーバーが重くなったとき、Dockerだけなら手動でコンテナを増やすしかありません。しかし、手動スケーリングには限界があります:
- トラフィック急増時の対応が遅れる
- 深夜や休日の障害対応が困難
- リソース使用量の最適化が難しい
サービスディスカバリーとロードバランシング
複数のコンテナが動いているとき、それらをどう連携させるかが問題になります:
# 従来の方法:手動でIPアドレスを管理
docker run -d --name web1 -p 8080:80 nginx
docker run -d --name web2 -p 8081:80 nginx
docker run -d --name web3 -p 8082:80 nginx
この方式では、コンテナが停止・再起動するたびにIPアドレスが変わり、手動で設定を更新する必要があります。
ヘルスチェックと自動復旧
Dockerのコンテナが異常終了したとき、自動的に再起動する仕組みはありますが、アプリケーションレベルでの健康状態チェックは限定的です。

Kubernetesの基本概念:押さえておくべき6つの要素
Kubernetesは多くの概念で構成されていますが、まずは以下の6つを理解すれば基本的な運用が可能になります。
1. Pod(ポッド)
Kubernetesにおける最小のデプロイ単位です。通常は1つのコンテナを含みますが、密接に連携する複数のコンテナをまとめることもあります。
# Pod の YAML 定義例
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
重要な点は、Podは一時的な存在ということ。停止・削除されることを前提に設計されています。
2. Deployment(デプロイメント)
Podの管理とスケーリングを担当します。「nginxのPodを3つ動かしたい」「新しいバージョンにローリングアップデートしたい」といった要求を実現します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
3. Service(サービス)
Podへのアクセス方法を定義します。Podは一時的な存在のため、直接IPアドレスでアクセスするのではなく、Serviceを経由してアクセスします。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
4. Namespace(ネームスペース)
リソースを論理的に分離する仕組みです。開発環境、ステージング環境、本番環境を同じクラスター内で分けて管理できます。
5. ConfigMap と Secret
設定情報を管理するためのリソースです。ConfigMapは一般的な設定、Secretは機密情報(パスワード、APIキーなど)を扱います。
6. Ingress(イングレス)
外部からクラスターへのHTTP/HTTPSアクセスを制御します。ドメイン名によるルーティングやSSL終端などを設定できます。
ローカル環境でKubernetesを始める:minikubeとkindの比較
学習目的であれば、ローカル環境でKubernetesクラスターを構築するのが最適です。主な選択肢は以下の通りです。
minikube:最も一般的な選択肢
# minikubeのインストール(macOS)
brew install minikube
# クラスターの起動
minikube start
# 状態確認
minikube status
minikubeの特徴:
- GUI(ダッシュボード)が使える
- アドオンが豊富(ingress、metrics-server等)
- VMベースで動作するため、リソース消費が大きい
kind:軽量で高速
# kindのインストール(macOS)
brew install kind
# クラスターの作成
kind create cluster --name my-cluster
# 現在のコンテキスト確認
kubectl config current-context
kindの特徴:
- Dockerコンテナ内でKubernetesを実行
- 軽量で起動が高速
- CI/CDパイプラインでの利用に適している

実践例:簡単なWebアプリケーションのデプロイ
実際にKubernetesでアプリケーションをデプロイしてみましょう。今回は、nginxをベースにしたシンプルなWebアプリケーションを構築します。
Step 1: Deploymentの作成
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-deployment
labels:
app: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: nginx:1.20-alpine
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
# デプロイメントの適用
kubectl apply -f nginx-deployment.yaml
# 状態確認
kubectl get deployments
kubectl get pods
Step 2: Serviceの作成
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
selector:
app: webapp
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
# サービスの適用
kubectl apply -f nginx-service.yaml
# サービス確認
kubectl get services
# minikubeの場合、外部IPを取得
minikube service webapp-service --url
Step 3: 動作確認とスケーリング
# アプリケーションへのアクセス確認
curl $(minikube service webapp-service --url)
# レプリカ数の変更
kubectl scale deployment webapp-deployment --replicas=5
# ローリングアップデート
kubectl set image deployment/webapp-deployment webapp=nginx:1.21-alpine
# ロールアウト状況の確認
kubectl rollout status deployment/webapp-deployment
よくあるトラブルシューティング
Kubernetes初心者が遭遇しやすい問題と解決方法をまとめました。
1. Podが起動しない(ImagePullBackOff)
# エラーの詳細確認
kubectl describe pod [POD_NAME]
# よくある原因:
# - 存在しないイメージ名
# - プライベートレジストリの認証問題
# - タグの指定ミス
# 解決例
kubectl delete pod [POD_NAME]
# YAMLファイルでイメージ名を修正後
kubectl apply -f deployment.yaml
2. Serviceにアクセスできない
# サービスのエンドポイント確認
kubectl get endpoints
# セレクターとラベルの確認
kubectl get pods --show-labels
kubectl describe service [SERVICE_NAME]
# ポート転送でローカルテスト
kubectl port-forward service/webapp-service 8080:80
3. リソース不足エラー
# ノードのリソース使用状況確認
kubectl top nodes
kubectl top pods
# リソース制限の調整
kubectl patch deployment webapp-deployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"webapp","resources":{"requests":{"memory":"32Mi","cpu":"100m"}}}]}}}}'
4. 設定ファイルの構文エラー
# YAML構文チェック
kubectl apply --dry-run=client -f deployment.yaml
# 詳細なバリデーション
kubectl apply --validate=true -f deployment.yaml

本番環境への道筋:次に学ぶべきこと
ローカル環境でKubernetesの基本を理解したら、本番環境に向けて以下の分野を深めていきましょう。
1. クラスター構築・運用
- マネージドサービス: Amazon EKS、Google GKE、Azure AKS
- セルフマネージド: kubeadm、Rancher、OpenShift
- インフラ管理: Terraform、Ansible
2. セキュリティ
- RBAC(Role-Based Access Control): ユーザー・サービスアカウントの権限管理
- NetworkPolicy: ポッド間通信の制御
- Pod Security Standards: セキュアなコンテナ実行環境
3. モニタリング・ログ管理
- Prometheus + Grafana: メトリクス収集と可視化
- ELK Stack: ログ収集・検索・分析
- Jaeger: 分散トレーシング
4. CI/CD統合
- GitOps: ArgoCD、Flux
- パイプライン: Jenkins、GitLab CI、GitHub Actions
- イメージ管理: Harbor、AWS ECR
5. 高度なワークロード管理
- StatefulSet: データベースなどのステートフルなアプリケーション
- DaemonSet: 全ノードで動作するシステムコンポーネント
- Job/CronJob: バッチ処理・定期実行タスク
まとめ:Kubernetesマスターへの第一歩
Kubernetesは確かに複雑ですが、段階的に学習すれば必ず理解できます。重要なのは以下のポイントです:
- 基本概念の理解: Pod、Service、Deploymentから始める
- ハンズオン経験: ローカル環境で実際に動かしてみる
- トラブルシューティング: エラーを恐れず、ログを読む習慣を身につける
- 継続的な学習: Kubernetesは進化が速いため、最新情報をキャッチアップする
Docker経験者なら、コンテナの概念は既に理解されているはず。あとは「複数のコンテナをどう管理するか」という視点でKubernetesを学習すれば、きっと「なるほど!」という瞬間が訪れるでしょう。
次回は、より実践的な内容として「Kubernetesでマイクロサービス構成を構築する方法」について詳しく解説予定です。今回の基礎知識をベースに、実際のアプリケーション開発で役立つ情報をお届けしますので、ぜひご期待ください。
関連記事