Kubernetes入門!
コンテナオーケストレーションの基本
Kubernetesで複数のコンテナを効率的に管理・運用する方法を基礎から解説します。
こんな人向けの記事です
- Dockerの次のステップとしてKubernetesを学びたい人
- コンテナの自動スケーリングに興味がある人
- Pod、Service、Deploymentの概念を理解したい人
Step 1Kubernetesとは
Kubernetes(K8s)は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するプラットフォームです。
Kubernetesの特徴
# Kubernetesが解決する問題
# 1. 自動スケーリング: 負荷に応じてコンテナ数を自動調整
# 2. 自己修復: コンテナが落ちたら自動で再起動
# 3. ローリングアップデート: ダウンタイムなしでデプロイ
# 4. サービスディスカバリ: コンテナ間の通信を自動管理
# 5. 負荷分散: リクエストを複数コンテナに分配
# ローカル環境の構築
# minikubeを使用(シングルノードのK8sクラスタ)
brew install minikube # macOS
minikube start # クラスタ起動
kubectl get nodes # ノード確認Docker ComposeとK8sの違い
Docker Composeは単一マシンでの開発向け。K8sは複数マシンでの本番運用向けです。Step 2主要コンポーネント
K8sアーキテクチャ
# === コントロールプレーン ===
# kube-apiserver: K8s APIの入り口
# etcd: 設定データの保存
# kube-scheduler: Podの配置先を決定
# kube-controller-manager: 状態の管理
# === ワーカーノード ===
# kubelet: Podの実行管理
# kube-proxy: ネットワークルーティング
# Container Runtime: コンテナの実行(containerd等)
# === 主要リソース ===
# Pod: 最小デプロイ単位(1つ以上のコンテナ)
# Deployment: Podの管理・スケーリング
# Service: Podへのネットワークアクセス
# ConfigMap: 設定データ
# Secret: 機密データ
# Ingress: 外部からのHTTPルーティング
# kubectlで操作
kubectl get pods # Pod一覧
kubectl get deployments # Deployment一覧
kubectl get services # Service一覧Step 3Pod(ポッド)
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
app: my-app
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"ターミナル
# Podの作成
kubectl apply -f pod.yaml
# Pod一覧
kubectl get pods
# Podの詳細
kubectl describe pod my-app
# Podのログ
kubectl logs my-app
# Pod内でコマンド実行
kubectl exec -it my-app -- /bin/sh
# Pod削除
kubectl delete pod my-appPodを直接作成しない
本番ではPodを直接作るのではなく、Deploymentを使います。DeploymentがPodの作成・管理を自動で行います。Step 4Deployment(デプロイメント)
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3 # Podを3つ起動
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: web
image: my-app:1.0.0
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: urlターミナル
# デプロイ
kubectl apply -f deployment.yaml
# スケーリング
kubectl scale deployment my-app --replicas=5
# ローリングアップデート
kubectl set image deployment/my-app web=my-app:2.0.0
# ロールバック
kubectl rollout undo deployment/my-app
# アップデート状況の確認
kubectl rollout status deployment/my-appStep 5Service(サービス)
service.yaml
# ClusterIP(クラスタ内部のみ)
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8000
type: ClusterIP
---
# NodePort(外部からアクセス可能)
apiVersion: v1
kind: Service
metadata:
name: my-app-nodeport
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8000
nodePort: 30080 # 30000-32767の範囲
type: NodePort
---
# LoadBalancer(クラウド環境のLB)
apiVersion: v1
kind: Service
metadata:
name: my-app-lb
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8000
type: LoadBalancerStep 6実践:アプリのデプロイ
ターミナル(一連のデプロイ手順)
# 1. Dockerイメージをビルド
docker build -t my-app:1.0.0 .
# 2. minikubeにイメージをロード
minikube image load my-app:1.0.0
# 3. Secretの作成
kubectl create secret generic db-secret --from-literal=url="postgresql://user:pass@db:5432/mydb"
# 4. Deployment と Service をデプロイ
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
# 5. 状態確認
kubectl get all
# 6. minikubeでアクセス
minikube service my-app-nodeport --url
# → http://192.168.49.2:30080
# 7. オートスケーリングの設定
kubectl autoscale deployment my-app --min=2 --max=10 --cpu-percent=80次のステップ
Ingress(HTTPルーティング)、ConfigMap、PersistentVolume、Helmチャートを学ぶと、本格的な運用が可能になります。まとめ
- K8sはコンテナの自動スケーリング・自己修復を提供
- Podは最小単位、DeploymentでPodを管理
- ServiceでPodへのネットワークアクセスを定義
- ローリングアップデートでダウンタイムゼロのデプロイ
- minikubeでローカル学習環境を構築