MARA: ahora disponible en una estación de trabajo cerca de ti

NGINX | 22 de abril de 2022

Cuando empezamos a trabajar en el proyecto Arquitectura de referencia de aplicaciones modernas de NGINX (MARA), elegimos AWS como proveedor de IaaS porque ya conocíamos la plataforma y podíamos utilizar el presupuesto de nuestro departamento para pagarlo. Por supuesto, no todo el mundo tiene la misma experiencia ni el mismo presupuesto, y muchos nos habéis pedido que ofrezcamos opciones para ejecutar MARA localmente —en un entorno de laboratorio o incluso en una estación de trabajo— con distribuciones de Kubernetes como K3s, Canonical MicroK8s y minikube.

Hemos escuchado vuestras peticiones y hoy nos complace anunciar que hemos probado MARA en MicroK8s y que ponemos a vuestra disposición las instrucciones para que podáis implementarlo vosotros mismos.

Diagrama que muestra la topología de NGINX Modern Apps Reference Architecture ejecutándose en una estación de trabajo

¿Por qué elegimos MicroK8s para nuestras pruebas? Porque proporciona las funcionalidades de DNS, almacenamiento y salida que necesita MARA en un modelo fácil de implementar y con un bajo consumo de memoria. Con MicroK8s, podemos iterar de forma sencilla y repetida sobre distintos escenarios de prueba para determinar los requisitos mínimos de las implementaciones que ofrecen niveles de rendimiento razonables.

Esperamos que este trabajo facilite nuestras pruebas de otras distribuciones de Kubernetes. Para obtener información sobre el estado actual de las distintas distribuciones, consulta nuestro repositorio de GitHub. Si tienes una distribución favorita que te gustaría ver en la lista, te invitamos a crear una bifurcación, probarla y enviar solicitudes de incorporación de cambios.

Cómo afrontar las limitaciones de recursos

Las principales limitaciones para ejecutar MARA localmente son la memoria y la CPU. Durante las pruebas preliminares, descubrimos que la mayoría de los problemas de agotamiento de memoria estaban relacionados con Elasticsearch. Kibana resulta prácticamente inutilizable en configuraciones con una cantidad de memoria extremadamente reducida (menos de 16 GB). Para solucionar este problema, hemos incluido opciones en el archivo de configuración de MARA que eliminan las protecciones de redundancia que normalmente incorpora un despliegue completo de Elasticsearch. Aunque esto aumenta el número de posibles fallos, es una contrapartida necesaria en entornos con recursos limitados.

Las limitaciones de la CPU están directamente relacionadas con la carga aplicada a nuestra aplicación de ejemplo Bank of Sirius. El despliegue de MARA incluye Locust para generar carga en Bank of Sirius, con ajustes configurables por el usuario para el número de usuarios y la velocidad de incorporación de nuevos usuarios.

Ten en cuenta que aumentar la carga en Bank of Sirius también afecta al resto del sistema. Si el número de usuarios o la tasa de generación son demasiado altos, el rendimiento de MARA se degrada hasta el punto de que es probable que los componentes fallen o se bloqueen. Los valores que provocan este comportamiento dependen de la CPU disponible, pero cabe esperar que un despliegue con al menos la capacidad especificada en Requisitos pueda gestionar la carga generada por hasta 64 usuarios y una tasa de generación de 16 usuarios a la vez.

Despliegue de MARA en MicroK8s

Ahora que ya conoces el contexto, ¡estás listo para desplegar MARA en MicroK8s!

Requisitos

  • root en un sistema (servidor Linux físico, virtualizado o en la nube) que ejecute Ubuntu 20.04 (Focal) o una versión posterior y que disponga, como mínimo, de:
    • Disco de 20 GB
    • 16 GB de memoria
    • El equivalente a 4 CPU
  • Un entorno virtual de Python 3 en el sistema local con todas las bibliotecas y los archivos binarios que requiere MARA. Si Python 3 aún no está instalado, ejecute estos comandos:
$  sudo apt update$  sudo apt install -y python3-venv
  • Al menos una dirección IPv4 libre para que el balanceador de carga MetalLB integrado en MicroK8s la asigne al tráfico de salida del controlador de entrada NGINX. Si accede a la aplicación Bank of Sirius mediante localhost, puede utilizar cualquier dirección privada disponible (que cumpla con la norma RFC 1918). Por ejemplo, si su red es 192.168.100.0/24, puede utilizar una dirección como 10.10.10.10.
  • Una cuenta de Pulumi y un token de acceso. Si aún no dispone de ellos, los creará en el Paso 1 de Implementar MARA. Tenga en cuenta que, aunque Pulumi permite almacenar el archivo de estado en un almacén de objetos compatible con S3 o en el sistema de archivos local, MARA no admite esta opción en el momento de redactar este documento. Esta limitación se eliminará en una futura versión de MARA o Pulumi.

