Hur man bygger ett hybridmoln med Kubernetes som kan ersätta DBaaS

Jag heter Petr Zaitsev, jag är VD, grundare percona och jag vill berätta:

  • hur vi kom från lösningar med öppen källkod till Database as a Service;
  • vilka metoder finns för att distribuera databaser i molnet;
  • hur Kubernetes kan ersätta DBaaS, eliminera leverantörsberoende och bibehålla enkelheten hos DBMS som en tjänst.

Artikeln utarbetades baserat på en rapport på @Databases Meetup av Mail.ru Cloud Solutions & Tarantool. Om du inte vill läsa kan du titta på:


Hur vi kom från öppen källkod till Database as a Service i molnet

Jag har arbetat med öppen källkod sedan slutet av 90-talet. För tjugo år sedan var det inte så lätt att använda öppen källkod, som databaser. Det var nödvändigt att ladda ner källkoden, patcha den, kompilera den och först därefter använda den.

Öppen källkod gick sedan igenom en rad förenklingar:

  • Tar.gz och INSTALL källor som behövde kompileras;
  • paket med beroenden som .deb och .rpm, där du bara behöver installera en uppsättning paket;
  • paketförråd som APT och YUM, med vilka installationen är automatisk;
  • lösningar som Docker och Snap, som låter dig ta emot paket genom installation utan externa beroenden.

Som ett resultat blir det lättare att använda programvara med öppen källkod och sänker också inträdesbarriären för att utveckla sådana applikationer.

Samtidigt, till skillnad från situationen för 20 år sedan, när alla var monteringsexperter, kan nu de flesta utvecklare inte bygga verktygen de använder från källan.

Faktum är att detta inte är dåligt, eftersom:

  1. Vi kan använda mer komplex men mer användarvänlig programvara. En webbläsare är till exempel bekväm att använda, men den innehåller många komponenter med öppen källkod och är obekväm att bygga från grunden.
  2. Fler kan bli utvecklare av öppen källkod och annan programvara, mer programvara används av företag och behovet av det är större.

Nackdelen är att nästa steg i förenkling är förknippat med användningen av molnlösningar och det leder till en viss leverantörslåsning, det vill säga bindning till en leverantör. Vi använder enkla lösningar och leverantörer använder komponenter med öppen källkod, men i själva verket är de spikade till ett av de stora molnen. Det vill säga, det enklaste och snabbaste sättet att distribuera öppen källkod (och programvara som är kompatibel med den) är i molnen, med hjälp av ett proprietärt API.

När det kommer till databaser i molnet finns det två tillvägagångssätt:

  1. Sätt ihop databasinfrastrukturen, som i ett vanligt datacenter. Det vill säga, ta standardbyggstenar: beräkna, lagring och så vidare, installera Linux och en databas på dem och konfigurera dem.
  2. Använd Database as a Service, där leverantören erbjuder en färdig databas inuti molnet.

DBaaS är en snabbt växande marknad just nu eftersom det tillåter utvecklare att arbeta direkt med databaser och minimerar rutinarbete. Leverantören åtar sig att säkerställa hög tillgänglighet och enkel skalning, databaspatchning, säkerhetskopiering och prestandajustering.

Två typer av Database as a Service baserad på öppen källkod och ett alternativ i form av Kubernetes

Det finns två typer av Database as a Service för öppna databaser:

  1. En standardprodukt med öppen källkod förpackad i en administrationsbackend för enkel distribution och hantering.
  2. En avancerad kommersiell lösning med olika tillägg, kompatibel med öppen källkod.

Båda alternativen minskar möjligheten till migrering mellan moln och minskar portabiliteten av data och applikationer. Till exempel, trots att olika typer av moln stöder i huvudsak samma standard MySQL, finns det betydande skillnader mellan dem: i drift, prestanda, säkerhetskopiering och så vidare. Att migrera från ett moln till ett annat kan vara utmanande, särskilt för komplexa applikationer.

Och här uppstår frågan - är det möjligt att få bekvämligheten med Database as a Service, men som en enkel öppen källkodslösning?

Den dåliga nyheten är att det tyvärr inte finns några sådana lösningar på marknaden ännu. Den goda nyheten är att det finns Kubernetes, som låter dig implementera sådana lösningar.

Kubernetes är ett operativsystem för molnet eller datacentret som låter dig distribuera och hantera en applikation över flera servrar i ett kluster snarare än på en enda värd.

Nu är Kubernetes ledande inom kategorin för sådan programvara. Det fanns många olika lösningar på sådana problem, men det blev standarden. Många företag som tidigare fokuserade på alternativa lösningar fokuserar nu på att anpassa sina produkter för att stödja Kubernetes.

Dessutom är Kubernetes en universell lösning som stöds i privata, offentliga och hybridmoln från många leverantörer, till exempel: AWS, Google Cloud, Microsoft Azure, Mail.ru molnlösningar.

Hur Kubernetes fungerar med databaser

Kubernetes designades ursprungligen för tillståndslösa applikationer som bearbetar data men inte lagrar någonting, till exempel mikrotjänster eller webbapplikationer. Databaser finns i andra änden av spektrumet, det vill säga de är tillståndsfulla applikationer. Och Kubernetes var ursprungligen inte avsedd för sådana applikationer.

Det finns dock funktioner som har dykt upp i Kubernetes nyligen som tillåter användning av databaser och andra stateful applikationer:

  1. StatefulSet-konceptet är en hel serie primitiver för att bearbeta händelser om att stoppa arbetet med poddar och implementera Graceful Shutdown (förutsägbar avstängning av applikationen).
  2. Beständiga volymer är datalager som är associerade med poddar, Kubernetes-hanteringsobjekt.
  3. Operator Framework - det vill säga möjligheten att skapa komponenter för hantering av databaser och andra stateful applikationer fördelade över många noder.

