#!/bin/bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" [ -f "${SCRIPT_DIR}/env-mariadb" ] && source "${SCRIPT_DIR}/env-mariadb" [ -f "${SCRIPT_DIR}/_credentials.env" ] && source "${SCRIPT_DIR}/_credentials.env" MARIADB_NAMESPACE="${MARIADB_NAMESPACE:-data}" MARIADB_IMAGE="${MARIADB_IMAGE:-mariadb:12.2.2-ubi10}" MARIADB_PORT="${MARIADB_PORT:-3306}" MARIADB_DATA_DIR="${MARIADB_DATA_DIR:-/var/lib/mysql}" MARIADB_STORAGE_CLASS="${MARIADB_STORAGE_CLASS:-longhorn-retain}" MARIADB_STORAGE_SIZE="${MARIADB_STORAGE_SIZE:-4Gi}" KUBECONFIG="${KUBECONFIG:-/etc/kubernetes/admin.conf}" export KUBECONFIG CMD_TSK="${CMD_TSK:-${1:-install}}" _kubectl() { if command -v kubectl >/dev/null 2>&1; then command kubectl "$@" elif command -v k0s >/dev/null 2>&1; then k0s kubectl "$@" else echo "ERROR: no kubectl or k0s binary found" >&2; exit 127 fi } _require_env() { local var="$1" if [ -z "${!var:-}" ]; then echo "ERROR: required variable $var is not set" >&2 exit 1 fi } _namespace_exists() { _kubectl get namespace "$MARIADB_NAMESPACE" >/dev/null 2>&1 } _pod_name() { _kubectl get pod \ --namespace "$MARIADB_NAMESPACE" \ --selector "app.kubernetes.io/name=mariadb" \ -o jsonpath='{.items[0].metadata.name}' 2>/dev/null } _wait_for_pod() { local timeout="${1:-180}" _kubectl wait pod \ --namespace "$MARIADB_NAMESPACE" \ --selector "app.kubernetes.io/name=mariadb" \ --for=condition=Ready \ --timeout="${timeout}s" } _do_install() { _require_env MARIADB_ROOT_PASSWORD if ! _namespace_exists; then _kubectl create namespace "$MARIADB_NAMESPACE" fi _kubectl create secret generic mariadb-credentials \ --namespace "$MARIADB_NAMESPACE" \ --from-literal=MARIADB_ROOT_PASSWORD="$MARIADB_ROOT_PASSWORD" \ --dry-run=client -o yaml | _kubectl apply -f - for manifest in storageclass.yaml namespace.yaml pvc.yaml statefulset.yaml service.yaml; do local path="$SCRIPT_DIR/manifests/${manifest}" [ -f "$path" ] && _kubectl apply -f "$path" done echo "Waiting for MariaDB pod to be ready..." _wait_for_pod 180 local post_install="$SCRIPT_DIR/manifests/post-install.sh" if [ -f "$post_install" ]; then bash "$post_install" fi echo "MariaDB installed in namespace $MARIADB_NAMESPACE" } _do_update() { _kubectl rollout restart statefulset/mariadb --namespace "$MARIADB_NAMESPACE" echo "Waiting for MariaDB to restart..." _wait_for_pod 120 echo "MariaDB updated" } _do_delete() { if _namespace_exists; then _kubectl delete namespace "$MARIADB_NAMESPACE" --timeout=60s echo "Namespace $MARIADB_NAMESPACE deleted" else echo "Namespace $MARIADB_NAMESPACE does not exist, nothing to delete" fi } _do_backup() { _require_env BACKUP_DIR _require_env MARIADB_ROOT_PASSWORD local pod timestamp backup_file pod=$(_pod_name) timestamp=$(date +%Y%m%d_%H%M%S) backup_file="${BACKUP_DIR}/mariadb_${timestamp}.sql.gz" mkdir -p "$BACKUP_DIR" _kubectl exec --namespace "$MARIADB_NAMESPACE" "$pod" -- \ mariadb-dump -u root --password="$MARIADB_ROOT_PASSWORD" --all-databases | gzip > "$backup_file" echo "Backup written to $backup_file" } _do_restore() { _require_env BACKUP_FILE _require_env MARIADB_ROOT_PASSWORD local pod pod=$(_pod_name) if [[ "$BACKUP_FILE" == *.gz ]]; then gunzip -c "$BACKUP_FILE" | _kubectl exec --stdin --namespace "$MARIADB_NAMESPACE" "$pod" -- \ mariadb -u root --password="$MARIADB_ROOT_PASSWORD" else _kubectl exec --stdin --namespace "$MARIADB_NAMESPACE" "$pod" -- \ mariadb -u root --password="$MARIADB_ROOT_PASSWORD" < "$BACKUP_FILE" fi echo "Restore completed from $BACKUP_FILE" } _do_health() { _require_env MARIADB_ROOT_PASSWORD local pod pod=$(_pod_name 2>/dev/null || true) if [ -z "$pod" ]; then echo "UNHEALTHY: no mariadb pod found in namespace $MARIADB_NAMESPACE" >&2 exit 1 fi if _kubectl exec --namespace "$MARIADB_NAMESPACE" "$pod" -- \ mariadb -u root --password="$MARIADB_ROOT_PASSWORD" -e "SELECT 1" >/dev/null 2>&1; then echo "HEALTHY: mariadb is accepting queries" else echo "UNHEALTHY: mariadb did not respond to SELECT 1" >&2 exit 1 fi } _do_config() { _require_env MARIADB_ROOT_PASSWORD local pod pod=$(_pod_name) _kubectl exec --namespace "$MARIADB_NAMESPACE" "$pod" -- \ mariadb -u root --password="$MARIADB_ROOT_PASSWORD" \ -e "SHOW VARIABLES WHERE Variable_name IN ('max_connections','innodb_buffer_pool_size','innodb_log_file_size','character_set_server','collation_server');" } case "$CMD_TSK" in install) _do_install ;; update) _do_update ;; delete) _do_delete ;; backup) _do_backup ;; restore) _do_restore ;; health) _do_health ;; config) _do_config ;; *) echo "ERROR: unknown CMD_TSK='$CMD_TSK'. Valid: install|update|delete|backup|restore|health|config" >&2 exit 1 ;; esac