Cómo realizar una instalación de MongoDB en Kubernetes

Las implementaciones de aplicaciones en Kubernetes pueden ser desafiantes, especialmente para aplicaciones con estado como MongoDB en un clúster de Kubernetes. ¿Cómo facilitarías la implementación? Deja que el Operador de Kubernetes de MongoDB implemente y gestione automáticamente aplicaciones con estado dentro de tu clúster de Kubernetes.

En este tutorial, aprenderás cómo implementar MongoDB en Kubernetes usando el Operador de Kubernetes de MongoDB.

¡Sigue leyendo y comienza a automatizar tus implementaciones de Kubernetes!

Requisitos previos

Este tutorial será una demostración práctica. Para seguirlo, asegúrate de tener los siguientes requisitos:

  • A Kubernetes cluster – This demo uses the Kubernetes cluster v1.23.
  • Kubectl instalado en la máquina local.
  • Git instalado en tu máquina.
  • jq Parser JSON instalado en la máquina local.

Creando un Namespace para MongoDB

Al implementar aplicaciones en Kubernetes, siempre se recomienda crear un espacio de nombres específico para tus proyectos.

Los espacios de nombres facilitan la gestión de recursos de Kubernetes para los administradores y evitan colisiones de nombres. Al mismo tiempo, crear espacios de nombres previene el uso incorrecto de recursos en el entorno de Kubernetes.

Abre tu terminal y ejecuta el comando kubectl create a continuación para crear un nuevo espacio de nombres (ns) llamado mongodb en tu clúster de Kubernetes.

kubectl create ns mongodb

Ahora ejecuta el siguiente comando kubectl get para verificar la lista de espacios de nombres en tu clúster de Kubernetes.

kubectl get ns

Verás un nuevo espacio de nombres llamado mongodb disponible en tu clúster, como se muestra a continuación.

Creating and Verifying the mongodb Namespace

Descargando el Operador de MongoDB para Kubernetes

Después de crear un espacio de nombres, es hora de descargar el Operador de Kubernetes de MongoDB. El Operador de Kubernetes de MongoDB es un conjunto de operadores de Kubernetes. Estos operadores de Kubernetes ofrecen implementación, configuración y gestión automáticas de MongoDB Community en el entorno de Kubernetes.

Ejecuta el comando git a continuación para clonar el proyecto del Operador de Kubernetes de MongoDB en tu máquina local.

git clone <https://github.com/mongodb/mongodb-kubernetes-operator.git>

Ahora, ejecuta cada comando a continuación para cambiar tu directorio de trabajo actual a mongodb-kubernetes-operator y listar (ls) todos los archivos y directorios disponibles.

# Cambiar el directorio de trabajo a mongodb-kubernetes-operator
cd mongodb-kubernetes-operator/

# Listar archivos y directorios
ls

Verás un subdirectorio llamado config dentro del directorio del proyecto ~/mongodb-kubernetes-operator, como se muestra a continuación. El subdirectorio config contiene ejemplos de archivos YAML para implementar MongoDB en Kubernetes.

Downloading mongodb-kubernetes-operator Source Code

Implementación del Operador de MongoDB

Ahora que tu espacio de nombres personalizado y el Operador de Kubernetes de MongoDB están configurados, estás listo para implementar el Operador de MongoDB en tu clúster de Kubernetes. ¿Cómo? Utilizarás la configuración dentro del directorio config.

El Operador de MongoDB maneja el ciclo de vida de tu implementación de MongoDB en el clúster de Kubernetes. El operador creará, gestionará y escalará automáticamente el estado de tu implementación de MongoDB.

Para implementar el operador de MongoDB, debes crear una Definición de Recursos Personalizada (CRD) de Kubernetes y el controlador. El CRD de Kubernetes es extensible a la API de Kubernetes, lo que te permite crear recursos personalizados en Kubernetes.

1. Ejecuta el comando kubectl apply a continuación para crear un nuevo CRD de Kubernetes para la implementación de MongoDB.

El operador de Kubernetes sustituye toda interacción humana para implementar una aplicación en Kubernetes. El operador es un controlador de pods que implementa y gestiona automáticamente tu aplicación con estado en Kubernetes.

kubectl apply -f config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
Creating New Kubernetes CRD MongoDB Kubernetes Deployment

2. A continuación, ejecuta el siguiente comando kubectl get para verificar la lista de crd disponibles en tu clúster Kubernetes.

kubectl get crd/mongodbcommunity.mongodbcommunity.mongodb.com

A continuación, puedes ver el CRD con el nombre mongodbcommunity.mongodbcommunity.mongodb.org.

Checking List of CRDs

3. Ejecuta el siguiente comando para crear un nuevo Control de Acceso Basado en Roles (RBAC) personalizado para el Operador de MongoDB y especifica la implementación de RBAC en el espacio de nombres mongodb.

Este comando crea un nuevo rol, rolebinding y serviceaccount para el operador de MongoDB, que son permisos personalizados en tu clúster de Kubernetes. Estos permisos personalizados son necesarios para implementar y gestionar automáticamente MongoDB.

kubectl apply -k config/rbac/ -n mongodb
Deploying RBAC for MongoDB Deployment

4. Ahora, ejecuta cada comando kubectl a continuación para verificar el rol, rolebinding y serviceaccount del operador de MongoDB.

# Verificar la lista de roles
kubectl get role mongodb-kubernetes-operator -n mongodb

# Verificar la lista de rolebinding
kubectl get rolebinding mongodb-kubernetes-operator -n mongodb

# Verificar serviceaccount
kubectl get serviceaccount mongodb-kubernetes-operator -n mongodb

La salida a continuación muestra que se ha creado el rol, rolebinding y serviceaccount mongodb-kubernetes-operator en el espacio de nombres mongodb.

Checking role, rolebinding, and serviceaccount on Kubernetes

5. Una vez que la verificación esté completa, ejecuta el comando kubectl a continuación para implementar el Operador de MongoDB en el espacio de nombres mongodb.

Este comando crea una nueva cápsula (mongodb-kubernetes-operator) con la imagen base de Docker (quay.io/mongodb/mongodb-kubernetes-operator). Esta cápsula actuará como controlador para implementar automáticamente conjuntos de réplicas de MongoDB en el clúster de Kubernetes.

kubectl create -f config/manager/manager.yaml -n mongodb

A continuación, puedes ver que se ha creado la implementación del operador de MongoDB, pero la cápsula aún se está inicializando.

Deploying MongoDB Operator to the mongodb Namespace

6. Finalmente, ejecuta los siguientes comandos para verificar la implementación y las cápsulas en el espacio de nombres mongodb.

# Verificar la implementación en el espacio de nombres mongodb
kubectl get deployment.apps -n mongodb

# Verificar las cápsulas en el espacio de nombres mongodb
kubectl get pods -n mongodb

Como se puede ver a continuación, la cápsula del Operador de MongoDB está en ejecución.

Verifying MongoDB Operator Deployment and Pod

Implementación de MongoDB ReplicaSet en Kubernetes

Después de desplegar MongoDB, desplegarás ReplicaSet en tu clúster de Kubernetes para proporcionar alta disponibilidad y redundancia para tu despliegue de MongoDB. No querrías tiempo de inactividad en tu despliegue.

El despliegue de MongoDB ReplicaSets utilizando el Operador Kubernetes de MongoDB es seguro por defecto utilizando la autenticación SCRAM para usuarios. Al mismo tiempo, puedes utilizar una conexión segura TLS para conexiones de usuarios y aplicaciones y exponer métricas de Prometheus para monitorear recursos.

Relacionado: Primeros Pasos con la Monitorización de Clústeres Kubernetes de Grafana & Prometheus

Dentro del directorio config/samples/, verás múltiples ejemplos de archivos YAML para el despliegue de ReplicaSet. Cada archivo puede ser utilizado en diferentes escenarios de despliegue, pero el archivo de despliegue de ReplicaSet por defecto es mongodb.com_v1_mongodbcommunity_cr.yaml.

1. Edita el archivo YAML para tu despliegue utilizando tu editor preferido. Para esta demostración, se utiliza el archivo /mongodb.com_v1_hostpath.yaml para el despliegue local. Este archivo YAML se encuentra en el directorio config/samples/arbitrary_statefulset_configuration/.

Si estás implementando el Operador de MongoDB Kubernetes en servicios en la nube como GKE y AKS, utiliza el archivo YAML `mongodb.com_v1_mongodbcommunity_cr.yaml`. Pero si estás implementando localmente dentro de Kind o Minikube, puedes usar el archivo YAML personalizado (`arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml`), que crea automáticamente PV y PVC personalizados para los pods de ReplicaSet de MongoDB.

A continuación, cambia el número (miembros) de ReplicaSets que desees implementar dependiendo de tu entorno, pero el valor predeterminado es 3. Para este tutorial, el número de ReplicaSets está establecido en 2.