Redan nu i publika moln finns det stora Databaser as a Service, vars backend är Kubernetes, till exempel: CockroachCloud, InfluxDB, PlanetScale. Det vill säga att en databas på Kubernetes inte bara är något som är teoretiskt möjligt, utan också något som fungerar i praktiken.

Percona har två open source-lösningar för Kubernetes:

  1. Kubernetes Operator för Percona Server för MongoDB.
  2. Kubernetes Operator for XtraDB CLUSTER är en tjänst som är kompatibel med MySQL och ger hög tillgänglighet och konsekvens. Du kan också använda en enda nod om hög tillgänglighet inte behövs, till exempel för en dev-databas.

Kubernetes-användare kan delas in i två grupper. Vissa använder Kubernetes Operators direkt – det är främst avancerade användare som har god förståelse för hur tekniken fungerar. Andra kör det på backend - sådana användare är intresserade av något som Database as a Service, de vill inte fördjupa sig i Kubernetes nyanser. För den andra gruppen användare har vi en annan öppen källkodslösning - Percona DBaaS CLI Tool. Detta är en experimentell lösning för dig som vill skaffa en öppen källkod DBaaS baserad på Kubernetes utan en djup förståelse för tekniken.

Hur man kör Perconas DBaaS på Google Kubernetes Engine

Google Kubernetes Engine, enligt min mening, är en av de mest funktionella implementeringarna av Kubernetes-teknik. Det är tillgängligt i många regioner i världen och har ett enkelt och bekvämt kommandoradsverktyg (SDK), som låter dig skapa skript istället för att manuellt hantera plattformen.

För att vår DBaaS ska fungera behöver vi följande komponenter:

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

Installera kubectl

Vi installerar paketet för ditt operativsystem, vi kommer att titta på exemplet med Ubuntu. Fler detaljer här.

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

Installerar Google Cloud SDK

Vi installerar mjukvarupaketet på samma sätt. Fler detaljer här.

# 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

Installerar Percona DBaaS CLI

Installera från Perconas arkiv. Percona DBaaS CLI Tool är fortfarande en experimentell produkt, så den finns i experimentförrådet, som måste aktiveras separat, även om du redan har Percona-förråd installerade.

Mer här.

Installationsalgoritm:

  1. Ställ in Percona-förråd med hjälp av percona-release-verktyget. Först måste du ladda ner och installera det officiella percona-release-paketet från Percona:
    wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
    sudo dpkg -i percona-release_latest.generic_all.deb
  2. Aktivera den experimentella verktygsförvarskomponenten enligt följande:
    sudo percona-release enable tools experimental
    
  3. Installera percona-dbaas-cli-paketet:
    sudo apt-get update
    sudo apt-get install percona-dbaas-cli

Inställning av driften av komponenter

Mer om inställningar här.

Först måste du logga in på ditt Google-konto. Dessutom tillåter Google Cloud en användare att ha många oberoende projekt, så du måste ange ett fungerande projekt med koden för detta projekt:

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

Därefter skapar vi ett kluster. För demon skapade jag ett Kubernetes-kluster med endast tre noder - detta är det minimum som krävs för hög tillgänglighet:

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

Följande kubectl-kommando ger önskade privilegier till vår nuvarande användare:

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

Sedan skapar vi ett namnutrymme och gör det aktivt. Namnutrymme är, grovt sett, också som ett projekt eller en miljö, men redan inne i ett Kubernetes-kluster. Det är oberoende av Google Cloud-projekt:

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

Startar klustret

När vi har gått igenom dessa få steg kan vi starta ett tre-nodskluster med detta enkla kommando:

# 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

Hur man ansluter till ett kluster

Som standard är det bara tillgängligt i Kubernetes. Det vill säga, det är inte tillgängligt från den här servern från vilken du körde kommandot "Skapa". För att göra den tillgänglig, till exempel för tester med en klient, måste du vidarebefordra porten via Port Mapping:

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

Sedan kopplar vi din MySQL-klient:

mysql -h 127.0.0.1 -P 3306 -uroot -pNt9YZquajW7nfVXTTrP

Avancerade kommandon för klusterhantering

Databas om offentlig IP

Om du vill ha en mer permanent lösning för klustertillgänglighet kan du få en extern IP-adress. I det här fallet kommer databasen att vara tillgänglig var som helst. Detta är mindre säkert, men ofta mer bekvämt. För extern IP använder vi följande kommando:

# 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

Ange lösenordet uttryckligen

Istället för att systemet slumpmässigt genererar ett lösenord, kan du ange lösenordet uttryckligen:

# 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

Jag visar utdata från skripten i läsbart format, men JSON-format stöds också.

Stänger av hög tillgänglighet

Med följande kommando kan du inaktivera hög tillgänglighet för att distribuera en enda nod:

# 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

Detta är en lösning för att testa uppgifter för att få igång MySQL så snabbt och enkelt som möjligt, testa det och sedan stänga av det eller använda det för utveckling.

Percona DBaaS CLI-verktyget hjälper dig att uppnå en DBaaS-liknande lösning på Kubernetes. Samtidigt fortsätter vi att arbeta med dess funktionalitet och användbarhet.

Denna rapport presenterades först kl @Databas Meetup av Mail.ru Cloud Solutions&Tarantool. Se video andra föreställningar och prenumerera på evenemangsmeddelanden på Telegram Runt Kubernetes på Mail.ru Group.

Vad mer att läsa om ämnet:

  1. Databaser i en modern IIoT-plattform.
  2. Hur man väljer en databas för ett projekt så att du inte behöver välja igen.

Källa: will.com

Lägg en kommentar