Instalar y configurar MicroK8s

  1. Instala MicroK8s:
$ sudo snap install microk8s --classicmicrok8s (1.23/stable) v1.23.3 from Canonical✓ installed
  1. Configura los permisos necesarios para ejecutar los comandos de microk8s. Sustituye <username> por tu cuenta con privilegios de root en el sistema:
$ sudo usermod -a -G microk8s <username>$ sudo chown -f -R <username> ~/.kube
$ newgrp microk8s
  1. Cierra la sesión de tu cuenta con privilegios de root y vuelve a iniciarla para que los nuevos permisos surtan efecto.
  2. Habilite los complementos de MicroK8s para DNS, almacenamiento, y MetalLB. Cuando se le solicite, especifique un intervalo de direcciones IP con el formato X.X.X.X‑X.X.X.Y que represente una de las siguientes opciones:
$ microk8s enable dns storage metallbEnabling DNS
Applying manifest
...
Restarting kubelet
DNS is enabled
Enabling default storage class
...
Storage will be available soon
Enabling MetalLB
Enter each IP address range delimited by comma (e.g. '10.64.140.43-10.64.140.49,192.168.0.105-192.168.0.111'): 192.168.100.100-192.168.100.110
Applying Metallb manifest
...
MetalLB is enabled
  • Un rango real de direcciones IP privadas (por ejemplo, 192.168.100.100-192.168.100.110, el valor utilizado a continuación)
  • Una única dirección IP privada (por ejemplo, 192.168.100.100-192.168.100.100)
  1. Confirma que MicroK8s esté en ejecución:
$ microk8s statusmicrok8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
addons:
  enabled:
    dns           # CoreDNS
    ha-cluster    # Configure high availability on the current node
    metallb       # Loadbalancer for your Kubernetes cluster
    storage       # Storage class; allocates storage from host directory
...
  1. Carga la configuración de MicroK8s en el archivo donde la mayoría de las utilidades esperan encontrarla (~/.kube/config) y establece los permisos recomendados para el directorio y el archivo:
$ microk8s config > ~/.kube/config$ sudo chmod 0644 ~/.kube/config

Clona el repositorio de MARA y configura el clúster de MicroK8s

  1. Clona el repositorio de MARA e inicializa el submódulo Bank of Sirius:
$ git clone https://github.com/nginxinc/kic-reference-architectures.git$ cd kic-reference-architectures/
$ git submodule update --init --recursive --remote
  1. Desde el directorio raíz del repositorio de MARA clonado (al que accedió en el paso anterior), configure el entorno virtual de Python para el clúster de MicroK8s:
$ ./bin/setup_venv.sh
  1. Este comando genera un registro de seguimiento extenso. Si se produce algún error, consulte la sección Problemas conocidos/Advertencias del repositorio de MARA en GitHub para obtener sugerencias.
  2. Active el entorno virtual de Python. El comando configura la variable PATH y otras variables de entorno para utilizar el entorno virtual:
$ source ./pulumi/python/venv/bin/activate
  1. Confirme que el clúster de MicroK8s esté configurado correctamente para el despliegue de MARA:
$ ./bin/testcap.sh
This script will perform testing on the current kubernetes installation using the currently active kubernetes configuration and context.
Any failures should be investigated, as they will indicate that the installation does not meet the minimum set of capabilities required to run MARA.

...
==============================================================
| All tests passed! This system meets the basic requirements |
| to deploy MARA.                                            |
==============================================================

Desplegar MARA

El script start.sh, que se utiliza en esta sección para desplegar MARA, admite opciones que requieren acciones adicionales para que el despliegue se complete correctamente. Para simplificar, aquí suponemos un despliegue básico que:

  • Utiliza archivos kubeconfig en lugar de alguna de las otras opciones de despliegue compatibles. Para obtener más información sobre las demás opciones, consulte la Guía de introducción en nuestro repositorio de GitHub.
  • Utiliza la versión más reciente de NGINX Open Source con la que hemos probado MARA (no necesariamente la última versión disponible).
  • Utiliza NGINX Ingress Controller basado en NGINX Open Source. Si desea utilizar NGINX Ingress Controller basado en NGINX Plus, debe usar una imagen basada en NGINX Plus del registro de Docker de F5 en su clúster de Kubernetes. Consulte el primer aviso «¡AVISO!» del paso 3 que aparece a continuación para obtener más información.
  • Utiliza un único contexto estándar de Kubernetes. Consulte el segundo ¡AVISO! del paso 3.

Despliegue MARA en el clúster de MicroK8s:

  1. Ejecute el script start.sh. Si aún no ha configurado su estación de trabajo para usar Pulumi, se le pedirá que inicie sesión en Pulumi (y que cree una cuenta si es necesario) y, a continuación, que introduzca el token de API asociado a su cuenta de Pulumi.
$ ./bin/start.shAdding to [/home/ubuntu/kic-reference-architectures/bin/venv/bin] to PATH
Manage your Pulumi stacks by logging in.
Run `pulumi login --help` for alternative login options.
Enter your access token from https://app.pulumi.com/account/tokens
    or hit <ENTER> to log in using your browser            : <token>

Please read the documentation for more details.
  1. Seleccione el tipo de despliegue escribiendo k cuando se le solicite para crear el despliegue con archivos kubeconfig. Ignore las advertencias que indican que make y Docker no están instalados; el despliegue utiliza en su lugar una imagen de NGINX Ingress Controller procedente de un registro.
Type a for AWS, k for kubeconfig? k
Calling kubeconfig startup script
make is not installed - it must be installed if you intend to build NGINX Kubernetes Ingress Controller from source.
docker is not installed - it must be installed if you intend to build NGINX Kubernetes Ingress Controller from source.

  1. Cuando se le solicite, especifique el nombre de la pila de Pulumi que desea crear (en este caso, mara). Debe ser único dentro de su cuenta de Pulumi.
Enter the name of the Pulumi stack to use in all projects: maraSubmodule source found
Configuring all Pulumi projects to use the stack: mara
Created stack 'mara'

NOTICE! Currently the deployment via kubeconfig only supports pulling images from the registry! A JWT is required in order to access the NGINX Plus repository. This should be placed in a file in the extras directory in the root, in a file named jwt.token

See https://docs.nginx.com/nginx-ingress-controller/installation/using-the-jwt-token-docker-secret/ for more details and examples.

No JWT found; writing placeholder manifest

NOTICE! When using a kubeconfig file you need to ensure that your environment is configured to connect to Kubernetes properly. If you have multiple kubernetes contexts (or custom contexts) you may need to remove them and replace them with a simple ~/.kube/config file. This will be addressed in a future release.
  1. Cuando se le solicite, especifique la ruta completa del archivo kubeconfig y el nombre del clúster. En este caso, son /home/<username>/.kube/config y microk8s-cluster.
Provide an absolute path to your kubeconfig filevalue: /home/<username>/.kube/config
Provide your clustername
value: microk8s-cluster
Attempting to connect to kubernetes cluster
  1. Especifique el nombre de dominio completo (FQDN) del clúster cuando se le solicite a continuación. El script utiliza el FQDN con dos fines: configurar NGINX Ingress Controller y crear el certificado autofirmado (este segundo uso implica que el valor no puede ser una dirección IP). Si sustituye mara.example.com por otro FQDN, recuerde utilizarlo también en los pasos siguientes.
Create a fqdn for your deploymentvalue: mara.example.com
  1. Especifique la contraseña de administrador de Grafana:
Create a password for the grafana admin user; this password will be used to access the Grafana dashboardThis should be an alphanumeric string without any shell special characters; it is presented in plain text due to current limitations with Pulumi secrets. You will need this password to access the Grafana dashboard.
value: <password>

Aparece un registro del proceso de instalación que muestra la siguiente información para cada paso:

  • Un banner que describe la acción principal realizada en el paso (por ejemplo, Logstore indica el inicio del despliegue de Elasticsearch)
  • Una lista de las tareas que Pulumi va a realizar
  • Un indicador de estado en tiempo real para cada tarea de Pulumi
  • Diagnósticos generados por Pulumi y MARA, por ejemplo, el nombre de host y la dirección IP definidos
  • El número de recursos afectados
  • El tiempo transcurrido

Cuando finaliza el último paso (para Bank of Sirius), el seguimiento muestra la dirección IP asignada por MetalLB a NGINX Ingress Controller (en este caso, 192.168.100.100) y el FQDN que eligió para el despliegue (en este caso, mara.example.com), junto con otra información sobre el despliegue.

