ワークロード
アプリケーションを実行するリソース
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
1 apiVersion: apps/v1 2 kind: Deployment 3 metadata: 4 name: nginx-deployment 5 spec: 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
1 apiVersion: apps/v1 2 kind: StatefulSet 3 metadata: 4 name: postgres 5 spec: 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
1 apiVersion: apps/v1 2 kind: DaemonSet 3 metadata: 4 name: fluentd 5 spec: 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
1 apiVersion: batch/v1 2 kind: CronJob 3 metadata: 4 name: backup 5 spec: 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を直接作成せず、コントローラ経由で管理
- • ローリングアップデート戦略を検討