Como construir uma nuvem híbrida com Kubernetes para substituir DBaaS

Meu nome é Petr Zaitsev, sou o CEO, fundador da Percona e quero dizer a vocês:



  • como passamos das soluções de código aberto para o Database as a Service;
  • quais são as abordagens para implantar bancos de dados na nuvem;
  • Como o Kubernetes pode substituir o DBaaS removendo a dependência do fornecedor e mantendo o DBMS como um serviço o mais simples possível.


O artigo é baseado no relatório de @Databases Meetup de Mail.ru Cloud Solutions & Tarantool. Se você não quiser ler, pode ver:







Como do código aberto veio o Banco de Dados como Serviço na nuvem



Trabalho com código aberto desde o final dos anos 90. Vinte anos atrás, usar software livre, como bancos de dados, não era fácil. Era necessário baixar os fontes, corrigir, compilar e só então usar.



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



  • Fontes Tar.gz e INSTALL que precisaram 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, que são usados ​​para instalação automática;
  • soluções como Docker e Snap, que permitem obter pacotes na instalação sem dependências externas.


Como resultado, torna-se mais fácil usar software de código-fonte aberto e a barreira de entrada no desenvolvimento de tais aplicativos é reduzida.



Ao mesmo tempo, ao contrário da situação de 20 anos atrás, quando todos eram especialistas em montagem, agora a maioria dos desenvolvedores não consegue montar as ferramentas usadas na fonte.



Na verdade, isso não é ruim porque:



  1. Podemos usar um software mais complexo, mas mais conveniente. Por exemplo, um navegador é conveniente de usar, mas inclui muitos componentes de código aberto, sendo inconveniente construí-lo do zero.
  2. Mais pessoas podem se tornar desenvolvedores de código aberto e outros softwares, mais softwares são usados ​​pelas empresas e a necessidade deles é maior.


A desvantagem é que a próxima etapa da simplificação está associada ao uso de soluções em nuvem, e isso leva a um aprisionamento de fornecedor específico, 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 presos a uma das grandes nuvens. Ou seja, a maneira mais fácil e rápida de implantar código aberto (e software compatível) é nas nuvens, usando uma API proprietária.



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



  1. Construa a infraestrutura de 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, coloque Linux neles, um banco de dados, configure.
  2. Use Database as a Service, onde o provedor oferece um banco de dados pronto dentro da nuvem.


Agora, o DBaaS é um mercado em rápido crescimento, porque esse serviço permite que os desenvolvedores trabalhem com bancos de dados diretamente e minimiza o trabalho rotineiro. O provedor assume o fornecimento de alta disponibilidade (alta disponibilidade) e fácil escalonamento, patching de banco de dados, backups, ajuste de desempenho.



Dois tipos de banco de dados como serviço com base 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 de código aberto:



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


Ambas as opções reduzem a capacidade de migração entre nuvens e reduzem a portabilidade de dados e aplicativos. Por exemplo, apesar do fato de que diferentes tipos de nuvens suportam, de fato, o mesmo MySQL padrão, existem diferenças significativas entre eles: em operação, desempenho, backup e assim por diante. Migrar de uma nuvem para outra pode ser um desafio, especialmente para aplicativos complexos.



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



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



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


O Kubernetes é agora o líder nesta categoria de software. Havia muitas soluções diferentes para essas tarefas, mas foi ele quem se tornou o padrão. Muitas empresas que antes se aventuravam em soluções alternativas agora estão se concentrando na adaptação de seus produtos para dar suporte ao Kubernetes.



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



Como o Kubernetes funciona com bancos de dados



O Kubernetes foi originalmente projetado para aplicativos sem estado que processam dados, mas não armazenam nada, como microsserviços ou aplicativos da web. Os bancos de dados estão na outra extremidade do espectro, o que significa que são aplicativos com estado. E o Kubernetes não foi originalmente projetado para esses aplicativos.



