ワークロード

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

Pod

PodはK8sの最小デプロイ単位。1つ以上のコンテナを含み、 ストレージとネットワークを共有します。通常は1Pod=1コンテナ。

pod.yaml
yaml
1apiVersion: v1
2kind: Pod
3metadata:
4 name: nginx-pod
5 labels:
6 app: nginx
7spec:
8 containers:
9 - name: nginx
10 image: nginx:1.25
11 ports:
12 - containerPort: 80
13 resources:
14 requests:
15 memory: "64Mi"
16 cpu: "250m"
17 limits:
18 memory: "128Mi"
19 cpu: "500m"

Deployment

Deploymentはステートレスアプリの管理。 ReplicaSetを管理し、ローリングアップデート、ロールバックを提供。

deployment.yaml
yaml
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: nginx-deployment
5spec:
6 replicas: 3
7 selector:
8 matchLabels:
9 app: nginx
10 strategy:
11 type: RollingUpdate
12 rollingUpdate:
13 maxSurge: 1
14 maxUnavailable: 0
15 template:
16 metadata:
17 labels:
18 app: nginx
19 spec:
20 containers:
21 - name: nginx
22 image: nginx:1.25
23 ports:
24 - containerPort: 80
1# デプロイ操作
2kubectl apply -f deployment.yaml
3kubectl rollout status deployment/nginx-deployment
4kubectl rollout history deployment/nginx-deployment
5kubectl rollout undo deployment/nginx-deployment
6kubectl scale deployment nginx-deployment --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を直接作成せず、コントローラ経由で管理
  • • ローリングアップデート戦略を検討