spec:
  members: 2 # Número de conjuntos de réplicas a crear
  security:
    authentication:
      modes:
      - SCRAM
  statefulSet:

Reemplaza <tu-contraseña-aquí> con tu contraseña segura. Utilizarás esta contraseña para iniciar sesión en la base de datos de MongoDB y, de forma predeterminada, se utiliza la autenticación SCRAM.

Guarda los cambios y cierra el editor una vez que estés satisfecho con la contraseña.

---
apiVersion: v1
kind: Secret
metadata:
  name: my-user-password
type: Opaque
stringData:
  password: <your-password-here> # Establecer contraseña para el administrador de MongoDB

2. A continuación, ejecuta el comando kubectl a continuación para implementar (apply) el ReplicaSet de MongoDB usando el archivo mongodb.com_v1_hostpath.yaml en el espacio de nombres mongodb.

Este comando crea lo siguiente:

  • A new custom resource (MongoDBCommunity) with the name mdb0 under the mongodbcommunity.mongodb.com/v1 CRD
  • Secretos de Kubernetes para almacenar contraseñas de usuario de MongoDB. Al mismo tiempo, algunos PV y PVC con el tipo `hostPath` para el Replica Set de MongoDB.

El despliegue tomará algún tiempo, dependiendo de la magnitud de los ReplicaSets a crear y del clúster de Kubernetes en sí.

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Deploying MongoDB Replica Sets

3. Después del despliegue, ejecuta cada comando a continuación para verificar los recursos personalizados y las pods en el espacio de nombres de mongodb.

# Verificando el crd mongodbcommunity
kubectl get mongodbcommunity -n mongodb

# Verificando las pods en el espacio de nombres de mongodb
kubectl get pods -n mongodb

La salida a continuación muestra lo siguiente:

  • El recurso personalizado MongoDBCommunity con el nombre mdb0 se está ejecutando con MongoDB v4.4.0.
  • Las dos pods del conjunto replicado de MongoDB se están ejecutando con los nombres mdb0-0 y mdb0-1. Cada pod contiene dos contenedores diferentes, el mongod, y el contenedor mongodb-agent.
Verifying MongoDB ReplicaSet Deployment and Pods

4. Por último, ejecuta otro comando de kubectl a continuación para verificar el pv y el pvc en el espacio de nombres de mongodb.

kubectl get pv,pvc -n mongodb

La salida a continuación te muestra algunos pv y pvc utilizados por las pods del conjunto replicado de MongoDB.

Checking PV and PVC on the mongodb Namespace

Creación de un Nuevo Usuario y Base de Datos para el Despliegue de MongoDB

Has completado el despliegue del operador de MongoDB y los ReplicaSets en tu clúster de Kubernetes en este punto. El siguiente paso es crear una nueva base de datos y usuario de MongoDB para tu aplicación.

Crearás un nuevo secreto de Kubernetes para el nuevo usuario, editarás el recurso personalizado del despliegue del ReplicaSet y actualizarás el ReplicaSet en tu clúster.

1. Crea un nuevo archivo YAML utilizando tu editor preferido y completa el siguiente secreto de Kubernetes. Puedes nombrar el archivo YAML como desees, pero en este tutorial el archivo se llama new-user.yaml.

Este archivo YAML crea un nuevo secreto de Kubernetes con el nombre myappdata y la contraseña myapppassword.

---
apiVersion: v1
kind: Secret
metadata:
  name: myappdata # nombre del metadato secreto
type: Opaque
stringData:
  password: myapppassword # contraseña para el nuevo usuario

2. A continuación, ejecuta el comando kubectl a continuación para ejecutar la configuración new-user.yaml.

Este comando crea y aplica (apply) un nuevo secreto de Kubernetes a tu clúster y aplica este secreto al espacio de nombres mongodb.

kubectl apply -f new-user.yaml -n mongodb
Creating Secret to Kubernetes Cluster

3. Edita el archivo YAML de la configuración de tu ReplicaSet CRD (mongodb.com_v1_hostpath.yaml) en el directorio config/samples/arbitrary_statefulset_configuration

Agrega la siguiente configuración al archivo mongodb.com_v1_hostpath.yaml , que crea la base de datos y el usuario para MongoDB.

Asegúrate de reemplazar scram-secret-myapp con tus propias credenciales scram, guarda los cambios en el archivo y cierra el editor.

    - name: appuser # Nuevo usuario appuser
      db: admin # Permite la autenticación al administrador de la base de datos
      passwordSecretRef:
        name: myappdata # El secreto de Kubernetes
      roles:
        - name: dbAdmin # Configurar el rol dbAdmin
          db: appdb1 # para la appdb1
      scramCredentialsSecretName: scram-secret-myapp

