Como construir uma nuvem híbrida usando Kubernetes que pode substituir o DBaaS

Meu nome é Petr Zaitsev, sou o CEO, fundador percona e eu quero te dizer:

  • como passamos de soluções de código aberto para banco de dados como serviço;
  • quais abordagens existem para implantar bancos de dados na nuvem;
  • como o Kubernetes pode substituir o DBaaS, eliminando a dependência de fornecedores e mantendo a simplicidade do DBMS como serviço.

O artigo foi preparado com base em um relatório do @Databases Meetup da Mail.ru Cloud Solutions & Tarantool. Se não quiser ler, você pode assistir:


Como passamos do código aberto para o banco de dados como serviço na nuvem

Trabalho com código aberto desde o final dos anos 90. Há vinte anos, usar código aberto, como bancos de dados, não era tão fácil. Foi necessário baixar o código-fonte, corrigi-lo, compilá-lo e só então utilizá-lo.

O código aberto passou então por uma série de simplificações:

  • Fontes Tar.gz e INSTALL que precisavam ser compiladas;
  • pacotes com dependências como .deb e .rpm, onde você só precisa instalar um conjunto de pacotes;
  • repositórios de pacotes como APT e YUM, com os quais a instalação é automática;
  • soluções como Docker e Snap, que permitem receber pacotes por instalação sem dependências externas.

Como resultado, torna-se mais fácil usar software de código aberto e também diminui a barreira de entrada no desenvolvimento de tais aplicações.

Ao mesmo tempo, diferentemente da situação de 20 anos atrás, quando todos eram especialistas em montagem, agora a maioria dos desenvolvedores não consegue construir as ferramentas que usam a partir do código-fonte.

Na verdade, isso não é ruim, porque:

  1. Podemos usar software mais complexo, mas mais fácil de usar. Por exemplo, um navegador é conveniente de usar, mas inclui muitos componentes de código aberto e é inconveniente para construir do zero.
  2. Mais pessoas podem se tornar desenvolvedores de software de código aberto e outros softwares, mais software é usado pelas empresas e a necessidade dele é maior.

A desvantagem é que o próximo passo na simplificação está associado ao uso de soluções em nuvem, e isso leva a um certo aprisionamento de fornecedor, ou seja, vinculação a um fornecedor. Usamos soluções simples e os provedores usam componentes de código aberto, mas na verdade eles estão pregados em uma das grandes nuvens. Ou seja, a maneira mais fácil e rápida de implantar código aberto (e software compatível com ele) é nas nuvens, usando uma API proprietária.

Quando se trata de bancos de dados na nuvem, existem duas abordagens:

  1. Monte a infraestrutura do banco de dados, como em um data center normal. Ou seja, pegue os blocos de construção padrão: computação, armazenamento e assim por diante, instale o Linux e um banco de dados neles e configure-os.
  2. Utilize Banco de Dados como Serviço, onde o provedor oferece um banco de dados pronto dentro da nuvem.

DBaaS é um mercado em rápido crescimento no momento porque permite que os desenvolvedores trabalhem diretamente com bancos de dados e minimiza o trabalho rotineiro. O provedor se compromete a garantir alta disponibilidade e fácil escalonamento, aplicação de patches de banco de dados, backups e ajuste de desempenho.

Dois tipos de banco de dados como serviço baseado em código aberto e uma alternativa na forma de Kubernetes

Existem dois tipos de banco de dados como serviço para bancos de dados abertos:

  1. Um produto padrão de código aberto empacotado em um back-end de administração para fácil implantação e gerenciamento.
  2. Uma solução comercial avançada com diversos add-ons, compatível com código aberto.

Ambas as opções reduzem a possibilidade de migração entre nuvens e reduzem a portabilidade de dados e aplicações. Por exemplo, apesar de diferentes tipos de nuvens suportarem essencialmente o mesmo MySQL padrão, existem diferenças significativas entre eles: na operação, desempenho, backup e assim por diante. A migração de uma nuvem para outra pode ser um desafio, especialmente para aplicações complexas.

E aqui surge a pergunta - é possível obter a conveniência do Banco de Dados como Serviço, mas como uma solução simples de código aberto?

A má notícia é que, infelizmente, ainda não existem soluções desse tipo no mercado. A boa notícia é que existe o Kubernetes, que permite implementar tais soluções.

Kubernetes é um sistema operacional para nuvem ou data center que permite implantar e gerenciar um aplicativo em vários servidores em um cluster, em vez de em um único host.

Agora o Kubernetes é líder na categoria desse tipo de software. Havia muitas soluções diferentes para esses problemas, mas isso se tornou o padrão. Muitas empresas que costumavam se concentrar em soluções alternativas agora estão se concentrando na adaptação de seus produtos para oferecer suporte ao Kubernetes.

Além disso, o Kubernetes é uma solução universal suportada em nuvens privadas, públicas e híbridas de muitos fornecedores, por exemplo: AWS, Google Cloud, Microsoft Azure, Soluções em nuvem Mail.ru.

Como o Kubernetes funciona com bancos de dados

O Kubernetes foi originalmente projetado para aplicações sem estado que processam dados, mas não armazenam nada, como microsserviços ou aplicações web. Os bancos de dados estão no outro extremo do espectro, ou seja, são aplicações com estado. E o Kubernetes não foi originalmente planejado para tais aplicações.

No entanto, existem recursos que surgiram recentemente no Kubernetes que permitem o uso de bancos de dados e outras aplicações com estado:

  1. O conceito StatefulSet é uma série de primitivos para processar eventos sobre como interromper o trabalho de pods e implementar o Graceful Shutdown (desligamento previsível do aplicativo).
  2. Volumes persistentes são armazenamentos de dados associados a pods, objetos de gerenciamento do Kubernetes.
  3. Estrutura do Operador - ou seja, a capacidade de criar componentes para gerenciar bancos de dados e outros aplicativos com estado distribuídos em vários nós.

Já existem grandes bancos de dados como serviço em nuvens públicas, cujo backend é o Kubernetes, por exemplo: CockroachCloud, InfluxDB, PlanetScale. Ou seja, um banco de dados no Kubernetes não é apenas algo teoricamente possível, mas também algo que funciona na prática.

A Percona possui duas soluções de código aberto para Kubernetes:

  1. Operador Kubernetes para Percona Server para MongoDB.
  2. Operador Kubernetes para XtraDB CLUSTER é um serviço compatível com MySQL e oferece alta disponibilidade e consistência. Você também pode usar um único nó se a alta disponibilidade não for necessária, por exemplo, para um banco de dados de desenvolvimento.

Os usuários do Kubernetes podem ser divididos em dois grupos. Algumas pessoas usam operadores Kubernetes diretamente - principalmente usuários avançados que têm um bom conhecimento de como a tecnologia funciona. Outros o executam no backend - esses usuários estão interessados ​​em algo como banco de dados como serviço, eles não querem se aprofundar nas nuances do Kubernetes. Para o segundo grupo de usuários, temos outra solução de código aberto - Percona DBaaS CLI Tool. Esta é uma solução experimental para quem deseja obter um DBaaS de código aberto baseado em Kubernetes sem um conhecimento profundo da tecnologia.

Como executar o DBaaS da Percona no Google Kubernetes Engine

O Google Kubernetes Engine, na minha opinião, é uma das implementações mais funcionais da tecnologia Kubernetes. Ele está disponível em várias regiões do mundo e possui uma ferramenta de linha de comando (SDK) simples e conveniente, que permite criar scripts em vez de gerenciar manualmente a plataforma.

Para que nosso DBaaS funcione, precisamos dos seguintes componentes:

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

Instalar o kubectl

