ワークロード

アプリケーションを実行するリソース

Pod と Controller の関係

Pod は K8s の最小デプロイ単位ですが、直接作成することはほぼありません。 Controller(Deployment 等)が Pod を自動作成・管理します。

┌─────────────────────────────────────────────────────────────────┐
│                     Controller が Pod を管理                     │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────┐      ┌─────────────┐      ┌─────────────┐      │
│  │ Deployment  │      │ StatefulSet │      │  DaemonSet  │      │
│  └──────┬──────┘      └──────┬──────┘      └──────┬──────┘      │
│         │                    │                    │             │
│         │ 作成               │ 作成               │ 作成        │
│         ▼                    ▼                    ▼             │
│  ┌─────────────┐      ┌─────────────┐      ┌─────────────┐      │
│  │ ReplicaSet  │      │    Pod      │      │    Pod      │      │
│  └──────┬──────┘      │  (順序付き)  │      │ (各ノード)   │      │
│         │             └─────────────┘      └─────────────┘      │
│         │ 作成                                                  │
│         ▼                                                       │
│  ┌─────────────┐                                                │
│  │    Pod      │  ← 実際にコンテナが動く単位                     │
│  │ (複数個)    │                                                │
│  └─────────────┘                                                │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

直接 Pod を作成した場合:
  ✗ Pod が死んでも復活しない
  ✗ スケーリングできない
  ✗ ローリングアップデートできない

Controller 経由の場合:
  ✓ 自動復旧(Self-healing)
  ✓ replicas でスケーリング
  ✓ 無停止デプロイ

Deployment(最も使用頻度が高い)

Deployment はステートレスアプリの標準的な管理方法。 ReplicaSet を通じて Pod を管理し、ローリングアップデート・ロールバックを提供。

deployment.yaml
yaml
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: nginx-deployment
5spec:
6 replicas: 3 # Pod を3つ維持
7 selector:
8 matchLabels:
9 app: nginx # 管理対象の Pod を Label で選択
10 strategy:
11 type: RollingUpdate
12 rollingUpdate:
13 maxSurge: 1 # 更新時に追加で作成する Pod 数
14 maxUnavailable: 0 # 更新時に停止可能な Pod 数
15
16 # ─────────────────────────────────────────────────
17 # ここから下が Pod Template(Pod の定義)
18 # ─────────────────────────────────────────────────
19 template:
20 metadata:
21 labels:
22 app: nginx # selector と一致させる
23 spec:
24 containers:
25 - name: nginx
26 image: nginx:1.25
27 ports:
28 - containerPort: 80
29 resources:
30 requests:
31 memory: "64Mi"
32 cpu: "250m"
33 limits:
34 memory: "128Mi"
35 cpu: "500m"

Deployment 操作コマンド

kubectl apply -f deployment.yaml - 適用
kubectl rollout status deployment/nginx - 状態確認
kubectl rollout undo deployment/nginx - ロールバック
kubectl scale deployment nginx --replicas=5 - スケール

StatefulSet

StatefulSetはステートフルアプリ用。 安定したネットワークID、永続ストレージ、順序付きデプロイを提供。

用途

DB、Kafka、ZooKeeper等

Pod名

固定: name-0, name-1, name-2

statefulset.yaml
yaml
1apiVersion: apps/v1
2kind: StatefulSet
3metadata:
4 name: postgres
5spec:
6 serviceName: "postgres"
7 replicas: 3
8 selector:
9 matchLabels:
10 app: postgres
11 template:
12 metadata:
13 labels:
14 app: postgres
15 spec:
16 containers:
17 - name: postgres
18 image: postgres:15
19 volumeMounts:
20 - name: data
21 mountPath: /var/lib/postgresql/data
22 volumeClaimTemplates:
23 - metadata:
24 name: data
25 spec:
26 accessModes: ["ReadWriteOnce"]
27 resources:
28 requests:
29 storage: 10Gi

DaemonSet

DaemonSetは全ノード(または選択したノード)で 1つずつPodを実行。ログ収集、監視エージェントに使用。

daemonset.yaml
yaml
1apiVersion: apps/v1
2kind: DaemonSet
3metadata:
4 name: fluentd
5spec:
6 selector:
7 matchLabels:
8 name: fluentd
9 template:
10 metadata:
11 labels:
12 name: fluentd
13 spec:
14 containers:
15 - name: fluentd
16 image: fluentd:latest
17 volumeMounts:
18 - name: varlog
19 mountPath: /var/log
20 volumes:
21 - name: varlog
22 hostPath:
23 path: /var/log

Job / CronJob

Job

一度きりのタスク実行。完了まで再試行。バッチ処理向け。

CronJob

定期実行のJob。cron形式でスケジュール指定。

cronjob.yaml
yaml
1apiVersion: batch/v1
2kind: CronJob
3metadata:
4 name: backup
5spec:
6 schedule: "0 2 * * *" # 毎日2時
7 jobTemplate:
8 spec:
9 template:
10 spec:
11 containers:
12 - name: backup
13 image: backup-tool:latest
14 command: ["/bin/sh", "-c", "backup.sh"]
15 restartPolicy: OnFailure

SRE/インフラ観点

ワークロード選択の指針

  • Webアプリ: Deployment
  • DB: StatefulSet(またはOperator)
  • ログ/監視: DaemonSet
  • バッチ: Job / CronJob

運用のポイント

  • • 必ず resources.requests/limits を設定
  • • Podを直接作成せず、コントローラ経由で管理
  • • ローリングアップデート戦略を検討