コンテナDB実践シリーズ③:Kubernetesでデータベースを動かしてみた

はじめに

前回はKubernetesにおけるデータ永続化について解説しました。

今回は、実際にKubernetesのデータ永続化機能を利用してKubernetes上でDBコンテナを起動する方法をハンズオン形式で紹介します。

今回の構成

以下の図1は、今回のハンズオンで作成するKubernetesでMySQLのようなデータベースを安定して動かすための仕組みを表しています。

図1:StatefulSetで構成されたMySQLコンテナの概念図

前提条件

  • kubectlが使用可能である
  • minikubeがインストール済み
    • バージョン:v1.36.0
  • 使用するMySQLコンテナ
    • イメージ:MySQL:8.0

事前準備

今回のハンズオンで使用するsample_mysql.ymlを以下に記載します。

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  labels:
    app: mysql
spec:
  ports:
  - port: 3306
    name: mysql
  clusterIP: None
  selector:
    app: mysql
---
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
stringData:
  mysql-root-password: "mysql_root_password"

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-statefulset
spec:
  serviceName: "mysql-service" 
  replicas: 1 
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: mysql-root-password
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql

    volumeClaimTemplates:
    - metadata:
      name: mysql-persistent-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "standard"
      resources:
        requests:
          storage: 1Gi

主要なパラメーター

sample_mysql.yml内の主要なパラメーターについて説明します。

  • kind: Service
    • Kubernetesにおいてネットワークサービスを定義するためのオブジェクトです。今回のファイルではmysqlというラベルがついたPodをサービスの管理対象とすると指定しています。
  • kind: Secret
    • パスワードなどの機密情報を安全に格納し、Podに環境変数として渡すために使用されるKubernetesリソースであるSecretを設定します。今回のファイルではmysqlのパスワードなどを格納しています。
  • kind: StatefulSet
    • ステートフルなアプリケーションのデプロイと管理を行うために使用されるKubernetesリソースであるStatefulSetを設定します。StatefulSetはPodに固有の識別子を与えたり、安定したストレージを保証する設定を行うことでDBコンテナ運用において重要な役割を果たしています。
  • volumeClaimTemplates
    • Podごとに永続ボリューム要求(PVC)を動的に作成するためのテンプレートを定義する、StatefulSetに特有のフィールドです。今回はこのフィールドで永続ストレージを確保するための設定をしています。
    • metadataはPVCの「名前」などのメタデータを定義します。
      • 今回は『name: mysql-persistent-storage』で名前を定義しています。
    • specでは仕様の定義を行います。
      • accessModes: [ “ReadWriteOnce” ]ではアクセスモードを指定します。ReadWriteOnceは1つのノードからの読み書き可能という仕様の設定です。
      • storageClassName: ストレージクラスとは、Kubernetesでストレージの種類や動作を指定するための設定テンプレートです。今回はストレージのクラスをstandardに設定します。
      • resourcesのstorage: 1Giではストレージの容量として1Giを要求しています。

Kubernetes上でMySQLコンテナを起動

StatefulSetを利用してMySQLコンテナをminikube上にデプロイ

minikube startコマンドを実行し、minikubeを起動します。

minikube start

minikubeの起動

kubectl applyはYAMLやJSONなどの設定ファイルをKubernetesクラスターに適用し、リソースの状態を管理するためのコマンドです。このコマンドを使用してsample_mysql.ymlをKubernetesクラスターに適用します。

kubectl apply -f "sample_mysql.yml"

設定ファイルの適用

Podと永続ボリューム(PV/PVC)の状態を確認 

kubectl getコマンドはKubernetesクラスター内のリソースの一覧を取得するコマンドです。このコマンドを使用することで、Pod、PVC(PersistentVolumeClaim)、PV(PersistentVolume)の状態を確認できます。

kubectl get pods を実行することで、Podの一覧とそれぞれのステータスを確認できます。`STATUS`の個所にRunningと表示されていれば正常に稼働していることを示します。

kubectl get statefulsetsを実行することで、StatefulSetが正常に動作しているか確認できます。特に`READY`の値が期待される数と一致している場合正常に動作していると確認できます。
kubectl get pvcとkubectl get pvを実行することで、PVCとPVの状態を確認できます。PVCとPVがBound状態であれば、ストレージが正常に割り当てられていることを示します。また、`CLAIM`フィールドには対応するPVCやPVの名前が記載されており、どのリソースがストレージを利用しているかを確認できます。さらにStatefulSetではvolumeClaimTemplatesによってPodごとに固有のPVCが作成され、専用のPVと1対1で紐づくことにより各Podが専用の永続ストレージを持つことができます。

kubectl get pods
kubectl get statefulsets
kubectl get pvc
kubectl get pv

Kubernetesクラスター内のpodの状態確認

SratefulSetの状態確認

PVCの状態確認

PVの状態確認

データが永続化されていることを確認

データの永続化が正しく機能しているか確認するために今回はMySQLコンテナ内に新しいデータベースを作成します。

kubectl exec -it "kubectl get podsで取得したpod名" -- mysql -uroot -p
CREATE DATABASE "任意のデータベース名";

初期状態のデータベース

新しいデータベースを作成

次に、Podを削除して再作成される様子を確認します。この手順では、Podが削除されてもストレージ永続化の仕組みによってデータが保持されていることを検証します。StatefulSetではPodが削除されても同じ名前のPodが再作成され、PVCやPVもそのPodに紐づいた状態を維持します。

kubectl delete pod "pod名"

podの削除と再作成の確認

Podは削除すると自動で再作成されます。Podの再作成後MySQLコンテナ内に入り、作成したデータベースが残っているかを確認します。データベースが残っていたらKubernetesのストレージ永続化が正しく機能しています。

データの永続化の確認

おわりに

今回はハンズオンを通して、StatefulSetとPV/PVCの利用により、コンテナ環境で安全にDBを運用する方法を紹介しました。

次回はKubernetes上のアプリケーションコンテナがDBコンテナに接続する仕組みについて解説します。

参考文献

https://kubernetes.io/docs/concepts/services-networking/service/

https://kubernetes.io/docs/concepts/services-networking/service/#headless-services

https://kubernetes.io/docs/concepts/configuration/secret/

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_apply/

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です