Cómo construir una nube híbrida utilizando Kubernetes que puede reemplazar DBaaS

Me llamo Petr Záitsev, soy el director general, fundador Percona y quiero contar:

  • cómo pasamos de las soluciones de código abierto a Database as a Service;
  • cuáles son los enfoques para implementar bases de datos en la nube;
  • cómo Kubernetes puede reemplazar DBaaS, eliminando la dependencia del proveedor y manteniendo la simplicidad de la base de datos como servicio.

Este artículo se basa en una presentación en @Databases Meetup por Mail.ru Cloud Solutions & Tarantool. Si no quieres leer, puedes ver:

Reproducir video

Cómo pasamos de open source a Database as a Service en la nube

Trabajo con open source desde finales de los 90. Hace veinte años, usar open source, por ejemplo bases de datos, no era tan sencillo. Tenías que descargar el código fuente, aplicar parches, compilar y solo después usarlo.

Luego, open source experimentó una serie de simplificaciones:

  • código fuente Tar.gz y INSTALL, que debían ser compilados;
  • paquetes con dependencias como .deb y .rpm, donde solo necesitas instalar un conjunto de paquetes;
  • repositorios de paquetes como APT y YUM, mediante los cuales la instalación se realiza automáticamente;
  • soluciones como Docker y Snap, que permiten obtener paquetes por instalación sin dependencias externas.

Como resultado, usar software de código abierto se vuelve más fácil, y también se reduce la barrera de entrada para desarrollar tales aplicaciones.

Sin embargo, a diferencia de la situación de hace 20 años, cuando todos eran expertos en compilación, ahora la mayoría de los desarrolladores no pueden compilar las herramientas que usan a partir de los fuentes.

En realidad, esto no es malo, ya que:

  1. Podemos utilizar software más complejo, pero más cómodo. Por ejemplo, un navegador: es fácil de usar, pero incluye muchos componentes de código abierto, que son difíciles de compilar desde cero.
  2. Más personas pueden convertirse en desarrolladores de open source y otro software, más software es utilizado por negocios, hay una mayor demanda de él.

El lado opuesto es que el siguiente paso en la simplificación está relacionado con el uso de soluciones en la nube, lo que conduce a un cierto vendor lock-in, es decir, la vinculación a un solo proveedor. Utilizamos soluciones simples y los proveedores utilizan componentes de código abierto, pero en realidad están atados a uno de los grandes nubes. Es decir, la forma más simple y rápida de desplegar open source (y software compatible) es en la nube, utilizando API propietarias.

Si hablamos de bases de datos en la nube, hay dos enfoques:

  1. Construir una infraestructura de base de datos, como en un centro de datos convencional. Es decir, tomar bloques de construcción estándar: computación, almacenamiento, etc., instalar Linux, la base de datos y configurarla.
  2. Utilizar Database as a Service, donde el proveedor ya ofrece una base de datos lista dentro de la nube.

Actualmente, DBaaS es un mercado en rápido crecimiento, ya que este servicio permite a los desarrolladores trabajar directamente con bases de datos y minimiza el trabajo rutinario. El proveedor se encarga de garantizar High Availability (alta disponibilidad) y fácil escalabilidad, así como de la aplicación de parches en la base de datos, copias de seguridad y configuración del rendimiento.

Dos tipos de Database as a Service basados en código abierto y una alternativa en forma de Kubernetes.

Hay dos tipos de Database as a Service para bases de datos abiertas:

  1. Un producto estándar de código abierto empaquetado en un backend para la administración, lo que facilita la implementación y gestión.
  2. Una solución comercial avanzada con diferentes complementos, compatible con código abierto.

Ambas opciones reducen la posibilidad de migrar entre nubes, disminuyendo la portabilidad de datos y aplicaciones. Por ejemplo, aunque diferentes tipos de nubes soportan, esencialmente, el mismo estándar MySQL, existen diferencias significativas: en funcionamiento, rendimiento, copias de seguridad, etc. Migrar de una nube a otra puede ser complicado, especialmente para aplicaciones complejas.

