In this tutorial we will install a MariaDB instance backed by a persistent volume on Jetstream 2. It will be in the jhub namespace, so that it can be accessed by the JupyterHub users and from no other namespace.

As usual all configuration files and scripts are in my reference repository:

gh repo clone zonca/jupyterhub-deploy-kubernetes-jetstream
cd jupyterhub-deploy-kubernetes-jetstream/mariadb

Install via Helm

Bitnami provides a nicely prepackaged MariaDB instance via Helm, modify the mariadb/values.yaml file, in particular set all the passwords to randomly generated values.

I have configured the recipe so that:

  • database name is mariadbk8s
  • non root username is mariadbuser

Install it with

bash install_mariadb.sh

Load data from a SQL dump

Once the database is running, follow the printout of the Helm recipe on how to get a temporary pod to connect to the database.

Once that is running, you will have a terminal running, there you can get your SQL dump for example from gist:

cd /tmp
curl https://gist.github.com/zonca/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/raw/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/dump.sql --output dump.sql -L

Finally ingest the data (will need to paste the root password from values.yaml):

mysql -h mariadb.jhub.svc.cluster.local -uroot -p mariadbk8s < dump.sql

Add support in user containers

Finally you need to make sure that the mariadb-client package is installed in the Jupyter single user OS, and in the Python environment you will need the mariadb package and possibly sqlalchemy.

For example Centos 7 needs the MariaDB custom repositories and the packages:

MariaDB-devel MariaDB-connect-engine

The connection string for SQLAlchemy will be:

from urllib.parse import quote_plus as urlquote
pw = urlquote('xxxxxxxxxxxxxxxxxxxx')
engine = sqlalchemy.create_engine(f"mariadb+mariadbconnector://mariadbuser:{pw}@mariadb.jhub.svc.cluster.local:3306/mariadbk8s")