Cómo construir una nube híbrida usando Kubernetes que pueda reemplazar DBaaS

Mi nombre es Petr Zaitsev, soy el director general y fundador. Percona y quiero decirte:

  • cómo pasamos de las soluciones de código abierto a la base de datos como servicio;
  • qué enfoques existen para implementar bases de datos en la nube;
  • cómo Kubernetes puede reemplazar DBaaS, eliminando la dependencia de los proveedores y manteniendo la simplicidad de DBMS como servicio.

El artículo se preparó a partir de un informe en @Databases Meetup de Mail.ru Cloud Solutions & Tarantool. Si no quieres leer, puedes mirar:


Cómo pasamos del código abierto a la Base de Datos como Servicio en la nube

He estado trabajando en código abierto desde finales de los 90. Hace veinte años, utilizar código abierto, como bases de datos, no era tan fácil. Era necesario descargar el código fuente, parchearlo, compilarlo y solo luego usarlo.

Luego, el código abierto pasó por una serie de simplificaciones:

  • Tar.gz e INSTALL fuentes que debían compilarse;
  • paquetes con dependencias como .deb y .rpm, donde solo necesitas instalar un conjunto de paquetes;
  • repositorios de paquetes como APT y YUM, con los que la instalación es automática;
  • soluciones como Docker y Snap, que permiten recibir paquetes mediante instalación sin dependencias externas.

Como resultado, resulta más fácil utilizar software de código abierto y también reduce la barrera de entrada al desarrollo de dichas aplicaciones.

Al mismo tiempo, a diferencia de la situación de hace 20 años, cuando todo el mundo era experto en ensamblaje, ahora la mayoría de los desarrolladores no pueden crear las herramientas que utilizan desde el código fuente.

De hecho, esto no está mal porque:

  1. Podemos utilizar software más complejo pero más fácil de usar. Por ejemplo, un navegador es cómodo de usar, pero incluye muchos componentes de código abierto y es inconveniente crearlo desde cero.
  2. Más personas pueden convertirse en desarrolladores de software de código abierto y de otro tipo, las empresas utilizan más software y la necesidad es mayor.

La desventaja es que el siguiente paso en la simplificación está asociado con el uso de soluciones en la nube, y esto conduce a un cierto bloqueo del proveedor, es decir, vinculación a un solo proveedor. Usamos soluciones simples y los proveedores usan componentes de código abierto, pero en realidad están clavados en una de las grandes nubes. Es decir, la forma más fácil y rápida de implementar código abierto (y software compatible con él) es en las nubes, utilizando una API propietaria.

Cuando se trata de bases de datos en la nube, existen dos enfoques:

  1. Monte la infraestructura de la base de datos, como en un centro de datos normal. Es decir, tomar componentes básicos estándar: computación, almacenamiento, etc., instalar Linux y una base de datos en ellos y configurarlos.
  2. Utilice la base de datos como servicio, donde el proveedor ofrece una base de datos lista para usar dentro de la nube.

DBaaS es un mercado en rápido crecimiento en este momento porque permite a los desarrolladores trabajar directamente con bases de datos y minimiza el trabajo rutinario. El proveedor se compromete a garantizar alta disponibilidad y fácil escalamiento, parches de bases de datos, copias de seguridad y ajuste del rendimiento.

Dos tipos de Base de Datos como Servicio basadas en código abierto y una alternativa en forma de Kubernetes

Existen dos tipos de Base de Datos como Servicio para bases de datos abiertas:

  1. Un producto estándar de código abierto empaquetado en un backend de administración para una fácil implementación y administración.
  2. Una solución comercial avanzada con varios complementos, compatible con código abierto.

Ambas opciones reducen la posibilidad de migración entre nubes y reducen la portabilidad de datos y aplicaciones. Por ejemplo, a pesar de que los diferentes tipos de nubes admiten esencialmente el mismo MySQL estándar, existen diferencias significativas entre ellas: en funcionamiento, rendimiento, respaldo, etc. Migrar de una nube a otra puede resultar un desafío, especialmente para aplicaciones complejas.

Y aquí surge la pregunta: ¿es posible aprovechar la comodidad de la base de datos como servicio, pero como una solución simple de código abierto?

La mala noticia es que, lamentablemente, todavía no existen soluciones de este tipo en el mercado. La buena noticia es que existe Kubernetes, que permite implementar este tipo de soluciones.

Kubernetes es un sistema operativo para la nube o el centro de datos que le permite implementar y administrar una aplicación en varios servidores en un clúster en lugar de en un solo host.

Ahora Kubernetes es líder en la categoría de este tipo de software. Había muchas soluciones diferentes para estos problemas, pero se convirtió en el estándar. Muchas empresas que solían centrarse en soluciones alternativas ahora se centran en adaptar sus productos para admitir Kubernetes.

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

Cómo funciona Kubernetes con las bases de datos