Y aquí surge la pregunta: ¿se puede obtener la comodidad de Database as a Service, pero como una simple solución de código abierto?

La mala noticia es que, desafortunadamente, actualmente no hay tales soluciones en el mercado. La buena noticia es que existe Kubernetes, que permite implementar tales soluciones.

Kubernetes es un sistema operativo para la nube o centro de datos, que permite desplegar aplicaciones y gestionarlas en múltiples servidores de un clúster, en lugar de en un solo host.

Actualmente, Kubernetes es el líder en esta categoría de software. Para estas tareas, ha habido muchas soluciones diferentes, pero él se ha convertido en el estándar. Muchas empresas que antes trabajaban en soluciones alternativas ahora se centran en adaptar sus productos para soportar Kubernetes.

Además, Kubernetes es una solución versátil que es compatible en nubes privadas, públicas e híbridas de muchos proveedores, por ejemplo: AWS, Google Cloud, Microsoft Azure. Soluciones en la Nube de Mail.ru.

Cómo Kubernetes trabaja con bases de datos.

Kubernetes fue diseñado originalmente para aplicaciones sin estado que procesan datos pero no almacenan nada, como microservicios o aplicaciones web. Las bases de datos están en el otro extremo del espectro, es decir, son aplicaciones con estado. Y Kubernetes no estaba diseñado originalmente para tales aplicaciones.

Sin embargo, hay características que han surgido en Kubernetes recientemente que permiten utilizar bases de datos y otras aplicaciones con estado:

  1. El concepto de StatefulSet es una serie de primitivas para manejar eventos de apagado de pods y realizar un Graceful Shutdown (apagado predecible de la aplicación).
  2. Persistent Volumes son almacenes de datos que están vinculados a pods, objetos de administración de Kubernetes.
  3. Operator Framework significa la capacidad de crear componentes para administrar bases de datos y otras aplicaciones con estado distribuidas en múltiples nodos.

Ya hay grandes servicios de Database as a Service en nubes públicas cuya parte de backend es Kubernetes, como CockroachCloud, InfluxDB y PlanetScale. Esto significa que tener una base de datos en Kubernetes no es solo una posibilidad teórica, sino algo que funciona en la práctica.

Percona tiene dos soluciones de código abierto para Kubernetes:

  1. Kubernetes Operator para Percona Server para MongoDB.
  2. Kubernetes Operator para XtraDB CLUSTER — un servicio compatible con MySQL que garantiza alta disponibilidad y consistencia. También se puede utilizar un nodo único si no se requiere alta disponibilidad, por ejemplo, para una base de datos de desarrollo.

Los usuarios de Kubernetes se pueden dividir en dos grupos. Algunos usan Kubernetes Operators directamente: principalmente son usuarios avanzados que comprenden bien cómo funciona la tecnología. Otros lo ejecutan en el backend: a esos usuarios les interesa algo como Database as a Service y no quieren profundizar en los matices del funcionamiento de Kubernetes. Para este segundo grupo de usuarios, tenemos otra solución de código abierto: Percona DBaaS CLI Tool. Esta es una solución experimental para quienes buscan obtener un DBaaS de código abierto basado en Kubernetes sin un profundo entendimiento de la tecnología.

Cómo poner en marcha el DBaaS de Percona en Google Kubernetes Engine

Google Kubernetes Engine, en mi opinión, es una de las implementaciones más funcionales de la tecnología Kubernetes. Está disponible en muchas regiones del mundo y cuenta con una herramienta sencilla y conveniente de línea de comandos (SDK) que permite crear scripts en lugar de gestionar la plataforma manualmente.

Para que nuestro DBaaS funcione, se necesitan los siguientes componentes:

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

Instalamos kubectl

Instalamos el paquete para su sistema operativo, tomaremos como ejemplo Ubuntu. Más información aquí.

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

