永続的な EBS ボリュームの使用
それでは、catalog MySQL データベースを更新して、永続的な EBS ストレージを使用するようにしましょう。EKS Auto Mode では、EBS CSI Driver がすでにインストールされ、AWS によって管理されています。
StorageClass の作成
StorageClass は、EKS Auto Mode が EBS ボリュームをプロビジョニングする方法を定義します。EKS Auto Mode には EBS CSI Driver が含まれていますが、ストレージ機能を使用するには、ebs.csi.eks.amazonaws.com を参照する StorageClass を作成する必要があります。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-sc
provisioner: ebs.csi.eks.amazonaws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
type: gp3
encrypted: "true"
provisioner: ebs.csi.eks.amazonaws.com - EKS Auto Mode の組み込み EBS CSI Driver を使用します
type: gp3 - EBS ボリュームタイプを指定します
StorageClass を適用します:
catalog MySQL データベースの更新
volumeClaimTemplates を含む多くの StatefulSet フィールドは変更できないため、新しいストレージ構成で catalog サービスを削除して再作成する必要があります。
まず、現在の catalog MySQL StatefulSet を削除します:
次に、永続的ストレージを有効にして再作成します。更新された StatefulSet には volumeClaimTemplates セクションが含まれています:
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
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: ebs-sc
resources:
requests:
storage: 30Gi
accessModes は ReadWriteOnce を指定し、ボリュームが単一のノードによってマウントされることを許可します
storageClassName は動的プロビジョニングのために ebs-sc StorageClass を指定します
30GB の EBS ボリュームをリクエストしています
構成を適用し、catalog Pod を再起動してデータベースの初期化を確実にします:
PersistentVolumeClaim の確認
再作成された catalog MySQL StatefulSet には、関連する PersistentVolumeClaim があります。
Name: catalog-mysql
Namespace: catalog
...
Containers:
mysql:
Image: public.ecr.aws/docker/library/mysql:8.0
Port: 3306/TCP
Mounts:
/var/lib/mysql from data (rw)
Volume Claims:
Name: data
StorageClass:
Labels: <none>
Annotations: <none>
Capacity: 30Gi
Access Modes: [ReadWriteOnce]
作成された Persistent Volume Claim (PVC) を確認します:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-catalog-mysql-0 Bound pvc-abc123... 30Gi RWO ebs-sc 2m
PVC の詳細を調査します:
Name: data-catalog-mysql-0
Namespace: catalog
StorageClass: ebs-sc
Status: Bound
Volume: pvc-abc123...
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: ebs.csi.aws.com
Capacity: 30Gi
Access Modes: RWO
VolumeMode: Filesystem
Used By: catalog-mysql-0
PVC は Persistent Volume (PV) にバインドされ、ebs.csi.aws.com を使用して 30Gi の容量でプロビジョニングされています。
PersistentVolume (PV) の調査
Name: pvc-abc123...
Annotations: pv.kubernetes.io/provisioned-by: ebs.csi.aws.com
StorageClass: ebs-sc
Status: Bound
Claim: catalog/data-catalog-mysql-0
Reclaim Policy: Delete
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 30Gi
Node Affinity:
Required Terms:
Term 0: topology.kubernetes.io/zone in [us-west-2a]
Source:
Type: CSI (a Container Storage Interface (CSI) volume source)
Driver: ebs.csi.aws.com
FSType: ext4
VolumeHandle: vol-0abc123...
ReadOnly: false
VolumeHandle は Amazon EBS Volume ID を参照します。Node Affinity は、Pod が EBS ボリュームと同じ Availability Zone にスケジュールされることを保証します。
EBS ボリュームの確認
EBS Volume ID を取得します:
EBS ボリュームの詳細を表示します:
このボリュームは暗号化が有効になっている gp3 ストレージを使用しています。
データの永続性のテスト
Pod の再起動後もデータが永続化されることを確認しましょう。まず、Pod の準備ができるまで待ちます:
MySQL データディレクトリにテストファイルを作成します:
テストファイルが作成されたことを確認します:
-rw-r--r--. 1 root root 4 Oct 11 00:39 test.txt
次に、障害をシミュレートするために Pod を削除します:
StatefulSet コントローラーが自動的に Pod を再作成するのを待ちます:
Pod の再起動後もテストファイルが存在することを確認します:
123
成功です!テストファイルは Pod の再起動後も永続化されました。これは、データが Pod のエフェメラルストレージではなく、EBS ボリュームに保存されているためです。Amazon EBS がデータを保存し、AWS のアベイラビリティーゾーン内で安全かつ利用可能な状態を維持しています。