4. Ahora, ejecuta el comando siguiente para aplicar los nuevos cambios que hiciste en el archivo mongodb.com_v1_hostpath.yaml en el paso tres.

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Creating New MongoDB User and Database on Kubernetes

5. Por último, ejecuta cada comando a continuación para generar las conexiones detalladas de MongoDB para tu aplicación. Estos comandos generan la conexión detallada de MongoDB para tus aplicaciones en formato JSON y analizan la salida usando el comando de línea de comandos jq.

Reemplaza mdb0-admin-mongoadmin con los detalles de tu entorno de la siguiente manera:

  • mdb0 – El nombre de metadatos de los recursos de MongoDB.
  • admin – La base de datos para autenticar.
  • mongoadmin – El usuario que utilizarás para autenticar
# Obtener detalles de autenticación y conexiones de administrador
kubectl get secrets mdb0-admin-mongoadmin -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

# Obtener detalles de autenticación y conexiones de usuario de la aplicación
kubectl get secrets mdb0-admin-appuser -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

La salida a continuación muestra que puedes conectarte a MongoDB utilizando las conexiones standard y standardSrv. También verás el nombre de usuario y la contraseña de tu implementación de MongoDB.

Retrieving Details of MongoDB User and Password, and Connections

Conectándose a la implementación de MongoDB

Has completado la implementación de MongoDB en el clúster de Kubernetes utilizando el operador de Kubernetes de MongoDB. Pero, ¿cómo sabes que la implementación funciona? Verificarás la base de datos de tu máquina local y la conexión de usuario a MongoDB dentro del clúster de Kubernetes.

Para verificar la conexión a tu implementación de MongoDB, utilizarás el reenvío de puertos. El reenvío de puertos en Kubernetes te permite crear un puerto de reenvío desde cualquier servicio de Kubernetes a tu puerto local.

1. Ejecute el comando kubectl a continuación para obtener la lista de servicios (svc) en el espacio de nombres de mongodb (-n).

kubectl get svc -n mongodb

A continuación, verá el servicio llamado mdb0-svc, que expone el puerto 27017 (puerto predeterminado de MongoDB).

Listing Services on the mongodb Namespace

2. A continuación, ejecute el siguiente comando para crear un reenvío de puertos al clúster de Kubernetes.

Este comando crea un nuevo reenvío de puertos en el servicio de Kubernetes (mdb0-svc) y reenvía el puerto local 27017 al puerto del servicio de Kubernetes 27017.

kubectl port-forward service/mdb0-svc -n mongodb 27017:27017
Setting up Port-forward

3. Por último, abra su aplicación MongoDB Compass en su máquina local, agregue una nueva conexión con el siguiente formato y haga clic en Conectar para conectarse a MongoDB.

Cambie el campo de nombre de usuario y contraseña con su usuario y contraseña de MongoDB.

# Conéctese como mongoadmin
mongodb://mongoadmin:secretpassword@localhost:27017/admin?ssl=false

# Conéctese como appuser
mongodb://appuser:myapppassword@localhost:27017/admin?ssl=false
Connecting as mongoadmin user to MongoDB
Connecting as appuser to MongoDB

Cuando la conexión sea exitosa, obtendrá la siguiente ventana que confirma que la implementación de MongoDB en Kubernetes está funcionando correctamente.

Para el usuario mongoadmin, verá las bases de datos predeterminadas (local, config y admin).

Verifying Connection to the MongoDB mongoadmin

Para el usuario appuser, solo verá una base de datos de privilegios llamada appdb1.

Verifying Connection to the MongoDB as appuser

Conclusión

A lo largo de este tutorial, ha aprendido cómo implementar MongoDB en el clúster de Kubernetes utilizando el Operador de Kubernetes de MongoDB. También ha aprendido sobre el uso básico del operador de Kubernetes. Y en este momento, ya tiene un conocimiento sólido sobre cómo implementar y gestionar automáticamente aplicaciones en Kubernetes.

¿Por qué no configurar una conexión TLS en tu implementación de MongoDB para aprovechar este conocimiento recién adquirido? La conexión TLS asegura las conexiones entre conjuntos de réplicas y protege las conexiones de los clientes o aplicaciones a MongoDB.

Source:
https://adamtheautomator.com/mongodb-kubernetes/