macでmicrok8sを利用2-mariadb起動に失敗しても回避

microk8sめっちゃもっさり動く。

先月はubuntu24対応して月末にnoble numbatベースのmariadbも11.4に切り替えた。

今回はmicrok8sの中で動くmariadbを切り替える。
最初はうまく行かんかったけど、なんとかできた。

稼働のイメージ

今回は⭐️印の箇所の話。
データベースをkubernetesで動かすときに勘違いもあってハマった。

+-mac--------------------------+
| +-microk8s-------+           |
| |                |           |
| +----------------+           |
| +-multipass-containerd-----+ |
| |  +-container-+           | |
| |  | kubernetes|           | |     +-local ubuntu24 linux--------+    +-GCE ubuntu24 linux----------+
| |  +-----------+ +-/data-+ | |     | +-docker---------+ +-vmdk-+ |    | +-docker---------+ +--pv--+ |
| |  +-container-+ |       | | |     | |  +-container-+ | | data | |    | |  +-container-+ | | data | |
| |  | Django    | |  d1   | | |     | |  | Django    | | |  d1  | |    | |  | Django    | | |  d1  | |
| |  +-----------+ +-------+ | |     | |  +-----------+ | +------+ |    | |  +-----------+ | +------+ |
| |  +-container-+ |       | | |     | |  +-container-+ | |      | |    | |  +-container-+ | |      | |
| |  | mariadb⭐️| |  d2   | | |     | |  | mariadb   | | |  d2  | |    | |  | mariadb   | | |  d2  | |
| |  +-----------+ +-------+ | |     | |  +-----------+ | +------+ |    | |  +-----------+ | +------+ |
| |  +-container-+ |       | | |     | |  +-container-+ | |      | |    | |  +-container-+ | |      | |
| |  | xrdp-ubu24| |  d3   | | |     | |  | xrdp-ubu24| | |  d3  | |    | |  | xrdp-ubu24| | |  d3  | |
| |  +-----------+ +-------+ | |     | |  +-----------+ | +------+ |    | |  +-----------+ | +------+ |
| |                          | |     | |                |          |    | |  +-container-+ |          |
| |                +-------+ | |     | |                |          |    | |  | gitlab    | |          |
| |                | micro | | |     | |                |          |    | |  +-----------+ |          |
| |  +-container-+ | k8s   | | |     | |  +-container-+ |          |    | |  +-container-+ |          |
| |  | https     | | Ubuntu| | |     | |  | https     | |          |    | |  | https     | |          |
| |  +-----------+ +-------+ | |     | |  +-----------+ |          |    | |  +-----------+ |          |
| +--------------------------+ |     | +----------------+          |    | +----------------+          |
+------------------------------+     +-----------------------------+    +-----------------------------+

母艦のubuntu24からdockerイメージ持ってくる

前にやったことをそのままやる。

teratermあって助かるわぁ。
当たり前やけど、書いた通り動いてくれる。

macにscpしてtar.gzファイルをtarに展開してから、microk8sのお腹の中で動いてるmultipassのubuntuに向かってtarファイルをコピーする。
コピーしたtarファイルはctrでインポートするとこうなる。

ubuntu@microk8s-vm:~$ sudo microk8s.ctr images ls | grep save 
docker.io/library/save-django:gvis-saved  application/vnd.oci.image.manifest.v1+json  sha256:c6278a16ec3bc66a2135d4e3e84ab676d88e81ad6db935b5545692d77f81f5a8 1.2 GiB   linux/amd64  io.cri-containerd.image=managed                                 
⭐️mariadb入っとる
docker.io/library/save-mariadb:gvis-saved  application/vnd.oci.image.manifest.v1+json  sha256:63d81cd4db130e9773587ff64cd419d4150208b397e1b25cf714c58b0d0694a6 490.3 MiB linux/amd64  io.cri-containerd.image=managed                                 
docker.io/library/save-xrdpubu:gvis-saved  application/vnd.oci.image.manifest.v1+json  sha256:2f342cd3beb5fe9dd9fbcc3007ec4d5ce42c2dbef1493d13ef4e80841670bf55 6.6 GiB   linux/amd64  io.cri-containerd.image=managed                                 
ubuntu@microk8s-vm:~$ 

せっかく作ったmariadbのdockerイメージなんやけどなぁ・・・。

dockerイメージからコンテナ起動したらエラー

データ転送する前に、すっからかんの状態で初期処理できるか試したら動かんかった。
このエラーはdockerが最新になってへんかったり、環境がおかしいときに出ることあるエラー。

