So bauen Sie mit Kubernetes eine Hybrid-Cloud auf, die DBaaS ersetzen kann

Mein Name ist Petr Zaitsev, ich bin der CEO und Gründer Percona und ich möchte dir sagen:

  • wie wir von Open-Source-Lösungen zu Database as a Service kamen;
  • Welche Ansätze gibt es für die Bereitstellung von Datenbanken in der Cloud?
  • wie Kubernetes DBaaS ersetzen kann, die Abhängigkeit von Anbietern beseitigt und die Einfachheit von DBMS als Service beibehält.

Der Artikel wurde auf der Grundlage eines Berichts beim @Databases Meetup von Mail.ru Cloud Solutions & Tarantool erstellt. Wenn Sie nicht lesen möchten, können Sie Folgendes ansehen:


Wie wir von Open Source zu Database as a Service in der Cloud kamen

Ich arbeite seit Ende der 90er Jahre im Open-Source-Bereich. Vor zwanzig Jahren war die Nutzung von Open Source, etwa Datenbanken, nicht so einfach. Es war notwendig, den Quellcode herunterzuladen, ihn zu patchen, zu kompilieren und ihn erst dann zu verwenden.

Open Source durchlief dann eine Reihe von Vereinfachungen:

  • Tar.gz- und INSTALL-Quellen, die kompiliert werden mussten;
  • Pakete mit Abhängigkeiten wie .deb und .rpm, bei denen Sie nur eine Reihe von Paketen installieren müssen;
  • Paket-Repositorys wie APT und YUM, bei denen die Installation automatisch erfolgt;
  • Lösungen wie Docker und Snap, die es Ihnen ermöglichen, Pakete per Installation ohne externe Abhängigkeiten zu empfangen.

Dadurch wird die Nutzung von Open-Source-Software einfacher und die Hürde für den Einstieg in die Entwicklung solcher Anwendungen sinkt.

Gleichzeitig können die meisten Entwickler die von ihnen verwendeten Tools heute nicht mehr aus dem Quellcode erstellen, anders als vor 20 Jahren, als jeder ein Assembly-Experte war.

Tatsächlich ist das nicht schlecht, denn:

  1. Wir können komplexere, aber benutzerfreundlichere Software verwenden. Beispielsweise ist ein Browser bequem zu verwenden, er enthält jedoch viele Open-Source-Komponenten und ist unpraktisch, ihn von Grund auf neu zu erstellen.
  2. Mehr Menschen können Entwickler von Open-Source- und anderer Software werden, mehr Software wird von Unternehmen genutzt und der Bedarf daran ist größer.

Der Nachteil besteht darin, dass der nächste Schritt der Vereinfachung mit der Nutzung von Cloud-Lösungen verbunden ist und es zu einem gewissen Vendor-Lock-in, also einer Bindung an einen Lieferanten, kommt. Wir verwenden einfache Lösungen und Anbieter verwenden Open-Source-Komponenten, aber tatsächlich sind sie an eine der großen Clouds genagelt. Das heißt, der einfachste und schnellste Weg, Open Source (und damit kompatible Software) bereitzustellen, ist in den Clouds unter Verwendung einer proprietären API.

Wenn es um Datenbanken in der Cloud geht, gibt es zwei Ansätze:

  1. Bauen Sie die Datenbankinfrastruktur wie in einem normalen Rechenzentrum auf. Das heißt, man nimmt Standardbausteine: Rechner, Speicher usw., installiert darauf Linux und eine Datenbank und konfiguriert sie.
  2. Nutzen Sie Database as a Service, wobei der Anbieter eine vorgefertigte Datenbank in der Cloud anbietet.

DBaaS ist derzeit ein schnell wachsender Markt, da es Entwicklern die direkte Arbeit mit Datenbanken ermöglicht und Routinearbeiten minimiert. Der Anbieter verpflichtet sich, eine hohe Verfügbarkeit und einfache Skalierung, Datenbank-Patching, Backups und Performance-Tuning sicherzustellen.

Zwei Arten von Database as a Service basierend auf Open Source und eine Alternative in Form von Kubernetes

Es gibt zwei Arten von Database as a Service für offene Datenbanken:

  1. Ein Standard-Open-Source-Produkt, verpackt in einem Verwaltungs-Backend für einfache Bereitstellung und Verwaltung.
  2. Eine fortschrittliche kommerzielle Lösung mit verschiedenen Add-ons, kompatibel mit Open Source.

Beide Optionen reduzieren die Möglichkeit der Migration zwischen Clouds und verringern die Portabilität von Daten und Anwendungen. Obwohl beispielsweise verschiedene Arten von Clouds im Wesentlichen denselben MySQL-Standard unterstützen, gibt es erhebliche Unterschiede zwischen ihnen: im Betrieb, in der Leistung, im Backup usw. Die Migration von einer Cloud in eine andere kann eine Herausforderung sein, insbesondere bei komplexen Anwendungen.

