Chuyển đến nội dung chính

レッスン4: Deployments、DaemonSets & StatefulSets

Deployment戦略(RollingUpdate/Recreate)。DaemonSetのユースケース。 StatefulSetと安定したネットワークID。CKA試験でのワークロード管理。

Deployment、DaemonSet、StatefulSetの比較

1. Deploymentの詳細

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1         # ローリング中に追加できるPod数
      maxUnavailable: 0   # ローリング中に利用不可になれるPod数
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
戦略動作ダウンタイム
RollingUpdate新旧Podを段階的に入れ替えなし(ゼロダウンタイム)
Recreate全Pod停止 → 新Pod起動あり(デプロイメント間にダウンタイム)
# ロールバック
kubectl rollout undo deployment/web-app
kubectl rollout undo deployment/web-app --to-revision=2

# ロールアウト履歴
kubectl rollout history deployment/web-app
kubectl rollout status deployment/web-app

2. DaemonSet

DaemonSetは各ノードに1つのPodを配置することを保証します。

ユースケース例
ログ収集fluentd、filebeat
監視エージェントPrometheus node exporter、Datadog
ネットワーキングkube-proxy、Calico、Cilium
ストレージCSI node driver
# DaemonSetの作成(直接コマンドなし — YAMLが必要)
# ヒント: Deploymentから変換
kubectl create deployment ds-template --image=fluentd --dry-run=client -o yaml > ds.yaml
# kind: DaemonSetに変更、replicas削除、strategyを削除

3. StatefulSet

StatefulSet vs Deployment:
  - 安定したネットワークID: pod-0, pod-1, pod-2(Deploymentはランダムな接尾辞)
  - 順序付きデプロイ: 0 → 1 → 2の順で起動
  - 安定した永続ストレージ: 各PodにPVCが割り当て
  - Headless Service必須

ユースケース: データベース、分散システム(MySQL、Redis Cluster、Kafka)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql-headless  # Headless Service名
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi

4. チートシート

タスクコマンド
Deployment作成kubectl create deploy NAME --image=IMG --replicas=N
イメージ更新kubectl set image deploy/NAME CONTAINER=IMAGE:TAG
ロールバックkubectl rollout undo deploy/NAME
DaemonSet確認kubectl get daemonset -A
StatefulSet確認kubectl get statefulset

5. 練習問題

Q1:Deploymentのstrategy type: Recreateを使用する場合、デプロイメント中に何が起きますか?

  • A) 新旧Podが同時に実行される
  • B) 全ての旧Podが停止してから新Podが起動する — ダウンタイムが発生 ✓
  • C) 1つのPodずつ順次更新される
  • D) トラフィックが自動的に新Podにルーティングされる

解説:Recreate戦略は全ての旧Podを停止してから新Podを起動します。RollingUpdateではゼロダウンタイムで更新できますが、アプリケーションが旧新バージョンの同時実行をサポートしない場合はRecreateを使用します。

Q2:DaemonSetのPodはどのようにスケジューリングされますか?

  • A) kube-schedulerがノードを選択する
  • B) DaemonSetコントローラーが各ノードに1つのPodを自動配置する ✓
  • C) ユーザーが手動でnodeSelectorを設定する必要がある
  • D) ランダムなノードに配置される

解説:DaemonSetコントローラーが各ノードに1つのPodを自動配置します。新しいノードが追加されると、自動的にPodが作成されます。tolerationを使用してコントロールプレーンノードにも配置できます。

Q3:StatefulSetでserviceNameフィールドが必要な理由は?

  • A) ロードバランシングのため
  • B) 各PodにDNSレコード(pod-0.serviceName)を提供するHeadless Serviceが必要なため ✓
  • C) 自動スケーリングを有効にするため
  • D) ストレージプロビジョニングのため

解説:StatefulSetの各Podは安定したDNS名を持ちます(例: mysql-0.mysql-headless.namespace.svc.cluster.local)。これにはHeadless Service(clusterIP: None)が必要です。serviceName はこのHeadless Serviceを参照します。