Come creare un cloud ibrido utilizzando Kubernetes in grado di sostituire DBaaS

Mi chiamo Petr Zaitsev, sono il CEO, fondatore percona e voglio dirti:

  • come siamo passati dalle soluzioni open source al Database as a Service;
  • quali approcci esistono per distribuire i database nel cloud;
  • come Kubernetes può sostituire DBaaS, eliminando la dipendenza dal fornitore e mantenendo la semplicità del DBMS come servizio.

L'articolo è stato preparato sulla base di un rapporto del @Databases Meetup di Mail.ru Cloud Solutions & Tarantool. Se non vuoi leggere puoi guardare:


Come siamo passati dall'open source al Database as a Service nel cloud

Lavoro nell'open source dalla fine degli anni '90. Vent’anni fa, utilizzare l’open source, come i database, non era così semplice. Era necessario scaricare il codice sorgente, patcharlo, compilarlo e solo successivamente utilizzarlo.

L’open source ha poi subito una serie di semplificazioni:

  • Sorgenti Tar.gz e INSTALL che dovevano essere compilati;
  • pacchetti con dipendenze come .deb e .rpm, dove devi solo installare un set di pacchetti;
  • repository di pacchetti come APT e YUM, con i quali l'installazione è automatica;
  • soluzioni come Docker e Snap, che permettono di ricevere pacchetti tramite installazione senza dipendenze esterne.

Di conseguenza, diventa più semplice utilizzare software open source e si riducono anche le barriere all’ingresso nello sviluppo di tali applicazioni.

Allo stesso tempo, a differenza di 20 anni fa, quando tutti erano esperti di assemblaggio, ora la maggior parte degli sviluppatori non può creare gli strumenti che utilizza dal codice sorgente.

In effetti, questo non è male, perché:

  1. Possiamo utilizzare software più complessi ma più user-friendly. Ad esempio, un browser è comodo da usare, ma include molti componenti open source ed è scomodo crearlo da zero.
  2. Sempre più persone possono diventare sviluppatori di software open source e di altro tipo, più software viene utilizzato dalle aziende e la sua necessità è maggiore.

Lo svantaggio è che il prossimo passo verso la semplificazione è associato all’uso di soluzioni cloud, e questo porta a un certo “vendor lock-in”, cioè al vincolo a un unico fornitore. Utilizziamo soluzioni semplici e i fornitori utilizzano componenti open source, ma in realtà sono inchiodati a uno dei grandi cloud. Cioè, il modo più semplice e veloce per distribuire l'open source (e il software compatibile con esso) è nei cloud, utilizzando un'API proprietaria.

Quando si tratta di database nel cloud, esistono due approcci:

  1. Assemblare l'infrastruttura del database, come in un normale data center. Cioè, prendi gli elementi costitutivi standard: elaborazione, archiviazione e così via, installa Linux e un database su di essi e configurali.
  2. Utilizza Database as a Service, in cui il provider offre un database già pronto all'interno del cloud.

DBaaS è un mercato in rapida crescita in questo momento perché consente agli sviluppatori di lavorare direttamente con i database e riduce al minimo il lavoro di routine. Il fornitore si impegna a garantire elevata disponibilità e facile scalabilità, applicazione di patch al database, backup e ottimizzazione delle prestazioni.

Due tipi di Database as a Service basati sull'open source e un'alternativa sotto forma di Kubernetes

Esistono due tipi di Database as a Service per i database aperti:

  1. Un prodotto open source standard confezionato in un backend di amministrazione per una facile distribuzione e gestione.
  2. Una soluzione commerciale avanzata con vari componenti aggiuntivi, compatibile con l'open source.

Entrambe le opzioni riducono la possibilità di migrazione tra cloud e riducono la portabilità di dati e applicazioni. Ad esempio, nonostante diversi tipi di cloud supportino essenzialmente lo stesso standard MySQL, esistono differenze significative tra loro: funzionamento, prestazioni, backup e così via. La migrazione da un cloud all'altro può essere impegnativa, soprattutto per le applicazioni complesse.

E qui sorge la domanda: è possibile ottenere la comodità di Database as a Service, ma come una semplice soluzione open source?

La cattiva notizia è che purtroppo non esistono ancora soluzioni di questo tipo sul mercato. La buona notizia è che esiste Kubernetes, che consente di implementare tali soluzioni.

Kubernetes è un sistema operativo per il cloud o il data center che consente di distribuire e gestire un'applicazione su più server in un cluster anziché su un singolo host.

Ora Kubernetes è il leader nella categoria di tali software. Esistevano molte soluzioni diverse per tali problemi, ma è diventata lo standard. Molte aziende che prima si concentravano su soluzioni alternative ora si concentrano sull’adattamento dei propri prodotti per supportare Kubernetes.

