実践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

🔗 次のステップ