2024-08-06 15:42:31+09:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.4.2+maria~ubu2404 started.
2024-08-06 15:42:31+09:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB
2024-08-06 15:42:31+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2024-08-06 15:42:31+09:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.4.2+maria~ubu2404 started.
2024-08-06 15:42:32+09:00 [Note] [Entrypoint]: Initializing database files

FATAL ERROR: Could not find /usr/bin/my_print_defaults

If you compiled from source, you need to either run 'make install' to
copy the software into the correct location ready for operation.
If you don't want to do a full install, you can use the --srcdir
option to only install the mysql database and privilege tables.

If you are using a binary release, you must either be at the top
level of the extracted archive, or pass the --basedir option
pointing to that location.

The latest information about mariadb-install-db is available at
https://mariadb.com/kb/en/installing-system-tables-mysql_install_db

このエラー出た時にkubectlでステータス見ると、Podはcrashloopbackoffみたいな表記やった。
困ったなぁ。

初期化ができんってことは、根本的に何か間違ってるってことやな。
初歩的な確認からいってみよか。

dockerhubにあるイメージそのまま取ってきたら動く

Podを動かすときに、マニフェストを何個か定義してる。

  1. gvis-PersistentVol-mariadb.yaml ⭐️データベースが使うディスク領域
  2. gvis-PersistentVol-mariadbconf.yaml ⭐️設定ファイルのマウントと、データロードのシェルスクリプト置き場
  3. sv-mariadb-service.yaml ⭐️サービス定義しといて後でフォワードして使う
  4. mariadb-txt-configmap.yaml ⭐️ユーザデータベースの定義とかパスワード定義とかの環境変数っぽいもん入ってる
  5. sv-mariadb-deployment.yaml ⭐️稼働するときのコンテナのイメージとかPodの方針とか

最初の4つはkubernetesクラスタを作るときに定義してて、5番目でPod稼働のためのkubectl createするときに指定して使ってる。

その中のここを変えてみた。

image: mariadb:11.4-noble

あっさり起動するやん。以下ログの抜粋。

2024-08-07 06:01:33+09:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.4.2+maria~ubu2404 started.
2024-08-07 06:01:34+09:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB
2024-08-07 06:01:34+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2024-08-07 06:01:34+09:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.4.2+maria~ubu2404 started.
2024-08-07 06:01:34+09:00 [Note] [Entrypoint]: Initializing database files
:(中略)
2024-08-07 06:01:38+09:00 [Note] [Entrypoint]: Database files initialized
2024-08-07 06:01:38+09:00 [Note] [Entrypoint]: Starting temporary server
2024-08-07 06:01:38+09:00 [Note] [Entrypoint]: Waiting for server startup
2024-08-07 06:01:39+09:00 [Note] [Entrypoint]: Temporary server started.
2024-08-07 06:01:41+09:00 [Note] [Entrypoint]: Creating database nariDB_1st
2024-08-07 06:01:41+09:00 [Note] [Entrypoint]: Creating user nari
2024-08-07 06:01:41+09:00 [Note] [Entrypoint]: Giving user nari access to schema nariDB_1st
2024-08-07 06:01:41+09:00 [Note] [Entrypoint]: Securing system users (equivalent to running mysql_secure_installation)
2024-08-07 06:01:41+09:00 [Note] [Entrypoint]: Stopping temporary server
2024-08-07 06:01:41+09:00 [Note] [Entrypoint]: Temporary server stopped
2024-08-07 06:01:41+09:00 [Note] [Entrypoint]: MariaDB init process done. Ready for start up.

なんやねん、自分でビルドした分と何が違うんか全然わからん。

localのubuntu24の中で動かしてるコンテナのdockerfileを切り詰めてデータベースクライアントのインストールだけにしてるんやけどなぁ。

FROM mariadb:11.4-noble
RUN apt-get update ; apt-get install -y mysql-client

手を動かしながらもうちょっと考える。

mysqlやなくmariadbっていうクライアントがある

dockerhubからkubernetesに取ってきたイメージはそのまま使えるんやったら、データベースとして使えるんかもやってみる。
mariadbのデータダンプをロードしてみるために、手動でaptしてmysql-client入れてからteratermのマクロ動かしてみた。

そしたら、データベース接続した直後にマクロが待ち受けになって途中で止まってしもた。

