StatefulSet with EBS Volume
StatefulSetsとDynamic Volume Provisioningを理解したので、Catalogマイクロサービスの MySQL DBを変更して、データベースファイルを永続的に保存するための新しいEBSボリュームをプロビジョニングしましょう。

Kustomizeを使用して、次の2つのことを行います:
- catalogコンポーネントで使用されるMySQLデータベース用のEBSボリュームを使用する新しいStatefulSetを作成する
catalogコンポーネントを更新して、このデータベースの新しいバージョンを使用する
なぜ既存のStatefulSetを更新しないのですか?更新する必要のあるフィールドは変更不可であり、変更できないためです。
こちらが新しいcatalogデータベースStatefulSetです:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: catalog-mysql-ebs
namespace: catalog
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/team: database
spec:
replicas: 1
serviceName: catalog-mysql-ebs
selector:
matchLabels:
app.kubernetes.io/name: catalog
app.kubernetes.io/instance: catalog
app.kubernetes.io/component: mysql-ebs
template:
metadata:
labels:
app.kubernetes.io/name: catalog
app.kubernetes.io/instance: catalog
app.kubernetes.io/component: mysql-ebs
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: {}
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: ebs-csi-default-sc
resources:
requests:
storage: 30Gi
volumeClaimTemplatesフィールドは、新しいEBSボリューム、PersistentVolume (PV)、およびPersistentVolumeClaim (PVC)をすべて自動的に作成するためにDynamic Volume Provisioningを利用するようKubernetesに指示します。
storageClassNameをデフォルトのストレージクラスの名前であるebs-csi-default-scとして指定します
30GBのEBSボリュームをリクエストしています
これが、新しいStatefulSetを使用するようにcatalogコンポーネント自体を再設定する方法です:
- Kustomize Patch
- ConfigMap/catalog
- Diff
apiVersion: v1
kind: ConfigMap
metadata:
name: catalog
data:
RETAIL_CATALOG_PERSISTENCE_ENDPOINT: catalog-mysql-ebs:3306
apiVersion: v1
data:
RETAIL_CATALOG_PERSISTENCE_DB_NAME: catalog
RETAIL_CATALOG_PERSISTENCE_ENDPOINT: catalog-mysql-ebs:3306
RETAIL_CATALOG_PERSISTENCE_PROVIDER: mysql
kind: ConfigMap
metadata:
name: catalog
namespace: catalog
apiVersion: v1
data:
RETAIL_CATALOG_PERSISTENCE_DB_NAME: catalog
- RETAIL_CATALOG_PERSISTENCE_ENDPOINT: catalog-mysql:3306
+ RETAIL_CATALOG_PERSISTENCE_ENDPOINT: catalog-mysql-ebs:3306
RETAIL_CATALOG_PERSISTENCE_PROVIDER: mysql
kind: ConfigMap
metadata:
name: catalog
変更を適用し、新しいPodがロールアウトされるのを待ちます:
新しくデプロイされたStatefulSetが実行されていることを確認しましょう:
NAME READY AGE
catalog-mysql-ebs 1/1 79s
catalog-mysql-ebs StatefulSetを調査すると、30GiBのPersistentVolumeClaimがstorageClassNameとしてebs-csi-driverで接続されていることがわかります。
[
{"apiVersion": "v1",
"kind": "PersistentVolumeClaim",
"metadata": {"creationTimestamp": null,
"name": "data"
},
"spec": {"accessModes": [
"ReadWriteOnce"
],
"resources": { "requests": {"storage": "30Gi"
}
},
"storageClassName": "ebs-csi-default-sc",
"volumeMode": "Filesystem"
},
"status": {"phase": "Pending"
}
}
]
Dynamic Volume ProvisioningがPersistentVolume(PV)を自動的に作成した方法を分析できます:
pvc-1df77afa-10c8-4296-aa3e-cf2aabd93365 30Gi RWO Delete Bound catalog/data-catalog-mysql-ebs-0 gp2 10m
AWS CLIを使用して、自動的に作成されたAmazon EBSボリュームを確認できます:
AWSコンソールで確認することもでき ます。キーkubernetes.io/created-for/pvc/nameと値data-catalog-mysql-ebs-0のタグを持つEBSボリュームを探します:

コンテナのシェルを検査して、LinuxOSに接続された新しいEBSボリュームを確認したい場合は、次の手順を実行してcatalog-mysql-ebsコンテナにシェルコマンドを実行してください。マウントされているファイルシステムを検査します:
Filesystem Size Used Avail Use% Mounted on
overlay 100G 7.6G 93G 8% /
tmpfs 64M 0 64M 0% /dev
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/nvme0n1p1 100G 7.6G 93G 8% /etc/hosts
shm 64M 0 64M 0% /dev/shm
/dev/nvme1n1 30G 211M 30G 1% /var/lib/mysql
tmpfs 7.0G 12K 7.0G 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 3.8G 0 3.8G 0% /proc/acpi
tmpfs 3.8G 0 3.8G 0% /sys/firmware
/var/lib/mysqlにマウントされている現在のディスクを確認してください。これは、永続的に保存されているステートフルなMySQLデータベースファイル用のEBSボリュームです。
それでは、データが実際に永続的かどうかをテストしましょう。このモジュールの最初のセクションで行ったのと同じように、同じtest.txtファイルを作成します:
次に、test.txtファイルが/var/lib/mysqlディレクトリに作成されたことを確認します:
-rw-r--r-- 1 root root 4 Oct 18 13:57 test.txt
では、現在のcatalog-mysql-ebs Podを削除しましょう。これにより、StatefulSetコントローラーが自動的にPodを再作成します:
pod "catalog-mysql-ebs-0" deleted
数秒待ってから、次のコマンドを実行してcatalog-mysql-ebs Podが再作成されたことを確認します:
pod/catalog-mysql-ebs-0 condition met
NAME READY STATUS RESTARTS AGE
catalog-mysql-ebs-0 1/1 Running 0 29s
最後に、MySQLコンテナのシェルに戻り、/var/lib/mysqlパスでlsコマンドを実行して、作成したtest.txtファイルを探し、ファイルが保持されているかどうかを確認します:
-rw-r--r-- 1 mysql root 4 Oct 18 13:57 test.txt
123
ご覧のように、Podが削除され再起動された後も、test.txtファイルは引き続き使用可能で、正しいテキスト123が含まれています。これはPersistent Volumes(PV)の主要な機能です。Amazon EBSはデータを保存し、AWS可用性ゾーン内でデータを安全かつ利用可能な状態に保ちます。