実践LESSON 07
この教材で学ぶこと Pod・Service・Deploymentを使ってアプリを運用します。Kubernetes 基礎 — コンテナオーケストレーション
前提知識: Dockerの基本。本教材ではKubernetesの概念とマニフェスト設計を扱います。
1. なぜ Kubernetes が必要か
Docker だけでは以下が難しい:
| 課題 | Kubernetes の解決策 |
|---|---|
| コンテナが落ちた時の自動再起動 | Pod の自己修復(Desired State) |
| 複数ホストへのデプロイ・分散 | Node クラスター管理 |
| ローリングアップデート | Deployment の更新戦略 |
| ヘルスチェックによる切り離し | Readiness/Liveness Probe |
| サービス間の名前解決 | Service + CoreDNS |
| シークレット管理 | Secret リソース |
2. アーキテクチャ
Control Plane (Master)
┌────────────────────────────────────────┐
│ kube-apiserver ← kubectl が叩くAPI │
│ etcd ← 全状態を保存(KVS) │
│ kube-scheduler ← PodをどのNodeに配置 │
│ controller-manager ← Desired State管理│
└────────────────────────────────────────┘
↕ API通信
Worker Node(s)
┌─────────────────────────────────┐
│ kubelet ← PodをNodeで管理 │
│ kube-proxy← ネットワークルール │
│ Container Runtime(containerd)│
│ ┌────────┐ ┌────────┐ │
│ │ Pod │ │ Pod │ │
│ │[cont.] │ │[cont.] │ │
│ └────────┘ └────────┘ │
└─────────────────────────────────┘
3. 主要リソースとマニフェスト
Pod — 最小デプロイ単位
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
app: myapp
env: production
spec:
containers:
- name: myapp
image: myapp:1.2.3
ports:
- containerPort: 8080
resources:
requests: # スケジューリングに使う(最低保証)
cpu: "100m" # 0.1 CPU
memory: "128Mi"
limits: # 超えたらOOM Kill / CPU throttle
cpu: "500m"
memory: "512Mi"
env:
- name: DB_HOST
valueFrom:
secretKeyRef: # Secret から取得
name: db-secret
key: host
livenessProbe: # 死活確認(失敗→再起動)
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe: # 疎通確認(失敗→Serviceから切り離す)
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
Deployment — Pod の管理
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 余分に起動できる数
maxUnavailable: 0 # 停止できる数(0=無停止デプロイ)
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.2.3
# ... (Pod specと同じ)
Service — Pod への安定したアクセス
# ClusterIP: クラスター内部のみ
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
selector:
app: myapp # このラベルを持つPodにルーティング
ports:
- port: 80 # Serviceのポート
targetPort: 8080 # PodのContainerPort
type: ClusterIP
---
# LoadBalancer: 外部公開(AWSではNLBが作成される)
spec:
type: LoadBalancer
# EKSの場合はアノテーションでNLB/ALBを制御
ConfigMap / Secret
# ConfigMap — 設定値
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: "INFO"
MAX_CONNECTIONS: "100"
config.yaml: |
server:
port: 8080
timeout: 30s
---
# Secret — 機密情報(Base64エンコード)
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
stringData: # stringData はBase64不要
host: "mydb.example.com"
password: "supersecret"
4. kubectl 実践コマンド
# リソース確認
kubectl get pods -n production -o wide # 詳細(Node情報含む)
kubectl get all -n production # 全リソース
kubectl describe pod myapp-xxx -n production # 詳細イベント確認
# ログ確認
kubectl logs myapp-xxx -f # リアルタイム
kubectl logs myapp-xxx --previous # 前のコンテナのログ
kubectl logs -l app=myapp --tail=100 # ラベルで複数Pod
# デバッグ
kubectl exec -it myapp-xxx -- bash
kubectl port-forward pod/myapp-xxx 8080:8080 # ローカルからアクセス
# デプロイ
kubectl apply -f manifests/ # ディレクトリ一括適用
kubectl rollout status deployment/myapp # デプロイ進捗確認
kubectl rollout undo deployment/myapp # ロールバック
kubectl set image deployment/myapp myapp=myapp:1.2.4 # イメージ更新
# スケール
kubectl scale deployment myapp --replicas=5
# トラブルシューティング
kubectl get events --sort-by=.metadata.creationTimestamp -n production
kubectl top pods -n production # CPUとメモリ使用量
kubectl top nodes
5. Namespace — 環境分離
# 本番/ステージング/開発を Namespace で分離
kubectl create namespace production
kubectl create namespace staging
# 全 Namespace を横断して確認
kubectl get pods --all-namespaces
# デフォルト Namespace を変更(kubectx/kubens が便利)
kubectl config set-context --current --namespace=production
6. リソース設計の考え方
# HPA(Horizontal Pod Autoscaler)
# CPU使用率70%超で最大10Podまでスケールアウト
kubectl autoscale deployment myapp --cpu-percent=70 --min=3 --max=10
# PodDisruptionBudget(ノードメンテ時の最小起動数保証)
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: myapp-pdb
spec:
minAvailable: 2 # 常に2Pod以上を維持
selector:
matchLabels:
app: myapp
🔗 次のステップ
- 02_K8sネットワークとIngress.md — Ingress・NetworkPolicy
- ../../03_Cloud/AWS/02_コンテナサービス.md — EKS(マネージドK8s)
- ../IaC/01_Terraform.md — K8sリソースをTerraformで管理