Kubernetes se diseñó 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 pensado originalmente para este tipo de aplicaciones.

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

  1. El concepto StatefulSet es una serie completa de primitivas para procesar eventos sobre cómo detener el trabajo de los pods e implementar Graceful Shutdown (apagado predecible de la aplicación).
  2. Los volúmenes persistentes son almacenes de datos asociados con pods, objetos de administración de Kubernetes.
  3. Operador Framework: es decir, la capacidad de crear componentes para administrar bases de datos y otras aplicaciones con estado distribuidas en muchos nodos.

Ya en las nubes públicas existen grandes bases de datos como servicio, cuyo backend es Kubernetes, por ejemplo: CockroachCloud, InfluxDB, PlanetScale. Es decir, una base de datos en Kubernetes no sólo es algo teóricamente posible, sino también algo que funciona en la práctica.

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

  1. Operador Kubernetes para servidor Percona para MongoDB.
  2. Kubernetes Operador para XtraDB CLUSTER es un servicio compatible con MySQL y proporciona alta disponibilidad y coherencia. También puede utilizar un único nodo si no se necesita alta disponibilidad, por ejemplo, para una base de datos de desarrollo.

Los usuarios de Kubernetes se pueden dividir en dos grupos. Algunas personas utilizan los operadores de Kubernetes directamente; se trata principalmente de usuarios avanzados que tienen un buen conocimiento de cómo funciona la tecnología. Otros lo ejecutan en el backend; estos usuarios están interesados ​​en algo como la base de datos como servicio, no quieren profundizar en los matices de Kubernetes. Para el segundo grupo de usuarios, tenemos otra solución de código abierto: la herramienta CLI Percona DBaaS. Esta es una solución experimental para aquellos que desean obtener un DBaaS de código abierto basado en Kubernetes sin un conocimiento profundo de la tecnología.

Cómo ejecutar 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 tiene una herramienta de línea de comandos (SDK) simple y conveniente, que le permite crear scripts en lugar de administrar manualmente la plataforma.

Para que nuestro DBaaS funcione, necesitamos los siguientes componentes:

  1. Kubectl.
  2. SDK de la nube de Google.
  3. CLI de Percona DBaaS.

Instalar kubectl

Instalamos el paquete para su sistema operativo, veremos el ejemplo de Ubuntu. Más detalles 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

Instalación del SDK de Google Cloud

Instalamos el paquete de software de la misma forma. Más detalles 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

Instalación de la CLI de Percona DBaaS

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

Más aquí.

Algoritmo de instalación:

  1. Configure repositorios de Percona utilizando la herramienta percona-release. Primero debe descargar e instalar el paquete oficial de lanzamiento de percona 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 del repositorio de herramientas experimentales 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

Configuración del funcionamiento de los componentes.

Más sobre la configuración aquí.

Primero debes iniciar sesión en tu cuenta de Google. Además, Google Cloud permite que un usuario tenga muchos proyectos independientes, por lo que debes especificar un proyecto funcional usando el código para este proyecto:

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

A continuación, creamos un clúster. Para la demostración, creé un clúster de Kubernetes de solo tres nodos; este es el mínimo requerido para una alta disponibilidad:

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

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

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

Luego creamos un espacio de nombres y lo activamos. El espacio de nombres es, en términos generales, también como un proyecto o entorno, pero ya dentro de un 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

Iniciando el clúster

Una vez que hayamos seguido estos pocos pasos, podemos iniciar un 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 a un clúster

De forma predeterminada, solo está disponible dentro de Kubernetes. Es decir, no se puede acceder a él desde este servidor desde el que ejecutó el comando "Crear". Para que esté disponible, por ejemplo, para pruebas con un cliente, es necesario reenviar el puerto a través de Port Mapping:

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

Luego conectamos su cliente MySQL:

mysql -h 127.0.0.1 -P 3306 -uroot -pNt9YZquajW7nfVXTTrP

Comandos avanzados de gestión de clústeres

Base de datos sobre IP pública

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

Establecer explícitamente la contraseña

En lugar de que el sistema genere una contraseña aleatoriamente, puede establecer la contraseña explícitamente:

# 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

Estoy mostrando el resultado de los scripts en formato legible por humanos, pero el formato JSON también es compatible.

Desactivar la alta disponibilidad

Con el siguiente comando puede desactivar la alta disponibilidad para implementar un solo nodo:

# 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 es una solución para tareas de prueba para que MySQL esté en funcionamiento de la manera más rápida y sencilla posible, probarlo y luego cerrarlo o usarlo para desarrollo.

La herramienta Percona DBaaS CLI le ayuda a lograr una solución similar a DBaaS en Kubernetes. Al mismo tiempo, seguimos trabajando en su funcionalidad y usabilidad.

Este informe fue presentado por primera vez en @Reunión de bases de datos por Mail.ru Soluciones en la nube y Tarantool. Mirar видео otras actuaciones y suscríbete a anuncios de eventos en Telegram Acerca 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 un proyecto para no tener que volver a elegir.

Fuente: habr.com

Añadir un comentario