Inoltre, Kubernetes è una soluzione universale supportata nei cloud privati, pubblici e ibridi di molti fornitori, ad esempio: AWS, Google Cloud, Microsoft Azure, Mail.ru soluzioni cloud.

Come funziona Kubernetes con i database

Kubernetes è stato originariamente progettato per applicazioni stateless che elaborano dati ma non archiviano nulla, come microservizi o applicazioni web. I database sono all'estremità opposta dello spettro, ovvero sono applicazioni stateful. E Kubernetes originariamente non era destinato a tali applicazioni.

Tuttavia, ci sono funzionalità apparse di recente in Kubernetes che consentono l'uso di database e altre applicazioni stateful:

  1. Il concetto StatefulSet è un'intera serie di primitive per l'elaborazione di eventi relativi all'arresto del lavoro dei pod e all'implementazione di Graceful Shutdown (arresto prevedibile dell'applicazione).
  2. I volumi persistenti sono archivi dati associati ai pod, oggetti di gestione Kubernetes.
  3. Operator Framework: ovvero la possibilità di creare componenti per la gestione di database e altre applicazioni con stato distribuite su più nodi.

Già ora nei cloud pubblici ci sono grandi Database as a Service, il cui backend è Kubernetes, ad esempio: CockroachCloud, InfluxDB, PlanetScale. Cioè un database su Kubernetes non è solo qualcosa che è teoricamente possibile, ma anche qualcosa che funziona nella pratica.

Percona dispone di due soluzioni open source per Kubernetes:

  1. Operatore Kubernetes per Percona Server per MongoDB.
  2. Kubernetes Operator for XtraDB CLUSTER è un servizio compatibile con MySQL e fornisce elevata disponibilità e coerenza. Puoi anche utilizzare un singolo nodo se non è necessaria la disponibilità elevata, ad esempio per un database di sviluppo.

Gli utenti Kubernetes possono essere divisi in due gruppi. Alcune persone utilizzano direttamente gli operatori Kubernetes: si tratta principalmente di utenti avanzati che hanno una buona conoscenza di come funziona la tecnologia. Altri lo eseguono nel backend: tali utenti sono interessati a qualcosa come Database as a Service, non vogliono approfondire le sfumature di Kubernetes. Per il secondo gruppo di utenti, abbiamo un'altra soluzione open source: Percona DBaaS CLI Tool. Questa è una soluzione sperimentale per coloro che desiderano ottenere un DBaaS open source basato su Kubernetes senza una profonda conoscenza della tecnologia.

Come eseguire DBaaS di Percona su Google Kubernetes Engine

Google Kubernetes Engine, secondo me, è una delle implementazioni più funzionali della tecnologia Kubernetes. È disponibile in molte regioni del mondo e dispone di uno strumento a riga di comando (SDK) semplice e conveniente, che consente di creare script anziché gestire manualmente la piattaforma.

Affinché il nostro DBaaS funzioni, abbiamo bisogno dei seguenti componenti:

  1. Kubectl.
  2. SDK di Google Cloud.
  3. CLI di Percona DBaaS.

Installa kubectl

Installiamo il pacchetto per il tuo sistema operativo, vedremo l'esempio di Ubuntu. Più dettagli qui.

sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl

Installazione dell'SDK di Google Cloud

Installiamo il pacchetto software allo stesso modo. Più dettagli qui.

# Add the Cloud SDK distribution URI as a package source
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] 
http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

# Import the Google Cloud Platform public key
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -

# Update the package list and install the Cloud SDK
sudo apt-get update && sudo apt-get install google-cloud-sdk

Installazione della CLI di Percona DBaaS

Installa dai repository Percona. Percona DBaaS CLI Tool è ancora un prodotto sperimentale, quindi si trova nel repository sperimentale, che deve essere abilitato separatamente, anche se hai già installato i repository Percona.

Più qui.

Algoritmo di installazione:

  1. Configura i repository Percona utilizzando lo strumento percona-release. Per prima cosa devi scaricare e installare il pacchetto ufficiale di percona-release da Percona:
    wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
    sudo dpkg -i percona-release_latest.generic_all.deb
  2. Abilita il componente repository dello strumento sperimentale come segue:
    sudo percona-release enable tools experimental
    
  3. Installa il pacchetto percona-dbaas-cli:
    sudo apt-get update
    sudo apt-get install percona-dbaas-cli

Impostazione del funzionamento dei componenti

Ulteriori informazioni sulle impostazioni qui.