Instalamos o pacote para o seu sistema operacional, veremos o exemplo do Ubuntu. Mais detalhes aqui.

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

Instalando o SDK do Google Cloud

Instalamos o pacote de software da mesma maneira. Mais detalhes aqui.

# 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

Instalando Percona DBaaS CLI

Instale a partir dos repositórios Percona. A ferramenta Percona DBaaS CLI ainda é um produto experimental, portanto está localizada no repositório experimental, que deve ser habilitado separadamente, mesmo que você já tenha repositórios Percona instalados.

Mais aqui.

Algoritmo de instalação:

  1. Configure repositórios Percona usando a ferramenta percona-release. Primeiro você precisa baixar e instalar o pacote oficial 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. Ative o componente de repositório de ferramentas experimentais da seguinte forma:
    sudo percona-release enable tools experimental
    
  3. Instale o pacote percona-dbaas-cli:
    sudo apt-get update
    sudo apt-get install percona-dbaas-cli

Configurando a operação dos componentes

Mais sobre configurações aqui.

Primeiro você precisa fazer login na sua conta do Google. Além disso, o Google Cloud permite que um usuário tenha muitos projetos independentes, então você precisa especificar um projeto funcional usando o código deste projeto:

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

A seguir, criamos um cluster. Para a demonstração, criei um cluster Kubernetes de apenas três nós - este é o mínimo necessário para alta disponibilidade:

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

O seguinte comando kubectl concede os privilégios desejados ao nosso usuário atual:

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

Em seguida, criamos um namespace e o tornamos ativo. Namespace é, grosso modo, também como um projeto ou ambiente, mas já dentro de um cluster Kubernetes. É independente dos projetos do Google Cloud:

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

Iniciando o cluster

Depois de seguirmos essas etapas, podemos iniciar um cluster de três nós com este comando simples:

# 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

Como se conectar a um cluster

Por padrão, ele está disponível apenas no Kubernetes. Ou seja, não é acessível a partir deste servidor a partir do qual você executou o comando “Criar”. Para disponibilizá-la, por exemplo, para testes com um cliente, é necessário encaminhar a porta através do Port Mapping:

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

Em seguida, conectamos seu cliente MySQL:

mysql -h 127.0.0.1 -P 3306 -uroot -pNt9YZquajW7nfVXTTrP

Comandos avançados de gerenciamento de cluster

Banco de dados em IP público

Se quiser uma solução mais permanente para a disponibilidade do cluster, você poderá obter um endereço IP externo. Neste caso, o banco de dados estará acessível de qualquer lugar. Isto é menos seguro, mas muitas vezes mais conveniente. Para IP externo usamos o seguinte 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

Defina explicitamente a senha

Em vez de o sistema gerar uma senha aleatoriamente, você pode definir a senha explicitamente:

# 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

Estou mostrando a saída dos scripts em formato legível por humanos, mas o formato JSON também é compatível.

Desativando alta disponibilidade

Com o seguinte comando você pode desabilitar a alta disponibilidade para implementar um único nó:

# 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

Esta é uma solução para tarefas de teste para colocar o MySQL em funcionamento da maneira mais rápida e fácil possível, testá-lo e, em seguida, desligá-lo ou usá-lo para desenvolvimento.

A ferramenta Percona DBaaS CLI ajuda você a obter uma solução semelhante a DBaaS no Kubernetes. Ao mesmo tempo, continuamos a trabalhar na sua funcionalidade e usabilidade.

Este relatório foi apresentado pela primeira vez em Encontro @Databases por Mail.ru Cloud Solutions e Tarantool. Olhar vídeo outras apresentações e inscreva-se para anúncios de eventos no Telegram Sobre Kubernetes no Grupo Mail.ru.

O que mais ler sobre o assunto:

  1. Bancos de dados em uma plataforma IIoT moderna.
  2. Como escolher um banco de dados para um projeto para não ter que escolher novamente.

Fonte: habr.com

Adicionar um comentário