Cómo construir una nube híbrida con Kubernetes para reemplazar DBaaS

Mi nombre es Petr Zaitsev, soy el CEO, fundador de Percona y quiero decirles:



  • cómo pasamos de las soluciones de código abierto a la base de datos como servicio;
  • 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 el DBMS como servicio lo más simple posible.


El artículo se basa en el informe de @Databases Meetup de Mail.ru Cloud Solutions & Tarantool. Si no quiere leer, puede ver:







Cómo del código abierto llegó a la base de datos como servicio en la nube



He estado haciendo código abierto desde finales de los 90. Hace veinte años, utilizar fuentes abiertas como bases de datos no era fácil. Era necesario descargar las fuentes, parchear, compilar y solo luego usar.



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



  • Tar.gz e INSTALL fuentes que necesitaban ser compiladas;
  • paquetes con dependencias como .deb y .rpm, donde solo necesita instalar un conjunto de paquetes;
  • repositorios de paquetes como APT y YUM, a través de los cuales la instalación ocurre automáticamente;
  • soluciones como Docker y Snap, que le permiten obtener paquetes en la instalación sin dependencias externas.


Como resultado, es más fácil utilizar software de código abierto y se reduce la barrera de entrada al desarrollo de tales aplicaciones.



Al mismo tiempo, a diferencia de la situación de hace 20 años, cuando todos eran expertos en ensamblaje, ahora la mayoría de los desarrolladores no pueden ensamblar las herramientas utilizadas desde la fuente.



De hecho, esto no está mal porque:



  1. Podemos utilizar un software más complejo, pero más conveniente. Por ejemplo, un navegador es conveniente de usar, pero incluye muchos componentes de código abierto, es inconveniente construirlo 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 bloqueo de proveedor específico, es decir, vinculante a un proveedor. Usamos soluciones simples y los proveedores usan componentes de código abierto, pero de hecho 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) es en las nubes, utilizando una API propietaria.



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



  1. Construya la infraestructura de la base de datos, como en un centro de datos normal. Es decir, tome los bloques de construcción estándar: computación, almacenamiento, etc., coloque Linux en ellos, una base de datos, configure.
  2. Use Database as a Service, donde el proveedor ofrece una base de datos lista para usar dentro de la nube.


Ahora DBaaS es un mercado en rápido crecimiento, porque dicho servicio permite a los desarrolladores trabajar con bases de datos directamente y minimiza el trabajo de rutina. El proveedor asume la provisión de alta disponibilidad (alta disponibilidad) y fácil escalado, parcheo de base de datos, copias de seguridad y ajuste del rendimiento.



Dos tipos de Base de datos como servicio basada en código abierto y una alternativa en forma de Kubernetes



Hay dos tipos de Base de datos como servicio para bases de datos de código abierto:



  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 capacidad de migrar entre nubes y reducen la portabilidad de datos y aplicaciones. Por ejemplo, a pesar de que diferentes tipos de nubes soportan, de hecho, el mismo MySQL estándar, existen diferencias significativas entre ellas: en funcionamiento, rendimiento, respaldo, etc. La migración de una nube a otra puede resultar complicada, especialmente para aplicaciones complejas.



Y aquí surge la pregunta: ¿es posible obtener la conveniencia 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 tales soluciones en el mercado. La buena noticia es que Kubernetes le permite implementar este tipo de soluciones.



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


Kubernetes es ahora el líder en esta categoría de software. Había muchas soluciones diferentes para tales tareas, pero fue él quien se convirtió en el estándar. Muchas empresas que anteriormente incursionaron en soluciones alternativas ahora se están enfocando en adaptar sus productos para admitir Kubernetes.



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



Cómo funciona Kubernetes con 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 se encuentran en el otro extremo del espectro, lo que significa que son aplicaciones con estado. Y Kubernetes no fue diseñado originalmente para tales aplicaciones.



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



  1. El concepto StatefulSet es una serie completa de primitivas para manejar los eventos de cierre del módulo y realizar el cierre elegante (cierre predecible de la aplicación).
  2. Volúmenes persistentes: almacenes de datos asociados con pods, objetos de administración de Kubernetes.
  3. Operator Framework: es decir, la capacidad de crear componentes para administrar bases de datos y otras aplicaciones con estado distribuidas en muchos nodos.


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



Percona tiene dos soluciones Kubernetes de código abierto:



  1. Operador de Kubernetes para Percona Server para MongoDB.
  2. Kubernetes Operator para XtraDB CLUSTER es un servicio compatible con MySQL que proporciona alta disponibilidad y consistencia. También puede usar un solo nodo si no se necesita alta disponibilidad, por ejemplo, para la base de datos de desarrollo.


Los usuarios de Kubernetes se pueden dividir en dos grupos. Algunas personas usan 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 Database as a Service, no quieren profundizar en los matices de Kubernetes. Para el segundo grupo de usuarios, tenemos otra solución de código abierto: Percona DBaaS CLI Tool. Esta es una solución experimental para aquellos que desean obtener DBaaS de código abierto basado en Kubernetes sin un conocimiento profundo de la tecnología.



Cómo ejecutar DBaaS desde Percona en Google Kubernetes Engine



Google Kubernetes Engine, en mi opinión, es una de las implementaciones más funcionales de la tecnología de 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 manipular manualmente la plataforma.



Para que nuestro DBaaS funcione, necesitamos los siguientes componentes:



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


Instalar kubectl



Instalando 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



Instale el paquete de software de la misma manera. 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


Instale la CLI de Percona DBaaS



Instalar desde los repositorios de Percona. La herramienta CLI de Percona DBaaS sigue siendo un producto experimental, por lo tanto, está en un repositorio experimental, que debe incluirse por separado, incluso si ya tiene instalados los repositorios de Percona.



Más detalles aquí .



Algoritmo de instalación:



  1. Configure los repositorios de Percona utilizando la herramienta de liberación de percona. 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 de 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


Configurar los componentes



Lea más sobre la configuración aquí .



Primero debe iniciar sesión en su cuenta de Google. Además, Google Cloud permite que un usuario tenga muchos proyectos independientes, por lo que debe especificar un 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, creé un clúster de Kubernetes de solo tres nodos; este es el mínimo requerido para la 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 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 espacio de nombres y lo activamos. El espacio de nombres es, en términos generales, también como un proyecto o entorno, pero ya está 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


Empezamos el cluster



Después de haber realizado 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, desde este servidor desde el que ejecutó el comando Crear, no está disponible. Para que esté disponible, por ejemplo, para pruebas con un cliente, debe pasar el puerto a través de Mapeo de puertos:



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 administración de clústeres



Base de datos de 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. Es menos seguro, pero a menudo más conveniente. Para IP externa, use 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 aleatoriamente la contraseña, puede establecerla 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 la salida del script en formato legible por humanos, pero el formato JSON también es compatible.



Desactiva la alta disponibilidad



Puede desactivar la alta disponibilidad con el siguiente comando para expandir el 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 es una solución para problemas de prueba con el fin de generar rápida y fácilmente MySQL, probarlo y luego enrollarlo o usarlo para el desarrollo.



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



Esta charla se presentó por primera vez en @Databases Meetup por Mail.ru Cloud Solutions & Tarantool. Mire videos de otros discursos y suscríbase a los anuncios de eventos en Telegram Around 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 volver a elegir.



All Articles