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

StatefulSet with EBS Volume

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

MySQL with EBS

Kustomizeを使用して、次の2つのことを行います:

  • カタログコンポーネントで使用されるMySQLデータベース用のEBSボリュームを使用する新しいStatefulSetを作成する
  • catalogコンポーネントを更新して、このデータベースの新しいバージョンを使用する
備考

なぜ既存のStatefulSetを更新しないのですか?更新する必要のあるフィールドは変更不可であり、変更できないためです。

こちらが新しいカタログデータベースStatefulSetです:

~/environment/eks-workshop/modules/fundamentals/storage/ebs/statefulset-mysql.yaml
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
A

volumeClaimTemplatesフィールドは、新しいEBSボリューム、PersistentVolume (PV)、およびPersistentVolumeClaim (PVC)をすべて自動的に作成するためにDynamic Volume Provisioningを利用するようKubernetesに指示します。

B

storageClassNameをデフォルトのストレージクラスの名前であるebs-csi-default-scとして指定します

C

30GBのEBSボリュームをリクエストしています

これが、新しいStatefulSetを使用するようにcatalogコンポーネント自体を再設定する方法です:

~/environment/eks-workshop/modules/fundamentals/storage/ebs/configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: catalog
data:
RETAIL_CATALOG_PERSISTENCE_ENDPOINT: catalog-mysql-ebs:3306

変更を適用し、新しいPodがロールアウトされるのを待ちます:

~$kubectl apply -k ~/environment/eks-workshop/modules/fundamentals/storage/ebs/
~$kubectl rollout status --timeout=100s statefulset/catalog-mysql-ebs -n catalog

新しくデプロイされたStatefulSetが実行されていることを確認しましょう:

~$kubectl get statefulset -n catalog catalog-mysql-ebs
NAME                READY   AGE
catalog-mysql-ebs   1/1     79s

catalog-mysql-ebs StatefulSetを調査すると、30GiBのPersistentVolumeClaimがstorageClassNameとしてebs-csi-driverで接続されていることがわかります。

~$kubectl get statefulset -n catalog catalog-mysql-ebs \
-o jsonpath='{.spec.volumeClaimTemplates}' | jq .
[
  {
    "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)を自動的に作成した方法を分析できます:

~$kubectl get pv | grep -i catalog
pvc-1df77afa-10c8-4296-aa3e-cf2aabd93365   30Gi       RWO            Delete           Bound         catalog/data-catalog-mysql-ebs-0          gp2                            10m

AWS CLIを使用して、自動的に作成されたAmazon EBSボリュームを確認できます:

~$aws ec2 describe-volumes \
--filters Name=tag:kubernetes.io/created-for/pvc/name,Values=data-catalog-mysql-ebs-0 \
--query "Volumes[*].{ID:VolumeId,Tag:Tags}" \
--no-cli-pager

AWSコンソールで確認することもできます。キーkubernetes.io/created-for/pvc/nameと値data-catalog-mysql-ebs-0のタグを持つEBSボリュームを探します:

EBS Volume AWS Console Screenshot

catalog-mysql-ebsコンテナのシェルを検査して、LinuxOSに接続された新しいEBSボリュームを確認したい場合は、次の手順を実行してください。マウントされているファイルシステムを検査します:

~$kubectl exec --stdin catalog-mysql-ebs-0 -n catalog -- bash -c "df -h"
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ファイルを作成します:

~$kubectl exec catalog-mysql-ebs-0 -n catalog -- bash -c "echo 123 > /var/lib/mysql/test.txt"

次に、test.txtファイルが/var/lib/mysqlディレクトリに作成されたことを確認します:

~$kubectl exec catalog-mysql-ebs-0 -n catalog -- ls -larth /var/lib/mysql/ | grep -i test
-rw-r--r-- 1 root  root     4 Oct 18 13:57 test.txt

では、現在のcatalog-mysql-ebs Podを削除しましょう。これにより、StatefulSetコントローラーが自動的にPodを再作成します:

~$kubectl delete pods -n catalog catalog-mysql-ebs-0
pod "catalog-mysql-ebs-0" deleted

数秒待ってから、次のコマンドを実行してcatalog-mysql-ebs Podが再作成されたことを確認します:

~$kubectl wait --for=condition=Ready pod -n catalog \
-l app.kubernetes.io/component=mysql-ebs --timeout=60s
pod/catalog-mysql-ebs-0 condition met
~$kubectl get pods -n catalog -l app.kubernetes.io/component=mysql-ebs
NAME                  READY   STATUS    RESTARTS   AGE
catalog-mysql-ebs-0   1/1     Running   0          29s

最後に、MySQLコンテナのシェルに戻り、/var/lib/mysqlパスでlsコマンドを実行して、作成したtest.txtファイルを探し、ファイルが保持されているかどうかを確認します:

~$kubectl exec catalog-mysql-ebs-0 -n catalog -- ls -larth /var/lib/mysql/ | grep -i test
-rw-r--r-- 1 mysql root     4 Oct 18 13:57 test.txt
~$kubectl exec catalog-mysql-ebs-0 -n catalog -- cat /var/lib/mysql/test.txt
123

ご覧のように、Podが削除され再起動された後も、test.txtファイルは引き続き使用可能で、正しいテキスト123が含まれています。これはPersistent Volumes(PV)の主要な機能です。Amazon EBSはデータを保存し、AWS可用性ゾーン内でデータを安全かつ利用可能な状態に保ちます。