ストレージの実際: データベースの構築#

では、hostPathを用いる例として、データベースを構築してみます。 ただしこのやり方が今後も使う正しいものというわけでもありませんので、そこは注意しておいてください。

とりあえず従来の方法で#

まずは、とりあえず従来の「ポッドが消えたらデータが消える」かたちで構築してみます。 これを書き換えていく・流用する形で進めていきます。

Listing 44 MariaDBを動かすポッド(従来のもの)#
apiVersion: v1
kind: Pod
metadata:
  name: mariadb-storage
  labels:
    name: mariadb-storage
spec:
  containers:
  - name: mariadb-storage
    image: mariadb
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    ports:
      - containerPort: 3306
    env:
      - name: MARIADB_ROOT_PASSWORD
        value: dbadmin

Warning

このマニフェストを適用して実験しても良いですが、あとでボリュームを追加したときの適用の前に必ずdeleteするようにしてください。

ストレージを導入する#

ここにストレージを導入します。 hostPath方式のストレージdbstoreを用意します、ノード上のデータ置き場は /data/mariadb としておきます。

Listing 45 ストレージdbstoreの追加(差分)#
--- /work/codes/mariadb-plain.yml
+++ /work/codes/mariadb-volume.yml
@@ -5,6 +5,10 @@
   labels:
     name: mariadb-storage
 spec:
+  volumes:
+    - name: dbstore
+      hostPath:
+        path: /data/mariadb
   containers:
   - name: mariadb-storage
     image: mariadb

そして、コンテナ側もストレージをマウントするようにvolumeMountsを追加します…

Listing 46 マウント指定の追加(差分)#
--- /work/codes/mariadb-volume.yml
+++ /work/codes/mariadb-volume-mount.yml
@@ -21,5 +21,8 @@
     env:
       - name: MARIADB_ROOT_PASSWORD
         value: dbadmin
+    volumeMounts:
+      - mountPath: /var/lib/mysql
+        name: dbstore
 
 

このマニフェストを使うと、ストレージを確保した上でコンテナから切り離されたストレージにデータベースの情報が記録されるようになります。よってポッドを破棄・再生成してもデータベースが維持されます。

Warning

もし初期状態のポッドマニフェストを適用している場合は、一度deleteしておいてください。 再適用(apply)した場合はエラーになります(差分適用するレベルを超えてしまうため)。

試してみる#

実際に試してみます。最終的に作ったファイルの名前を mariadb-volume-mount.yml としています。

PS> kubectl apply -f mariadb-volume-mount.yml(のパス)
PS> kubectl get pods
kubectl get pods
NAME              READY   STATUS    RESTARTS      AGE
mariadb-storage   1/1     Running   0             1m11s

MariaDBデータベースに接続して、実際にデータベースを作成します。

Listing 47 データベースの作成#
PS> kubectl exec -it pod/mariadb-storage -- mysql --password=dbadmin
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.001 sec)

MariaDB [(none)]> create database k8ssample; -- k8ssampleデータベースの作成
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> show databases; -- 再表示して確認
+--------------------+
| Database           |
+--------------------+
| information_schema |
| k8ssample          | <- 作成された!
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.002 sec)

MariaDB [(none)]> quit; -- 一旦終了
Bye

データベースが作成されました。ここでポッドを一度破棄し、再度作り直してみます。 従来ならポッド消滅時にポッド内のストレージだったデータベース領域は削除されてましたが…

Listing 48 一度破棄してからの再生成(ポッド)#
PS> kubectl delete pod/mariadb-storage
PS> kubectl apply -f mariadb-volume-mount.yml(のパス)

起動後接続し直すと、先ほど作った k8ssample データベースが残っていることがわかります。

Listing 49 再接続しての確認#
PS> kubectl exec -it pod/mariadb-storage -- mysql --password=dbadmin

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| k8sample           | <- ちゃんとある!
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.001 sec)

MariaDB [(none)]> quit;
Bye

おまけ: ノードに直接乗り込む#

hostPathによりノード上のディレクトリを割り当てるということをここでは行ってましたが、実際どのように見えているのでしょう。 minikubeにはsshサブコマンドが用意されており、ノードにssh経由で入り込むことができます。

Listing 50 ノードに接続してみる#
PS> minikube ssh
$ ls /data
db  mariadb  mariadb-data  pv0001
# マニフェストを確認するとわかりますが、hostPathは/data/mariadbです
$ ls /data/mariadb
aria_log.00000001  ib_buffer_pool  ibtmp1             mysql               sys
aria_log_control   ib_logfile0     k8sample           mysql_upgrade_info
ddl_recovery.log   ibdata1         multi-master.info  performance_schema
$ exit

なので、ポッドが利用しているディレクトリを削除すれば、初期状態に戻ることも予想できると思います。

Listing 51 ノードのストレージを破壊してみると…#
PS> kubectl delete pod/mariadb-storage
pod "mariadb-storage" deleted
PS> minikube ssh
$ sudo rm -fr /data/mariadb # 破壊!
$ exit
PS> kubectl apply -f mariadb-volume-mount.yml(のパス) # 再生成
pod/mariadb-storage created
PS> kubectl exec -it pod/mariadb-storage -- mysql --password=dbadmin
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.001 sec)
MariaDB [(none)]> quit;
Bye

Tip

消すのが面倒となったら、最悪minikubeですので、minikube deleteで環境自体を破壊してやりなすのも一考です。 マニフェストがあれば再現はできるはずですから!