The startup process has finished successfully
Next Steps:
1. Map the IP address (192.168.100.100) of your Ingress Controller with your FQDN (mara.example.com).
2. Use the ./bin/test-forward.sh program to establish tunnels you can use to connect to the management tools.
3. Use kubectl, k9s, or the Kubernetes dashboard to explore your deployment.

To review your configuration options, including the passwords defined, you can access the pulumi secrets via the following commands:

Main Configuration: pulumi config -C /jenkins/workspace/jaytest/bin/../pulumi/python/config

Bank of Sirius (Example Application) Configuration: pulumi config -C /jenkins/workspace/jaytest/bin/../pulumi/python/kubernetes/applications/sirius

K8 Loadbalancer IP: kubectl get services --namespace nginx-ingress

Please see the documentation in the github repository for more information
  1. Cree una correspondencia entre el FQDN y la dirección IP indicados en el paso anterior en la herramienta que utilice para resolver FQDN (como el archivo local /etc/hosts o el servidor DNS).
  2. Compruebe que la solicitud al despliegue de MARA se realiza correctamente. Incluya la opción -k para que curl acepte un certificado autofirmado. Para mostrar más información sobre el certificado, añada la opción -v.
$ curl -k -I https://mara.example.comHTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Day, DD Mon YYYY hh:mm:ss TZ
Content-Type: text/html; charset=utf-8
Content-Length: 7016
Connection: keep-alive
  1. Acceda desde un navegador a https://mara.example.com para ver el sitio web del Banco de Sirius. En el momento de redactar este texto, muchos navegadores (incluidos Firefox y Safari) permiten ignorar de forma segura la advertencia que aparece porque el sitio utiliza un certificado autofirmado. Le recomendamos que no utilice Chrome, ya que, debido a cambios de seguridad recientes, es probable que le impida acceder al sitio.
  2. Ejecute el script «test-forward.sh» para configurar el reenvío de puertos de Kubernetes y poder acceder a las herramientas del conjunto de administración de MARA: Elasticsearch, Grafana, Kibana, Locust y Prometheus. El script determina los nombres de servicio adecuados y ejecuta comandos de kubectl para reenviarlos a puertos locales. Nota: Para que el reenvío de puertos funcione correctamente, el navegador debe ejecutarse en el mismo sistema que el intérprete de comandos desde el que ejecuta este comando. De lo contrario (por ejemplo, si utiliza un entorno de virtualización), parecerá que el comando se ha ejecutado correctamente, pero el reenvío de puertos no funcionará. Para obtener más información, consulte Acceso a las herramientas de administración de MARA en nuestro repositorio de GitHub.
$ ./bin/test-forward.shConnections Details
====================================
Kibana:        http://localhost:5601
Grafana:       http://localhost:3000
Locust:        http://localhost:8089
Prometheus:    http://localhost:9090
Elasticsearch: http://localhost:9200
====================================

Issue Ctrl-C to Exit

Resumen

¡Eso es todo! Siguiendo estas instrucciones, tendrá un despliegue funcional de MARA en ejecución en su entorno en unos 20 minutos. A partir de este momento, podrá interactuar con la aplicación Bank of Sirius como con cualquier otra aplicación de Kubernetes. Un buen punto de partida es utilizar las herramientas de observabilidad integradas para comprobar cómo se comporta el entorno al generar distintos niveles de carga con Locust.

Nuestro objetivo es que MARA resulte lo más útil posible para el mayor número posible de usuarios de Kubernetes. ¿No te convencen las opciones que hemos elegido para algunos de los componentes? Te animamos a sustituirlos por tus propios componentes y a abrir una solicitud de incorporación de cambios si quieres compartirlos. También puedes compartir tus ideas y plantear preguntas —incluidas las relacionadas con cualquier supuesto cuestionable que hayamos hecho— en las páginas de Incidencias y Debates de nuestro repositorio.

Publicaciones relacionadas

Esta publicación forma parte de una serie. A medida que vayamos incorporando nuevas funcionalidades a MARA, publicaremos todos los detalles en el blog:


Compartir

Artículos relacionados del blog

Únete a F5 NGINX en AppWorld 2024
NGINX | 04/01/2024

Únete a F5 NGINX en AppWorld 2024

Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
NGINX | 26/09/2023

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source

La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.

Exposición de APIs en Kubernetes
NGINX | 10/03/2022

Exposición de APIs en Kubernetes

La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
NGINX | 23/08/2021

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto

Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.

Presentamos NGINX Plus R22
NGINX | 09/06/2020

Presentamos NGINX Plus R22

NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.

Presentamos NGINX Plus R17
NGINX | 11/12/2018

Presentamos NGINX Plus R17

NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.