Und hier stellt sich die Frage: Ist es möglich, den Komfort von Database as a Service zu nutzen, aber als einfache Open-Source-Lösung?

Die schlechte Nachricht ist, dass es leider noch keine derartigen Lösungen auf dem Markt gibt. Die gute Nachricht ist, dass es Kubernetes gibt, mit dem Sie solche Lösungen implementieren können.

Kubernetes ist ein Betriebssystem für die Cloud oder das Rechenzentrum, mit dem Sie eine Anwendung auf mehreren Servern in einem Cluster statt auf einem einzelnen Host bereitstellen und verwalten können.

Mittlerweile ist Kubernetes führend in der Kategorie dieser Software. Es gab viele verschiedene Lösungen für solche Probleme, aber es wurde zum Standard. Viele Unternehmen, die sich früher auf alternative Lösungen konzentrierten, konzentrieren sich heute auf die Anpassung ihrer Produkte an die Unterstützung von Kubernetes.

Darüber hinaus ist Kubernetes eine universelle Lösung, die in privaten, öffentlichen und hybriden Clouds vieler Anbieter unterstützt wird, zum Beispiel: AWS, Google Cloud, Microsoft Azure, Mail.ru Cloud-Lösungen.

Wie Kubernetes mit Datenbanken funktioniert

Kubernetes wurde ursprünglich für zustandslose Anwendungen entwickelt, die Daten verarbeiten, aber nichts speichern, wie zum Beispiel Microservices oder Webanwendungen. Datenbanken stehen am anderen Ende des Spektrums, das heißt, es handelt sich um zustandsbehaftete Anwendungen. Und Kubernetes war ursprünglich nicht für solche Anwendungen gedacht.

In Kubernetes sind jedoch kürzlich Funktionen aufgetaucht, die die Verwendung von Datenbanken und anderen zustandsbehafteten Anwendungen ermöglichen:

  1. Das StatefulSet-Konzept besteht aus einer ganzen Reihe von Grundelementen zur Verarbeitung von Ereignissen zum Stoppen der Arbeit von Pods und zur Implementierung von Graceful Shutdown (vorhersehbares Herunterfahren der Anwendung).
  2. Persistente Volumes sind Datenspeicher, die Pods, Kubernetes-Verwaltungsobjekten, zugeordnet sind.
  3. Operator Framework – also die Möglichkeit, Komponenten für die Verwaltung von Datenbanken und anderen zustandsbehafteten Anwendungen zu erstellen, die über viele Knoten verteilt sind.

In öffentlichen Clouds gibt es bereits große Datenbanken als Service, deren Backend Kubernetes ist, zum Beispiel: CockroachCloud, InfluxDB, PlanetScale. Das heißt, eine Datenbank auf Kubernetes ist nicht nur etwas, was theoretisch möglich ist, sondern auch etwas, das in der Praxis funktioniert.

Percona bietet zwei Open-Source-Lösungen für Kubernetes:

  1. Kubernetes-Operator für Percona Server für MongoDB.
  2. Kubernetes Operator für XtraDB CLUSTER ist ein Dienst, der mit MySQL kompatibel ist und hohe Verfügbarkeit und Konsistenz bietet. Sie können auch einen einzelnen Knoten verwenden, wenn keine hohe Verfügbarkeit erforderlich ist, beispielsweise für eine Entwicklungsdatenbank.

Kubernetes-Benutzer können in zwei Gruppen unterteilt werden. Manche Leute nutzen Kubernetes-Operatoren direkt – das sind hauptsächlich fortgeschrittene Benutzer, die ein gutes Verständnis für die Funktionsweise der Technologie haben. Andere führen es im Backend aus – solche Benutzer interessieren sich für so etwas wie Database as a Service, sie möchten sich nicht mit den Nuancen von Kubernetes befassen. Für die zweite Benutzergruppe haben wir eine weitere Open-Source-Lösung – das Percona DBaaS CLI Tool. Dies ist eine experimentelle Lösung für diejenigen, die ein Open-Source-DBaaS auf Basis von Kubernetes erhalten möchten, ohne ein tiefes Verständnis der Technologie zu haben.

So führen Sie Perconas DBaaS auf der Google Kubernetes Engine aus

Google Kubernetes Engine ist meiner Meinung nach eine der funktionalsten Implementierungen der Kubernetes-Technologie. Es ist in vielen Regionen der Welt verfügbar und verfügt über ein einfaches und praktisches Befehlszeilentool (SDK), mit dem Sie Skripte erstellen können, anstatt die Plattform manuell zu verwalten.

Damit unser DBaaS funktioniert, benötigen wir folgende Komponenten:

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

Installieren Sie kubectl

Wir installieren das Paket für Ihr Betriebssystem, wir schauen uns das Beispiel von Ubuntu an. Mehr Details hier.

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

Google Cloud SDK installieren

Auf die gleiche Weise installieren wir das Softwarepaket. Mehr Details hier.

# 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

Installieren der Percona DBaaS-CLI

Installation aus den Percona-Repositorys. Das Percona DBaaS CLI Tool ist noch ein experimentelles Produkt und befindet sich daher im experimentellen Repository, das separat aktiviert werden muss, auch wenn Sie bereits Percona-Repositorys installiert haben.

mehr hier.

Installationsalgorithmus:

  1. Richten Sie Percona-Repositorys mit dem Percona-Release-Tool ein. Zuerst müssen Sie das offizielle Percona-Release-Paket von Percona herunterladen und installieren:
    wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
    sudo dpkg -i percona-release_latest.generic_all.deb
  2. Aktivieren Sie die experimentelle Tool-Repository-Komponente wie folgt:
    sudo percona-release enable tools experimental
    
  3. Installieren Sie das Paket percona-dbaas-cli:
    sudo apt-get update
    sudo apt-get install percona-dbaas-cli

Einrichten des Betriebs von Komponenten

Mehr über Einstellungen hier.

Zuerst müssen Sie sich bei Ihrem Google-Konto anmelden. Darüber hinaus ermöglicht Google Cloud einem Benutzer, viele unabhängige Projekte zu haben, sodass Sie ein funktionierendes Projekt mithilfe des Codes für dieses Projekt angeben müssen:

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

Als nächstes erstellen wir einen Cluster. Für die Demo habe ich einen Kubernetes-Cluster mit nur drei Knoten erstellt – das ist das für Hochverfügbarkeit erforderliche Minimum:

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

Der folgende kubectl-Befehl gewährt unserem aktuellen Benutzer die gewünschten Berechtigungen:

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

Dann erstellen wir einen Namespace und machen ihn aktiv. Ein Namespace ist grob gesagt auch wie ein Projekt oder eine Umgebung, allerdings bereits innerhalb eines Kubernetes-Clusters. Es ist unabhängig von Google Cloud-Projekten:

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

Starten des Clusters

Sobald wir diese wenigen Schritte ausgeführt haben, können wir mit diesem einfachen Befehl einen Cluster mit drei Knoten starten:

# 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

So stellen Sie eine Verbindung zu einem Cluster her

Standardmäßig ist es nur innerhalb von Kubernetes verfügbar. Das heißt, von diesem Server aus, von dem aus Sie den Befehl „Erstellen“ ausgeführt haben, ist der Zugriff nicht möglich. Um ihn beispielsweise für Tests mit einem Client verfügbar zu machen, müssen Sie den Port über Port Mapping weiterleiten:

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

Dann verbinden wir Ihren MySQL-Client:

mysql -h 127.0.0.1 -P 3306 -uroot -pNt9YZquajW7nfVXTTrP

Erweiterte Befehle zur Clusterverwaltung

Datenbank auf öffentlicher IP

Wenn Sie eine dauerhaftere Lösung für die Clusterverfügbarkeit wünschen, können Sie eine externe IP-Adresse erhalten. In diesem Fall ist die Datenbank von überall aus zugänglich. Das ist weniger sicher, aber oft bequemer. Für externe IP verwenden wir den folgenden Befehl:

# 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

Legen Sie das Passwort explizit fest

Anstatt dass das System ein Passwort zufällig generiert, können Sie das Passwort explizit festlegen:

# 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

Ich zeige die Ausgabe der Skripte in einem für Menschen lesbaren Format, aber auch das JSON-Format wird unterstützt.

Hochverfügbarkeit deaktivieren

Mit dem folgenden Befehl können Sie die Hochverfügbarkeit deaktivieren, um einen einzelnen Knoten bereitzustellen:

# 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

Dies ist eine Lösung für Testaufgaben, um MySQL so schnell und einfach wie möglich zum Laufen zu bringen, es zu testen und es dann herunterzufahren oder für die Entwicklung zu verwenden.

Das Percona DBaaS CLI-Tool hilft Ihnen, eine DBaaS-ähnliche Lösung auf Kubernetes zu erreichen. Gleichzeitig arbeiten wir weiter an der Funktionalität und Benutzerfreundlichkeit.

Dieser Bericht wurde erstmals vorgestellt bei @Databases Meetup von Mail.ru Cloud Solutions&Tarantool. Suchen Video andere Aufführungen und abonnieren Sie Veranstaltungsankündigungen auf Telegram Rund um Kubernetes bei der Mail.ru Group.

Was es sonst noch zum Thema zu lesen gibt:

  1. Datenbanken in einer modernen IIoT-Plattform.
  2. So wählen Sie eine Datenbank für ein Projekt aus, damit Sie sich nicht erneut entscheiden müssen.

Source: habr.com

Kommentar hinzufügen