Per prima cosa devi accedere al tuo account Google. Inoltre, Google Cloud consente a un utente di avere molti progetti indipendenti, quindi devi specificare un progetto funzionante utilizzando il codice per questo progetto:

gcloud auth login
gcloud config set project hidden-brace-236921

Successivamente, creiamo un cluster. Per la demo, ho creato un cluster Kubernetes di soli tre nodi: questo è il minimo richiesto per l'alta disponibilità:

gcloud container clusters create --zone us-central1-a your-cluster-name --cluster-version 1.15 --num-nodes=3

Il seguente comando kubectl fornisce i privilegi desiderati al nostro utente attuale:

kubectl create clusterrolebinding cluster-admin-binding-$USER 
--clusterrole=cluster-admin --user=$(gcloud config get-value core/account)

Quindi creiamo uno spazio dei nomi e lo rendiamo attivo. Anche il namespace è, grosso modo, come un progetto o un ambiente, ma già all'interno di un cluster Kubernetes. È indipendente dai progetti Google Cloud:

kubectl create namespace my-namespace
kubectl config set-context --current --namespace=my-namespace

Avvio del gruppo

Una volta eseguiti questi pochi passaggi, possiamo avviare un cluster a tre nodi con questo semplice comando:

# percona-dbaas mysql create-db example
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     example
Resource Endpoint: example-proxysql.my-namespace.pxc.svc.local
Port:              3306
User:              root
Pass:              Nt9YZquajW7nfVXTTrP
Status:            ready

Come connettersi a un cluster

Per impostazione predefinita, è disponibile solo all'interno di Kubernetes. Cioè, non è accessibile da questo server da cui hai eseguito il comando "Crea". Per renderla disponibile, ad esempio, per dei test con un client, è necessario inoltrare la porta tramite Port Mapping:

kubectl port-forward svc/example-proxysql 3306:3306 $

Quindi colleghiamo il tuo client MySQL:

mysql -h 127.0.0.1 -P 3306 -uroot -pNt9YZquajW7nfVXTTrP

Comandi avanzati di gestione del cluster

Database su IP pubblico

Se desideri una soluzione più permanente per la disponibilità del cluster, puoi ottenere un indirizzo IP esterno. In questo caso, il database sarà accessibile da qualsiasi luogo. Questo è meno sicuro, ma spesso più conveniente. Per l'IP esterno utilizziamo il seguente comando:

# percona-dbaas mysql create-db exposed 
--options="proxysql.serviceType=LoadBalancer"
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     exposed
Resource Endpoint: 104.154.133.197
Port:              3306
User:              root
Pass:              k0QVxTr8EVfgyCLYse
Status:            ready

To access database please run the following command:
mysql -h 104.154.133.197 -P 3306 -uroot -pk0QVxTr8EVfgyCLYse

Impostare esplicitamente la password

Invece di generare una password in modo casuale dal sistema, è possibile impostare la password in modo esplicito:

# percona-dbaas mysql create-db withpw --password=mypassword
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     withpw
Resource Endpoint: withpw-proxysql.my-namespace.pxc.svc.local
Port:              3306
User:              root
Pass:              mypassword
Status:            ready

Sto mostrando l'output degli script in formato leggibile dall'uomo, ma è supportato anche il formato JSON.

Disattivazione dell'alta disponibilità

Con il seguente comando puoi disabilitare l'alta disponibilità per distribuire un singolo nodo:

# percona-dbaas mysql create-db singlenode 
--options="proxysql.enabled=false, allowUnsafeConfigurations=true,pxc.size=1"
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     singlenode
Resource Endpoint: singlenode-pxc.my-namespace.pxc.svc.local
Port:              3306
User:              root
Pass:              22VqFD96mvRnmPMGg
Status:            ready

Si tratta di una soluzione per testare le attività per rendere MySQL attivo e funzionante nel modo più rapido e semplice possibile, testarlo e quindi spegnerlo o utilizzarlo per lo sviluppo.

Lo strumento CLI Percona DBaaS ti aiuta a ottenere una soluzione simile a DBaaS su Kubernetes. Allo stesso tempo, continuiamo a lavorare sulla sua funzionalità e usabilità.

Questo rapporto è stato presentato per la prima volta a @Incontro sui database di Mail.ru Soluzioni cloud&Tarantool. Aspetto video altri spettacoli e iscriviti agli annunci degli eventi su Telegram Intorno a Kubernetes nel gruppo Mail.ru.

Cos'altro leggere sull'argomento:

  1. Database in una moderna piattaforma IIoT.
  2. Come scegliere un database per un progetto in modo da non dover scegliere di nuovo.

Fonte: habr.com

Aggiungi un commento