root@svmariadb:/# mysql -unari -pxxxxxxxxxxxxxx
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 11.4.2-MariaDB-ubu2404-log mariadb.org binary distribution

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> ⭐️なんじゃコレ!?MariaDBって表示やなくなっとる?

データベースクライアントのプロンプトがMariaDBやなくてmysqlってなってるやん。

プロンプトの中に出てくる特定のキーワード出現をteratermは待ってて、それに応じてコマンドを送るようになってる。

wait "MariaDB"
sendln "show variables like 'max_allowed_packet' ; "

wait "MariaDB"
sendln 'show databases ; '

気にしてへんかったけど、今まで使ってたmysqlのクライアントがmariadbに繋がるのは当たり前やと思ってた。
11.4からデータの転送で使ってたmysqlが使えんようになったからaptで入れるようにした。

もしかして、mysqlクライアントやないものを使わなアカンってこと?
何かないんかって探してみた。

まったく知らんかったけど、mariadb-clientってのがあるやん!!!

最後のほうに10.3まではmysql、それ以降はmariadb使えって書いてあるやん。

MariaDB Client — MariaDB Documentation
MariaDB is the leading enterprise open source database with features previously only available in costly proprietary dat...

慌ててPodにログインしてモジュールあるんか確認してみた。

root@svmariadb:/# which mariadb 
/usr/bin/mariadb
root@svmariadb:/# mariadb --version 
mariadb from 11.4.2-MariaDB, client 15.2 for debian-linux-gnu (x86_64) using  EditLine wrapper
root@svmariadb:/# 

はい、mysqlクライアントさいなら。
自前のmariadb用dockerfileも使うのやめ。

dockerhubにあるmariadbのイメージをpullして、mariadbクライアント使ってデータのロードすることにする。

ついでにmysqldumpがmariadb-dumpに変わったみたいやから、それも変更対応した。

dockerイメージ指定変更

一時的に作ったマニフェストで指定したmariadb11.4のイメージ指定をそのまま使う。

nari@gvis-mac microk8s % diff sv-mariadb-deploymentORG.yaml sv-mariadb-deploymentTEMP.yaml 
49c49,50
<           image: save-mariadb:gvis-saved
---
>           ## image: save-mariadb:gvis-saved
>           image: mariadb:11.4-noble
nari@gvis-mac microk8s % 

データの流し込みと接続確認

データの流し込みに使うteratermのマクロは書き換えた。

include 'Y:_connect\connect\teraIni\gvis.ini'
:(中略)
 connect conSTR
 if result <> 2 goto end

wait "nari@gvis-mac ~ %"
scpsend SOURFILE1 DESTFILE1 
scpsend SOURFILE2 DESTFILE2 
scpsend SOURFILE3 DESTFILE3 

wait "nari@gvis-mac"
sendln 'm8'

wait "nari@gvis-mac"
sendln 'kubectl delete -f sv-mariadb-deployment.yaml'

wait "nari@gvis-mac"
sendln 'kubectl delete -f gvis-PersistentVol-mariadbconf.yaml'

wait "nari@gvis-mac"
sendln 'kubectl delete -f gvis-PersistentVol-mariadb.yaml'

wait "nari@gvis-mac"
sendln 'multipass shell microk8s-vm'

wait "ubuntu@microk8s-vm:~$"
sendln 'sudo su -'

wait "#"
sendln 'cd /data'

wait "#"
sendln 'rm -fR ./gvis-pv-mariadb ; rm -fR ./gvis-pv-mariadbconf ; sync ; sync '

wait "#"
sendln 'mkdir gvis-pv-mariadbconf ; mkdir gvis-pv-mariadbconf/nari ; mkdir gvis-pv-mariadbconf/nari/fullback ; mkdir gvis-pv-mariadb '

wait "#"
sendln 'chmod -R 777 gvis-pv-mariadb* '

wait "#"
sendln 'exit'

wait "$"
sendln 'exit'

wait "nari@gvis-mac"
sendln 'multipass transfer /Users/nari/Documents/personal/microk8s/nariDockerDat/sv_mariadb11conf/gvis.cnf                                microk8s-vm:/data/gvis-pv-mariadbconf/ '

wait "nari@gvis-mac"
sendln 'multipass transfer /Users/nari/Documents/personal/microk8s/nariDockerDat/sv_mariadb11conf/nari/fullback/2_fullRecover.sh          microk8s-vm:/data/gvis-pv-mariadbconf/nari/fullback/ '

