コンテナ技術を使い始めると、次に直面するのが「複数のコンテナをどう管理するか」という課題です。Kubernetes(クバネティス、通称K8s)は、この課題を解決するコンテナオーケストレーションプラットフォームとして、クラウドネイティブ時代の標準技術となっています。
この記事では、Kubernetesの基本概念から主要コンポーネントの役割、ローカル環境での始め方まで、初心者でも段階的に学べるよう解説します。
Kubernetesとは?なぜ必要なのか
Kubernetesは、Googleが社内で使っていたコンテナ管理システム「Borg」の経験を基に、2014年にオープンソースとして公開されたプラットフォームです。現在はCloud Native Computing Foundation(CNCF)が管理しています。
Dockerだけでは足りない理由
Dockerは個々のコンテナを作成・実行する優れたツールですが、本番環境では以下のような課題が生じます。
- スケーリング:アクセスが増えたときにコンテナの数を増やしたい
- 自動復旧:コンテナがクラッシュしたら自動で再起動したい
- ロードバランシング:複数のコンテナに均等にリクエストを分配したい
- ローリングアップデート:ダウンタイムなしでアプリを更新したい
- 設定管理:環境変数や機密情報を安全に管理したい
Kubernetesはこれらの課題をすべて解決する機能を持っており、コンテナ化されたアプリケーションの「運用自動化プラットフォーム」として機能します。
Kubernetesの全体像
Kubernetesのアーキテクチャは、大きくコントロールプレーンとワーカーノードに分かれます。
- コントロールプレーン:クラスタ全体を管理する頭脳。APIサーバー、スケジューラー、コントローラーマネージャー、etcdで構成
- ワーカーノード:実際にコンテナが動作するマシン。kubelet、kube-proxy、コンテナランタイムが動作
管理者やCI/CDツールはkubectlコマンドを通じてAPIサーバーに指示を出し、Kubernetesが自動的にその状態を実現・維持します。
核心となる概念:Pod・Service・Deployment
Kubernetesには多くのリソースタイプがありますが、まず理解すべきはPod、Service、Deploymentの3つです。
Pod:最小のデプロイ単位
Podは、Kubernetesにおける最小のデプロイ単位です。1つ以上のコンテナをまとめたグループで、同じネットワーク空間とストレージを共有します。
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
app: my-app
spec:
containers:
- name: app
image: my-app:1.0.0
ports:
- containerPort: 3000
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
ただし、Podを直接作成することは本番環境ではほとんどありません。代わりにDeploymentを使ってPodを管理します。
Deployment:Podの管理と更新
Deploymentは、指定した数のPodを維持し、ローリングアップデートやロールバックを管理するリソースです。
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 3 # 3つのPodを維持
selector:
matchLabels:
app: my-app
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 更新中に追加で起動するPodの数
maxUnavailable: 0 # 更新中に停止してよいPodの数
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: my-app:1.0.0
ports:
- containerPort: 3000
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 10
periodSeconds: 30
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
Deploymentが管理するPodの1つがクラッシュすると、Kubernetesは自動的に新しいPodを起動して、replicas: 3の状態を維持します。
Service:Podへのアクセスを提供する
Serviceは、複数のPodに対する安定したネットワークエンドポイントを提供します。Podは動的に作成・削除されますが、Serviceは固定のIPアドレスとDNS名を持ちます。
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
type: ClusterIP # クラスタ内部からのみアクセス可能
selector:
app: my-app # このラベルを持つPodにトラフィックを転送
ports:
- port: 80 # Serviceのポート
targetPort: 3000 # Podのポート
protocol: TCP
Serviceのタイプには主に以下の3種類があります。
- ClusterIP(デフォルト):クラスタ内部からのみアクセス可能
- NodePort:各ノードの特定ポートを通じて外部からアクセス可能
- LoadBalancer:クラウドプロバイダーのロードバランサーを自動作成
ローカル環境でKubernetesを始める
Kubernetesを学ぶには、ローカル環境でクラスタを構築するのが最も効率的です。いくつかのツールが利用可能です。
Minikubeのセットアップ
Minikubeは最も広く使われているローカルKubernetes環境です。
# macOS
brew install minikube
# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# クラスタの起動
minikube start --driver=docker --memory=4096 --cpus=2
# 状態確認
minikube status
# kubectlの設定確認
kubectl cluster-info
最初のアプリケーションをデプロイする
実際にアプリケーションをデプロイしてみましょう。
# Deploymentの作成
kubectl apply -f deployment.yaml
# Serviceの作成
kubectl apply -f service.yaml
# 状態確認
kubectl get pods
kubectl get deployments
kubectl get services
# 出力例
# NAME READY STATUS RESTARTS AGE
# my-app-6d7f8b9c4-abc12 1/1 Running 0 30s
# my-app-6d7f8b9c4-def34 1/1 Running 0 30s
# my-app-6d7f8b9c4-ghi56 1/1 Running 0 30s
# ローカルでServiceにアクセス(Minikubeの場合)
minikube service my-app-service --url
# ポートフォワードでアクセス
kubectl port-forward service/my-app-service 8080:80
# http://localhost:8080 でアクセス可能
設定管理:ConfigMapとSecret
アプリケーションの設定をコンテナイメージから分離し、環境ごとに切り替えられるようにするのがConfigMapとSecretです。
ConfigMap:一般的な設定情報
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
NODE_ENV: "production"
LOG_LEVEL: "info"
API_ENDPOINT: "https://api.example.com"
config.json: |
{
"maxRetries": 3,
"timeout": 30000
}
# Deploymentから参照
spec:
containers:
- name: app
image: my-app:1.0.0
envFrom:
- configMapRef:
name: app-config
# または個別に指定
env:
- name: NODE_ENV
valueFrom:
configMapKeyRef:
name: app-config
key: NODE_ENV
Secret:機密情報
# Secretの作成(コマンドライン)
kubectl create secret generic db-credentials \
--from-literal=username=admin \
--from-literal=password=my-secret-password
# YAMLで定義(値はBase64エンコード)
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
data:
username: YWRtaW4= # echo -n "admin" | base64
password: bXktc2VjcmV0LXBhc3N3b3Jk # echo -n "my-secret-password" | base64
# Deploymentから参照
spec:
containers:
- name: app
image: my-app:1.0.0
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-credentials
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: password
スケーリングとオートスケール
Kubernetesの大きな強みの一つが、負荷に応じたスケーリングです。手動スケーリングとオートスケーリングの両方をサポートしています。
手動スケーリング
# レプリカ数を5に変更
kubectl scale deployment my-app --replicas=5
# 確認
kubectl get pods
# 5つのPodが Running になる
Horizontal Pod Autoscaler(HPA)
# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
# HPAの適用と確認
kubectl apply -f hpa.yaml
kubectl get hpa
# 出力例
# NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
# my-app-hpa Deployment/my-app 45%/70% 2 10 3 5m
CPU使用率が70%を超えると自動的にPod数が増加し、下がると減少します。最小2台、最大10台の範囲でスケーリングが行われます。
ローリングアップデートとロールバック
アプリケーションの更新は、Kubernetesが最も威力を発揮する場面の一つです。ダウンタイムなしでのデプロイが標準で可能です。
ローリングアップデートの実行
# イメージのバージョンを更新
kubectl set image deployment/my-app app=my-app:2.0.0
# 更新の進行状況を監視
kubectl rollout status deployment/my-app
# 出力例
# Waiting for rollout to finish: 1 out of 3 new replicas have been updated...
# Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
# deployment "my-app" successfully rolled out
Kubernetesは新しいバージョンのPodを1つずつ起動し、readinessProbeが成功したら古いPodを1つ停止するという手順を繰り返します。
ロールバック
# 更新履歴の確認
kubectl rollout history deployment/my-app
# 出力例
# REVISION CHANGE-CAUSE
# 1
# 2
# 直前のバージョンにロールバック
kubectl rollout undo deployment/my-app
# 特定のリビジョンにロールバック
kubectl rollout undo deployment/my-app --to-revision=1
よく使うkubectlコマンド集
日常的に使うkubectlコマンドをまとめます。これらを覚えておけば、基本的な運用操作は一通り行えます。
リソースの確認
# すべてのリソースを確認
kubectl get all
# Podの詳細情報
kubectl describe pod my-app-6d7f8b9c4-abc12
# Podのログ確認
kubectl logs my-app-6d7f8b9c4-abc12
# ログをリアルタイムで監視
kubectl logs -f my-app-6d7f8b9c4-abc12
# 複数Podのログを同時に確認
kubectl logs -l app=my-app --all-containers=true
トラブルシューティング
# Pod内にシェルで入る
kubectl exec -it my-app-6d7f8b9c4-abc12 -- /bin/sh
# リソースの使用状況確認
kubectl top pods
kubectl top nodes
# イベントの確認
kubectl get events --sort-by='.lastTimestamp'
# YAMLでリソースの詳細を確認
kubectl get deployment my-app -o yaml
リソースの操作
# YAMLファイルからリソースを適用
kubectl apply -f deployment.yaml
# リソースの削除
kubectl delete -f deployment.yaml
kubectl delete pod my-app-6d7f8b9c4-abc12
# Namespaceの操作
kubectl create namespace staging
kubectl get pods -n staging
kubectl apply -f deployment.yaml -n staging
まとめ:Kubernetesを学ぶためのロードマップ
Kubernetesは機能が豊富で学習範囲が広いですが、段階的に学べば確実に身につけられます。以下のステップで進めることをおすすめします。
- ステップ1:Pod、Deployment、Serviceの3つを理解し、ローカルでアプリをデプロイできるようになる
- ステップ2:ConfigMap、Secret、Namespace の使い方を学ぶ
- ステップ3:HPAによるオートスケーリングとローリングアップデートを実践する
- ステップ4:Ingress、PersistentVolume、RBACなどの発展的な機能を学ぶ
- ステップ5:Helmチャートやkustomizeによる構成管理を導入する
まずはMinikubeでローカルクラスタを構築し、実際に手を動かしてデプロイやスケーリングを試してみてください。座学だけでは理解しにくい概念も、実際に操作することで腑に落ちるはずです。Kubernetesの習得は、クラウドネイティブ時代のエンジニアにとって大きな武器になるでしょう。
関連記事
AIエージェント開発入門|自律型AIの仕組みと構築方法を解説【2026年版】
AI駆動コーディングワークフロー|Claude Code・Cursor・Copilotの実践的使い分け
プロンプトエンジニアリング上級編|Chain-of-Thought・Few-Shot・ReActの実践
APIレート制限の設計と実装|トークンバケット・スライディングウィンドウ解説
APIバージョニング戦略|URL・ヘッダー・クエリパラメータの使い分け
BIツール入門|Metabase・Redash・Looker Studioでデータ可視化する方法
チャットボット開発入門|LINE Bot・Slack Botの構築方法と活用事例
CI/CDパイプラインの基礎|継続的インテグレーション・デリバリーの全体像