No entanto, existem recursos que surgiram no Kubernetes recentemente e permitem o uso de bancos de dados e outros aplicativos com estado:



  1. O conceito StatefulSet é uma série completa de primitivos para lidar com eventos de desligamento de pod e executar Graceful Shutdown (desligamento previsível de aplicativo).
  2. Volumes persistentes - armazenamentos de dados associados a pods, objetos de gerenciamento do Kubernetes.
  3. Operator Framework - ou seja, a capacidade de criar componentes para gerenciar bancos de dados e outros aplicativos com estado distribuídos em muitos nós.


Já existem grandes Database as a Service em nuvens públicas, no backend do Kubernetes, por exemplo: CockroachCloud, InfluxDB, PlanetScale. Ou seja, um banco de dados no Kubernetes não é apenas o que é teoricamente possível, mas também o que funciona na prática.



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



  1. Operador Kubernetes para Percona Server para MongoDB.
  2. O Kubernetes Operator for XtraDB CLUSTER é um serviço compatível com MySQL que fornece 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 o banco de dados dev.


Os usuários do Kubernetes podem ser divididos em dois grupos. Algumas pessoas usam operadores do Kubernetes diretamente - são principalmente usuários avançados que têm um bom conhecimento de como a tecnologia funciona. Outros o executam no back-end - 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 DBaaS de código aberto com base no Kubernetes, sem um conhecimento profundo da tecnologia.



Como executar DBaaS de 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 muitas regiões do mundo e possui uma ferramenta de linha de comando (SDK) simples e conveniente que permite criar scripts, em vez de manipular manualmente a plataforma.



Para que nosso DBaaS funcione, precisamos dos seguintes componentes:



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


Instale o kubectl



Instalando 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


Instalação do Google Cloud SDK



Instale 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


Instale Percona DBaaS CLI



Instale a partir dos repositórios Percona. A ferramenta Percona DBaaS CLI ainda é um produto experimental, portanto está em um repositório experimental, que deve ser incluído separadamente, mesmo se você já tiver repositórios Percona instalados.



Mais detalhes aqui .



Algoritmo de instalação:



  1. Configure os repositórios Percona usando a ferramenta percona-release. Primeiro você precisa baixar e instalar o pacote oficial do 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 ferramenta experimental da seguinte maneira:



    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 os componentes



Leia mais sobre as configurações aqui .



Primeiro você precisa entrar em 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 de trabalho usando o código deste projeto:



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


Em seguida, 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 fornece os privilégios necessários para 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. O namespace é, grosso modo, também como um projeto ou ambiente, mas já está dentro de um cluster do Kubernetes. É independente dos projetos do Google Cloud:



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


Nós iniciamos o cluster



Depois de seguirmos essas poucas 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 dentro do Kubernetes. Ou seja, a partir deste servidor a partir do qual você executou o comando Create, ele não está disponível. Para disponibilizá-lo, por exemplo, para testes com um cliente, você precisa passar a porta pelo Mapeamento de portas:



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 de IP público



Se você deseja uma solução mais permanente para a disponibilidade do cluster, pode obter um endereço IP externo. Nesse caso, o banco de dados estará acessível de qualquer lugar. É menos seguro, mas geralmente mais conveniente. Para IP externo, use 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


Definir a senha explicitamente



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



# 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 exibindo a saída do script em formato legível por humanos, mas o formato JSON também é compatível.



Desligue a alta disponibilidade



Você pode desativar a alta disponibilidade com o seguinte comando para expandir o nó único:



# 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 problemas de teste com o objetivo de criar o MySQL de forma rápida e fácil, testá-lo e, em seguida, fazer rollup ou usá-lo para desenvolvimento.



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



Esta palestra foi apresentada pela primeira vez no @Databases Meetup por Mail.ru Cloud Solutions & Tarantool. Assista a vídeos de outros discursos e inscreva-se para anúncios de eventos no Telegram Around Kubernetes in Mail.ru Group .



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 escolher novamente.



All Articles