Vai al contenuto principale
Versione: 3.0.0-alpha (Diátaxis)

Distribuire MySQL in 5 minuti

Questa guida vi accompagna nel deployment del vostro primo database MySQL su Hikube, dall'installazione alla prima connessione.


Obiettivi

Alla fine di questa guida, avrete:

  • Un database MySQL operativo su Hikube
  • Un cluster replicato con un primary e delle repliche per garantire l'alta disponibilità
  • Utenti e password per accedere alle vostre applicazioni
  • Un'archiviazione persistente collegata a ogni istanza per garantire la durabilita dei dati
  • (Opzionale) La possibilità di attivare backup automatici verso uno storage compatibile S3

Prerequisiti

Prima di iniziare, assicuratevi di avere:

  • kubectl configurato con il vostro kubeconfig Hikube
  • Diritti di amministratore sul vostro tenant
  • Un namespace disponibile per ospitare il vostro database
  • (Opzionale) Un bucket S3-compatible se desiderate attivare i backup automatici tramite MariaDB-Operator

Passo 1: Creare il manifesto MySQL

Preparate il file manifest

Create un file mysql.yaml come segue:

mysql.yaml
apiVersion: apps.cozystack.io/v1alpha1
kind: MySQL
metadata:
name: example
spec:
backup:
cleanupStrategy: --keep-last=3 --keep-daily=3 --keep-within-weekly=1m
enabled: false
resticPassword: <password>
s3AccessKey: <your-access-key>
s3Bucket: s3.example.org/mysql-backups
s3Region: us-east-1
s3SecretKey: <your-secret-key>
schedule: 0 2 * * *
databases:
myapp1:
roles:
admin:
- user1
readonly:
- user2
external: true
replicas: 3
resources:
cpu: 3000m
memory: 3Gi
resourcesPreset: nano
size: 10Gi
storageClass: ""
users:
user1:
maxUserConnections: 1000
password: hackme
user2:
maxUserConnections: 1000
password: hackme

Distribuite il yaml MySQL

# Applicare il yaml
kubectl apply -f mysql.yaml

Passo 2: Verifica del deployment

Verificate lo stato del vostro cluster MySQL (può richiedere 1-2 minuti):

kubectl get mysql

Risultato atteso:

NAME      READY   AGE     VERSION
example True 1m16s 0.10.0

Passo 3: Verifica dei pod

Verificate che i pod applicativi siano nello stato Running:

kubectl get po -o wide | grep mysql

Risultato atteso:

mysql-example-0                                   1/1     Running     0             24m   10.244.123.64    gld-csxhk-006   <none>           <none>
mysql-example-1 1/1 Running 0 24m 10.244.123.65 luc-csxhk-005 <none> <none>
mysql-example-2 1/1 Running 0 24m 10.244.123.66 plo-csxhk-001 <none> <none>
mysql-example-metrics-747cf456c9-6vnq9 1/1 Running 0 23m 10.244.123.73 plo-csxhk-004 <none> <none>

Con replicas: 3, ottenete 3 istanze MySQL (1 primary + 2 repliche) distribuite su datacenter diversi, più un pod di metriche.

Verificate che ogni istanza disponga di un volume persistente (PVC):

kubectl get pvc | grep mysql

Risultato atteso:

storage-mysql-example-0                    Bound     pvc-3622a61d-7432-4a36-9812-953e30f85fbe   10Gi       RWO            local          <unset>                 24m
storage-mysql-example-1 Bound pvc-b9933029-c9c6-40c2-a67d-69dcb224a9bb 10Gi RWO local <unset> 24m
storage-mysql-example-2 Bound pvc-597da2f3-1604-416c-a480-2dae7aae75e1 10Gi RWO local <unset> 24m

Passo 4: Recuperare le credenziali

Le password sono memorizzate in un Secret Kubernetes:

kubectl get secret mysql-example-credentials -o json | jq -r '.data | to_entries[] | "\(.key): \(.value|@base64d)"'

Risultato atteso:

root: cr42msoxKhnEajfo
user1: hackme
user2: hackme

Passo 5: Connessione e test

Accesso esterno (se external: true)

Verificate i servizi disponibili:

kubectl get svc | grep mysql
mysql-example                        ClusterIP      10.96.149.25    <none>          3306/TCP                     27m
mysql-example-internal ClusterIP None <none> 3306/TCP 27m
mysql-example-metrics ClusterIP 10.96.101.154 <none> 9104/TCP 26m
mysql-example-primary LoadBalancer 10.96.161.170 91.223.132.64 3306:32537/TCP 27m
mysql-example-secondary ClusterIP 10.96.105.28 <none> 3306/TCP 27m

Accesso tramite port-forward (se external: false)

kubectl port-forward svc/mysql-example 3306:3306
nota

Si raccomanda di non esporre il database all'esterno se non ne avete necessità.

Test di connessione con mysql

mysql -h 91.223.132.64 -u user1 -p myapp1
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1214
Server version: 11.0.2-MariaDB-1:11.0.2+maria~ubu2204-log mariadb.org binary distribution

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

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| myapp1 |
+--------------------+
2 rows in set (0.00 sec)

mysql>

Passo 6: Risoluzione rapida dei problemi

Pod in CrashLoopBackOff

# Verificare i log del pod in errore
kubectl logs mysql-example-0

# Verificare gli eventi del pod
kubectl describe pod mysql-example-0

Cause frequenti: memoria insufficiente (resources.memory troppo bassa), volume di archiviazione pieno, errore di configurazione MariaDB.

MySQL non accessibile

# Verificare che i servizi esistano
kubectl get svc | grep mysql

# Verificare che il LoadBalancer abbia un IP esterno
kubectl describe svc mysql-example-primary

Cause frequenti: external: false nel manifesto, LoadBalancer in attesa di assegnazione IP, porta o nome host errato nella stringa di connessione.

Replica in errore

# Verificare lo stato del cluster MariaDB
kubectl get mariadb

# Ispezionare i dettagli della risorsa MariaDB
kubectl describe mariadb mysql-example

Cause frequenti: binlog eliminato prima della sincronizzazione di una replica, spazio disco insufficiente, problema di rete tra i nodi.

Comandi di diagnostica generali

# Eventi recenti sul namespace
kubectl get events --sort-by=.metadata.creationTimestamp

# Stato dettagliato del cluster MySQL
kubectl describe mysql example

Avete distribuito:

  • Un database MySQL sul vostro tenant Hikube
  • Un cluster replicato con un primary e delle repliche per assicurare la continuità del servizio
  • Utenti creati automaticamente, con le loro credenziali memorizzate nei Secret Kubernetes
  • Un'archiviazione persistente (PVC) dedicata a ogni pod MySQL per garantire la durabilita dei dati
  • Un accesso sicuro tramite il client mysql (port-forward o LoadBalancer)
  • La possibilità di configurare backup S3 e ripristinare in caso di necessità

Pulizia

Per eliminare le risorse di test:

kubectl delete -f mysql.yaml
avviso

Questa azione elimina il cluster MySQL e tutti i dati associati. Questa operazione e irreversibile.


Prossimi passi

  • Riferimento API: Configurazione completa di tutte le opzioni MySQL
  • Panoramica: Architettura dettagliata e casi d'uso MySQL su Hikube