Instalamos Google Cloud SDK

Del mismo modo, instalamos el paquete de software. Más información aquí.

# 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

Instalamos Percona DBaaS CLI

Instalamos desde los repositorios de Percona. La herramienta Percona DBaaS CLI es un producto aún experimental, por lo que se encuentra en un repositorio experimental que debe habilitarse por separado, incluso si ya tiene los repositorios de Percona instalados.

Más información aquí.

Algoritmo de instalación:

  1. Configure los repositorios de Percona con la herramienta percona-release. Primero necesita descargar e instalar el paquete oficial percona-release de Percona:
    wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
    sudo dpkg -i percona-release_latest.generic_all.deb
  2. Habilite el componente experimental del repositorio de herramientas de la siguiente manera:
    sudo percona-release enable tools experimental
    
  3. Instale el paquete percona-dbaas-cli:
    sudo apt-get update
    sudo apt-get install percona-dbaas-cli

Configuramos el funcionamiento de los componentes

Más información sobre la configuración aquí.

Primero, debe iniciar sesión en su cuenta de Google. Luego, Google Cloud permite que un usuario tenga muchos proyectos independientes, por lo que es necesario especificar el proyecto de trabajo utilizando el código de este proyecto:

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

A continuación, creamos un clúster. Para la demostración, he creado un clúster de Kubernetes con solo tres nodos — que es el mínimo requerido para alta disponibilidad:

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

El siguiente comando de kubectl otorga los privilegios necesarios a nuestro usuario actual:

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

Luego creamos un namespace y lo hacemos activo. Un namespace es, a grandes rasgos, similar a un proyecto o entorno, pero dentro del clúster de Kubernetes. Es independiente de los proyectos de Google Cloud:

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

Iniciamos el clúster

Después de haber pasado por estos pocos pasos, podemos iniciar el clúster de tres nodos con este simple comando:

# 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

Cómo conectarse al clúster

Por defecto, solo está disponible dentro de Kubernetes. Es decir, desde este servidor, desde el cual iniciaste el comando 'Crear', no está accesible. Para que sea accesible, por ejemplo, para pruebas con el cliente, necesitas redirigir el puerto a través del Port Mapping:

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

Luego conectamos tu cliente de MySQL:

mysql -h 127.0.0.1 -P 3306 -uroot -pNt9YZquajW7nfVXTTrP

Comandos avanzados para la gestión del clúster

Base de datos en IP pública

Si buscas una solución más permanente para la disponibilidad del clúster, puedes obtener una dirección IP externa. En este caso, la base de datos será accesible desde cualquier lugar. Esto es menos seguro, pero a menudo más conveniente. Para obtener una IP externa, utilizamos el siguiente 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

Establecemos la contraseña explícitamente

En lugar de que el sistema genere una contraseña aleatoriamente, puedes establecer una contraseña de forma explícita:

# 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

Yo muestro la salida de los scripts en un formato legible, pero también se admite el formato JSON.

Desactivamos la alta disponibilidad

Con el siguiente comando puedes desactivar la alta disponibilidad para implementar un nodo ú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 solución es para tareas de prueba, para levantar MySQL de la manera más rápida y sencilla, probarlo y luego desmontarlo o usarlo para desarrollo.

La herramienta Percona DBaaS CLI ayuda a obtener una solución en Kubernetes, similar a DBaaS. Continuamos trabajando en su funcionalidad y usabilidad.

Esta presentación se pronunció por primera vez en @Databases Meetup by Mail.ru Cloud Solutions&Tarantool. Ver videos otras presentaciones y suscríbase a los anuncios de eventos en Telegram Alrededor de Kubernetes en Mail.ru Group.

Qué más leer sobre el tema:

  1. Bases de datos en una plataforma IIoT moderna.
  2. Cómo elegir una base de datos para tu proyecto para no tener que elegir de nuevo.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster