Как да изградим хибридно облако с Kubernetes, което може да замени DBaaS

Казвам се Петър Зайцев, аз съм главен изпълнителен директор и основател Percona и искам да разкажа:

  • как преминахме от решения с отворен код към Database as a Service;
  • какви подходи съществуват за внедряване на бази данни в облака;
  • как Kubernetes може да замени DBaaS, премахвайки зависимостта от доставчика и запазвайки простотата на СУБД като услуга.

Статията е подготвена на базата на доклад на @Databases Meetup от Mail.ru Cloud Solutions & Tarantool. Ако не искате да четете, можете да гледате:

Възпроизведи видео

Как преминахме от open source към Database as a Service в облака

Занимавам се с open source от края на 90-те години. Преди двадесет години използването на open source, например бази данни, не беше толкова лесно. Трябваше да свалите изходния код, да го патчнете, да го компилирате и едва след това да го използвате.

След това open source премина през серия на опростяване:

  • изходни кодове Tar.gz и INSTALL, които трябваше да се компилират;
  • пакети с зависимости като .deb и .rpm, където просто трябва да инсталирате набор от пакети;
  • репозитории на пакети като APT и YUM, с помощта на които инсталацията става автоматично;
  • такива решения като Docker и Snap, които позволяват получаване на пакети по инсталация без външни зависимости.

В крайна сметка използването на отворен софтуер става по-лесно, а и бариерата за влизане в разработката на такива приложения се снижава.

При това, за разлика от ситуацията преди 20 години, когато всички бяха експерти по компилация, сега повечето разработчици не могат да компилират използваните инструменти.

Всъщност, това не е лошо, тъй като:

  1. Можем да използваме по-сложен, но удобен софтуер. Например, браузърът — лесно е да се използва, но той включва много компоненти с отворен код и е неудобно да се компилира от нулата.
  2. Повече хора могат да станат разработчици на open source и друг софтуер, повече софтуер се използва от бизнеса, а нуждата от него нараства.

Обратната страна — следващата стъпка в опростяването е свързана с използването на облачни решения, което води до определен vendor lock-in, т.е. привързаност към един доставчик. Ние използваме прости решения и доставчиците използват компоненти с отворен код, но всъщност те са приковани към едно от големите облака. Тоест, най-простият и бърз начин за внедряване на open source (и съвместим софтуер) е в облаците, използвайки проприетарен API.

Ако говорим за бази данни в облака, съществуват два подхода:

  1. Създайте инфраструктурата на базата данни, както в обикновен дата център. Тоест, вземете стандартните компоненти: изчислителни ресурси, хранилище и т.н., инсталирайте Linux, базата данни и я конфигурирайте.
  2. Използвайте Database as a Service, където доставчикът предлага готова база данни в облака.

В момента DBaaS е бързо развиващ се пазар, тъй като тази услуга позволява на разработчиците да работят директно с бази данни и минимизира рутинната работа. Доставчикът поема осигуряването на висока наличност и лесно мащабиране, актуализация на базата данни, резервни копия и конфигуриране на производителността.

Два типа Database as a Service на база open source и алтернатива под формата на Kubernetes.

Има два типа Database as a Service за отворени бази данни:

  1. Стандартен open source продукт, опакован в бекенда за администриране, което улеснява внедряването и управлението.
  2. Развито търговско решение с различни допълнения, съвместимо с open source.

И двата варианта намаляват възможността за миграция между облаците, намаляват преносимостта на данните и приложенията. Например, въпреки че различните видове облаци поддържат по същество същия стандартен MySQL, между тях съществуват съществени разлики в работата, производителността, резервните копия и т.н. Миграцията от един облак на друг може да бъде трудна, особено за сложни приложения.

И тук възниква въпросът — може ли да се получи удобството на Database as a Service, но под формата на обикновено open source решение?

Лошата новина е, че за съжаление в момента на пазара няма такива решения. Добрата новина е, че има Kubernetes, който позволява реализирането на такива решения.

Kubernetes е операционна система за облак или дата център, която позволява внедряване на приложения и управление на тях на множество сървъри в кластер, а не на един хост.

В момента Kubernetes е лидер в категорията на подобен софтуер. За тези задачи е имало много различни решения, но именно той стана стандарт. Много компании, които преди се занимаваха с алтернативни решения, в момента се фокусират върху адаптацията на своите продукти за поддръжка на Kubernetes.

Освен това, Kubernetes е универсално решение, което се поддържа в частни, публични и хибридни облаци от много доставчици, например: AWS, Google Cloud, Microsoft Azure. Mail.ru Cloud Solutions.

Как Kubernetes работи с бази данни

Kubernetes първоначално беше разработен за stateless приложения, които обработват данни, но не съхраняват нищо, например микросервизи или уеб приложения. Базите данни са на другия край на спектъра, тоест те са stateful приложения. И Kubernetes първоначално не беше предназначен за такива приложения.

Въпреки това, напоследък се появиха функции в Kubernetes, които позволяват използването на бази данни и други stateful приложения:

  1. Концепцията StatefulSet е серия от примитиви за обработка на събития при спиране на подовете и осъществяване на Graceful Shutdown (предсказуемо завършване на работата на приложението).
  2. Persistent Volumes — хранилища за данни, които са свързани с подовете, управлявани от Kubernetes.
  3. Operator Framework — възможността за създаване на компоненти за управление на бази данни и други stateful приложения, разположени на много възли.

Вече има големи Database as a Service в публичните облаци, базирани на Kubernetes, например: CockroachCloud, InfluxDB, PlanetScale. Тоест, база данни на Kubernetes не е само теоретично възможна, но и работеща на практика.

Percona предлага две open source решения за Kubernetes:

  1. Kubernetes Operator за Percona Server за MongoDB.
  2. Kubernetes Operator за XtraDB CLUSTER — услуга, съвместима с MySQL, която осигурява висока наличност и последователност. Може също така да се използва single node, ако висока наличност не е необходима, например за dev база данни.

Потребителите на Kubernetes могат да бъдат разделени на две групи. Едните използват Kubernetes Operators директно — това са основно напреднали потребители, които добре разбират как работи технологията. Другите го стартират на бекенда — тези потребители се интересуват от нещо като Database as a Service, не искат да навлизат в детайлите на работата на Kubernetes. За втората група потребители имаме още едно open source решение — Percona DBaaS CLI Tool. Това е експериментално решение за тези, които искат да получат open source DBaaS на основата на Kubernetes без задълбочено разбиране на технологията.

Как да стартирате DBaaS от Percona на Google Kubernetes Engine

Google Kubernetes Engine, според мен, е една от най-функционалните реализации на технологията Kubernetes. Тя е налична в много региони по света и разполага с прост и удобен Command Line Tool (SDK), който позволява създаването на скриптове, вместо да се управлява платформата ръчно.

За да заработи нашият DBaaS, нуждаем се от следните компоненти:

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

Инсталираме kubectl

Инсталираме пакета за вашата операционна система, ще разгледаме на примера на Ubuntu. Повече информация тук.

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

Подобно инсталираме пакета. Повече информация тук.

# 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

Инсталираме Percona DBaaS CLI

Инсталираме от репозиторите на Percona. Инструментът Percona DBaaS CLI е все още експериментален продукт, затова е в експериментален репозиторий, който трябва да бъде активиран отделно, дори и ако вече имате инсталирани репозитории на Percona.

Научете повече тук.

Алгоритъм за инсталация:

  1. Настройте репозиторите на Percona с инструмента percona-release. Първо трябва да изтеглите и инсталирате официалния пакет percona-release от Percona:
    wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
    sudo dpkg -i percona-release_latest.generic_all.deb
  2. Активирайте експерименталния компонент на инструменти в репозитория по следния начин:
    sudo percona-release enable tools experimental
    
  3. Инсталирайте пакета percona-dbaas-cli:
    sudo apt-get update
    sudo apt-get install percona-dbaas-cli

Настройваме работата на компонентите

Повече за настройките тук.

Първо трябва да влезете в акаунта си в Google. След това Google Cloud позволява на един потребител да има множество независими проекти, затова е нужно да посочите работния проект, използвайки кода на този проект:

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

След това създаваме клъстер. За демонстрация, създадох Kubernetes клъстер само от три нода — това е минимумът, необходим за висока наличност:

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

Следващата команда kubectl дава необходимите права на текущия ни потребител:

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

След това създаваме namespace и го активираме. Namespace е, грубо казано, нещо като проект или среда, но вече в Kubernetes клъстера. Той е независим от проектите в Google Cloud:

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

Стартираме клъстера

След като преминем през тези няколко стъпки, можем да стартираме клъстера от три възела с тази проста команда:

# 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

Как да се свържем с клъстера

По подразбиране той е наличен само вътре в Kubernetes. Тоест, от сървъра, от който сте пуснали командата «Създаване», той не е достъпен. За да стане достъпен, например за тестове с клиент, трябва да пренасочите порта чрез Port Mapping:

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

След това свържете вашия MySQL клиент:

mysql -h 127.0.0.1 -P 3306 -uroot -pNt9YZquajW7nfVXTTrP

Разширени команди за управление на клъстера

База данни на публичен IP

Ако искате по-постоянно решение за достъпност на клъстера, можете да получите външен IP адрес. В този случай базата данни ще бъде достъпна от всякъде. Това е по-малко безопасно, но често по-удобно. За външен IP използваме следната команда:

# 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

Явно задаваме парола

Вместо системата да генерира парола случайно, можете да зададете парола явно:

# 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

Показвам изхода на скриптовете в четим формат, но също така се поддържа JSON формат.

Изключваме висока достъпност

Следващата команда може да изключи високата достъпност, за да се развие единичен възел:

# 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

Това решение е за тестови задачи, за да се настрои MySQL максимално бързо и лесно, да се тества и след това да се затвори или използва за разработка.

Инструментът Percona DBaaS CLI помага да се получи решение на Kubernetes, подобно на DBaaS. В същото време продължаваме да работим върху функционалността и ползваемостта му.

Тази презентация за първи път прозвуча на @Databases Meetup от Mail.ru Cloud Solutions&Tarantool. Вижте видеото други изказвания и се абонирайте за анонсите на събитията в Telegram Около Kubernetes в Mail.ru Group.

Какво още да прочетете по темата:

  1. Бази данни в съвременната IIoT платформа.
  2. Как да изберем база данни за проекта, за да не се налага да избираме отново.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster