メインコンテンツまでスキップ

StatefulSets

StatefulSetsは、安定したアイデンティティと永続ストレージを必要とするアプリケーションを管理します。Deploymentではポッドが交換可能であるのに対し、StatefulSet内の各ポッドは、そのライフサイクル全体を通じて一意で予測可能なアイデンティティを保持します。

ステートフルアプリケーションに対して、いくつかの重要な利点を提供します:

  • 安定したアイデンティティの提供 - ポッドは予測可能な名前を取得します(mysql-0、mysql-1、mysql-2)
  • 永続ストレージの有効化 - 各ポッドは独自の永続ボリュームを持つことができます
  • 順序付けられた操作の保証 - ポッドは順次作成および削除されます
  • 安定したネットワーキングの維持 - 各ポッドは同じネットワークアイデンティティを保持します
  • 順序付きのローリングアップデートのサポート - ポッドは一度に1つずつ更新されます

StatefulSetのデプロイ

Catalogサービス用のMySQLデータベースをデプロイしましょう:

以下のYAMLは、Catalogサービス用にMySQLを実行するStatefulSetを作成し、永続ストレージと予測可能なPod名を持ちます。

~/environment/eks-workshop/base-application/catalog/statefulset-mysql.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: catalog-mysql
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/team: database
spec:
replicas: 1
serviceName: catalog-mysql
selector:
matchLabels:
app.kubernetes.io/name: catalog
app.kubernetes.io/instance: catalog
app.kubernetes.io/component: mysql
template:
metadata:
labels:
app.kubernetes.io/name: catalog
app.kubernetes.io/instance: catalog
app.kubernetes.io/component: mysql
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/team: database
spec:
containers:
- name: mysql
image: "public.ecr.aws/docker/library/mysql:8.0"
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: my-secret-pw
- name: MYSQL_DATABASE
value: catalog
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: catalog-db
key: RETAIL_CATALOG_PERSISTENCE_USER
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: catalog-db
key: RETAIL_CATALOG_PERSISTENCE_PASSWORD
volumeMounts:
- name: data
mountPath: /var/lib/mysql
ports:
- name: mysql
containerPort: 3306
protocol: TCP
volumes:
- name: data
emptyDir: {}
A

kind: StatefulSet: StatefulSetコントローラーを作成します

B

metadata.name: StatefulSetの名前(catalog-mysql)

C

spec.serviceName: 安定したネットワークアイデンティティに必要(headless Serviceを作成します)

D

spec.replicas: 実行するポッドの数(この例では1)

データベースをデプロイします:

~$kubectl apply -k ~/environment/eks-workshop/base-application/catalog/

StatefulSetの確認

StatefulSetのステータスを確認します:

~$kubectl get statefulset -n catalog
NAME            READY   AGE
catalog-mysql   1/1     2m

作成されたポッドを表示します:

~$kubectl get pods -n catalog
NAME              READY   STATUS    RESTARTS   AGE
catalog-mysql-0   1/1     Running   0          2m

数字のサフィックスを持つ予測可能なポッド名に注目してください

StatefulSetの詳細情報を取得します:

~$kubectl describe statefulset -n catalog catalog-mysql

サフィックス(-0-1など)により、ストレージとネットワークの目的で各ポッドを個別に追跡できます。

StatefulSetのスケーリング

3つのレプリカにスケールアップします:

~$kubectl scale statefulset -n catalog catalog-mysql --replicas=3
~$kubectl get pods -n catalog
NAME              READY   STATUS    RESTARTS   AGE
catalog-mysql-0   1/1     Running   0          5m
catalog-mysql-1   0/1     Pending   0          10s
catalog-mysql-1   1/1     Running   0          30s
catalog-mysql-2   0/1     Pending   0          5s
catalog-mysql-2   1/1     Running   0          25s

ポッドが順番に1つずつ作成されるのがわかります

スケールダウンします:

~$kubectl scale statefulset -n catalog catalog-mysql --replicas=1

ポッドは逆順に削除されます(2、次に1、0を保持)、安定性を確保します。

Kubernetesはまた、スケールアップまたはスケールダウンした場合でも、各ポッドが永続ボリュームを保持することを保証します。

StatefulSets vs Deployments

機能StatefulSetDeployment
Pod名安定(mysql-0mysql-1)ランダム
ストレージポッドごとに永続通常は一時的
作成/削除順序付き任意の順序
ネットワークアイデンティティ安定動的
ユースケースデータベース、メッセージキューステートレスアプリ
備考

StatefulSetは、永続的なアイデンティティ、安定したネットワーキング、順序付けられた操作を必要とするアプリケーションに最適です。

覚えておくべきポイント

  • StatefulSetは各ポッドに安定した一意のアイデンティティを提供します
  • データベース、メッセージキュー、クラスター化されたアプリケーションに最適です
  • 各ポッドは再起動後も存続する独自の永続ストレージを持つことができます
  • 操作は順序通りに行われます - 作成(0→1→2)と削除(2→1→0)
  • ポッド名は予測可能で変更されません
  • アプリケーションがアイデンティティ、安定性、永続性を必要とする場合は常にStatefulSetを使用してください。