wait "nari@gvis-mac"
sendln 'multipass transfer /Users/nari/Documents/personal/microk8s/nariDockerDat/sv_mariadb11conf/nari/fullback/4_nariDB_DjangoRecover.sh microk8s-vm:/data/gvis-pv-mariadbconf/nari/fullback/ '

wait "nari@gvis-mac"
sendln 'multipass transfer /Users/nari/Documents/personal/microk8s/nariDockerDat/sv_mariadb11conf/nari/FullBackup_nariDB_1st.sql          microk8s-vm:/data/gvis-pv-mariadbconf/nari/ '

wait "nari@gvis-mac"
sendln 'multipass transfer /Users/nari/Documents/personal/microk8s/nariDockerDat/sv_mariadb11conf/nari/FullBackup_nariDB_Django.sql       microk8s-vm:/data/gvis-pv-mariadbconf/nari/ '

wait "nari@gvis-mac"
sendln 'kubectl create -f gvis-PersistentVol-mariadbconf.yaml'

wait "nari@gvis-mac"
sendln 'kubectl create -f gvis-PersistentVol-mariadb.yaml'

wait "nari@gvis-mac"
sendln 'kubectl create -f sv-mariadb-deployment.yaml'

wait "nari@gvis-mac"
sendln 'sync ; sync ; sleep 20'

wait "nari@gvis-mac"
sendln "kubectl exec -it `kubectl get pod | grep mariadb | awk '{print $1}'` -- bash"

wait "root@svmariadb"
sendln 'sync ; sleep 20 ; sync'

wait "root@svmariadb"
sendln '/bin/sh /etc/mysql/conf.d/nari/fullback/2_fullRecover.sh' ⭐️このスクリプトの中でmysqlクライアント使ってる

wait "root@svmariadb"
sendln 'sync ; sleep 20 ; sync'

wait "root@svmariadb"
sendln '/bin/sh /etc/mysql/conf.d/nari/fullback/4_nariDB_DjangoRecover.sh' ⭐️ここの中でもmysqlクライアント使ってる

wait "root@svmariadb"
sendln 'mariadb -unari -pXXXXXXXXXXXXXX'

wait "MariaDB" ⭐️ここでちゃんとつながることを確認
sendln "show variables like 'max_allowed_packet' ; "

wait "MariaDB"
sendln 'show databases ; '

wait "MariaDB"
sendln 'use nariDB_1st ; '

wait "MariaDB"
sendln 'select count(*) from GVIS_keihi ; '

wait "MariaDB"
sendln 'exit '

wait "root@svmariadb"
sendln 'rm /etc/mysql/conf.d/nari/FullBackup_nariDB_1st.sql'

wait "root@svmariadb"
sendln 'rm /etc/mysql/conf.d/nari/FullBackup_nariDB_Django.sql'

wait "#"
sendln 'exit '

wait "nari@gvis-mac"
sendln 'sc'

wait "nari@gvis-mac"
sendln 'sh ./411_ReCreateDBpod.sh'

wait "nari@gvis-mac"
delSTR = 'rm -f '
strconcat delSTR DESTFILE1
sendln delSTR

wait "nari@gvis-mac"
delSTR = 'rm -f '
strconcat delSTR DESTFILE2
sendln delSTR

end

流し込みで使ってるスクリプト2箇所の中を更新。
1つ目は本番データの流し込みの分。

:(中略)
/usr/bin/mariadb -u root -p${DBPASS}  < /etc/mysql/conf.d/nari/FullBackup_nariDB_1st.sql ⭐️mariadbのクライアント使う!!
:(中略)
echo '----fullRecover Finished-----' `date +%F_%T_` >> ${TMP_FILE}

テスト環境のデータベースも同じように更新。

:(中略)
/usr/bin/mariadb -u root -p${DBPASS}  < /etc/mysql/conf.d/nari/FullBackup_nariDB_Django.sql ⭐️mariadbのクライアント使う!!
:(中略)
echo '----fullRecover Finished-----' `date +%F_%T_` >> ${TMP_FILE}

動かすと5分ぐらいかかる。

動作確認

いつもの作業やる。

基本的な接続をして、djangoからの確認も同じようにやる。

ブラウザでkubernetesの状態確認。

gvis-microk8s-maria11

xrdpコンテナにログインしてアプリ確認。
それにしてもmicrok8sのkubernetesもっさり動くし遅い。

gvis-microk8s-maria11

mariadbで動いてたmysql-clientはmariadbのクライアントへのリンクやったんかなぁ。

タイトルとURLをコピーしました