BLOG | NGINX

MARA: Ahora funcionando en una estación de trabajo cerca de usted

Miniatura de Jason Schmidt
Jason Schmidt
Publicado el 22 de abril de 2022

Cuando comenzamos a trabajar en el proyecto NGINX Modern Apps Reference Architecture (MARA), elegimos a AWS como nuestro proveedor de IaaS porque ya estábamos familiarizados con la plataforma y podíamos usar nuestro presupuesto departamental para pagarla. No todos tienen la misma experiencia o presupuesto, por supuesto, y muchos de ustedes nos han pedido que proporcionemos 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 .

Te escuchamos y hoy tenemos el placer de anunciar que hemos probado MARA en MicroK8 y estamos brindando instrucciones para que puedas implementarlo tú mismo.

Diagrama que muestra la topología de la arquitectura de referencia de aplicaciones modernas NGINX que se ejecuta en una estación de trabajo

¿Por qué elegimos MicroK8s para nuestras pruebas? Porque proporciona las capacidades de DNS, almacenamiento y salida que MARA necesita, en un modelo fácil de implementar con un bajo consumo de memoria. Con MicroK8s, podemos iterar fácilmente y repetidamente a través de escenarios de prueba para determinar los requisitos mínimos para implementaciones que brinden niveles razonables de rendimiento.

Nuestra expectativa es que este trabajo facilitará nuestras pruebas de otras distribuciones de Kubernetes; para obtener información sobre el estado actual de varias distribuciones, consulte nuestro repositorio de GitHub . Si tienes una distribución favorita que quieres ver en la lista, ¡te invitamos a bifurcar, probar y crear solicitudes de extracción!

Cómo afrontar las limitaciones de recursos

Las mayores limitaciones para ejecutar MARA localmente son la memoria y la CPU. Durante las pruebas preliminares, descubrimos que la mayoría de los problemas con el agotamiento de la memoria afectaban a Elasticsearch. Kibana es casi inutilizable en configuraciones con una cantidad de memoria extremadamente pequeña (menos de 16 GB ). Para solucionar este problema, hemos proporcionado configuraciones en el archivo de configuración de MARA que eliminan las protecciones de redundancia que normalmente tiene una implementación completa de Elasticsearch. Si bien esto aumenta el número de modos de falla, es una compensación necesaria en entornos con recursos limitados.

Las restricciones de la CPU están directamente relacionadas con la cantidad de carga impuesta a nuestra aplicación de muestra Bank of Sirius . La implementación de MARA incluye Locust para generar carga en Bank of Sirius, con configuraciones controladas por el usuario para la cantidad de usuarios y la tasa de generación de nuevos usuarios.

Tenga en cuenta que aumentar la carga en el Banco de Sirio también afecta al resto del sistema. Si el número de usuarios o la tasa de generación es demasiado alta, el rendimiento de MARA se degrada hasta el punto en que es probable que los componentes se bloqueen o se detengan. Los valores que provocan este comportamiento dependen de la CPU disponible, pero puede esperar una implementación con al menos la capacidad especificada en Requisitos para manejar la carga creada por hasta 64 usuarios y una tasa de extensión de 16 usuarios a la vez.

Implementación de MARA en MicroK8

¡Con esos antecedentes fuera del camino, estás listo para enfrentar a MARA en MicroK8!

Requisitos

  • acceso root en un sistema (servidor Linux físico, virtualizado o en la nube) que ejecute Ubuntu 20.04 (Focal) o posterior, con al menos:

    • 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 binarios requeridos por 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 de MicroK8s la asigne a la salida del controlador de ingreso NGINX. Si accede a la aplicación Bank of Sirius a través del host local, cualquier dirección privada disponible (compatible con RFC 1918 ) es aceptable. Por ejemplo, si su red es 192.168.100.0/24 puede utilizar una dirección como 10.10.10.10.

  • Una cuenta Pulumi y un token de acceso. Si aún no los tiene, los creará en el Paso 1 de Implementar MARA .

    Tenga en cuenta que, si bien Pulumi le 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 esto al momento de escribir este artículo. Esta limitación se eliminará en una futura versión de MARA o Pulumi.

Instalar y configurar MicroK8s

  1. Instalar MicroK8s:

    $ sudo snap install microk8s --classicmicrok8s (1.23/stable) v1.23.3 from Canonical✓ installed
  2. Establezca los permisos necesarios para ejecutar comandos microk8s . Para <nombre de usuario>, sustituye tu cuenta que tiene raíz privilegio en el sistema:

    $ sudo usermod -a -G microk8s <username>$ sudo chown -f -R <username> ~/.kube
    $ newgrp microk8s
  3. Cierre la sesión de su cuenta con privilegios de raíz y vuelva a iniciarla para que los nuevos permisos surtan efecto.

  4. Habilite los complementos de MicroK8s para DNS , almacenamiento y MetalLB .

    En el aviso, especifique un rango de direcciones IP con el formato X . X . X . XX . X . X . Y para representar:

    • 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 )
    $ 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
  5. Confirme que MicroK8s se está ejecutando:

    $ 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
    ...
  6. Cargue la configuración de MicroK8s en el archivo donde la mayoría de las utilidades esperan encontrarlo ( ~/.kube/config ) y configure los permisos recomendados en el directorio y el archivo:

    $ microk8s config > ~/.kube/config$ sudo chmod 0644 ~/.kube/config

Clonar el repositorio MARA y configurar el clúster MicroK8s

  1. Clonar el repositorio MARA e inicializar 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
  2. Trabajando en el directorio raíz del repositorio MARA clonado (cambió el directorio allí en el paso anterior), configure el entorno virtual de Python para el clúster MicroK8s:

    $ ./bin/setup_venv.sh

    Este comando genera un seguimiento largo. Si hay errores, consulte la sección Problemas conocidos/Advertencias en el repositorio de GitHub de MARA para obtener sugerencias.

  3. Activar el entorno virtual de Python. El comando establece su PATH y otras variables de entorno para utilizar el entorno virtual:

    $ source ./pulumi/python/venv/bin/activate
  4. Confirme que el clúster MicroK8s esté configurado correctamente para la implementación 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.                                            |
    ==============================================================

Implementar MARA

El script start.sh , que se utiliza en esta sección para implementar MARA, admite opciones que requieren acciones adicionales para que la implementación sea exitosa. Para simplificar, aquí asumimos una implementación básica que:

  • Utiliza archivos kubeconfig en lugar de una de las otras opciones de implementación compatibles. Para obtener detalles sobre las otras opciones, consulte la Guía de primeros pasos 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).
  • Utiliza el controlador de ingreso NGINX basado en NGINX de código abierto. Si desea utilizar el controlador de ingreso NGINX basado en NGINX Plus, debe utilizar una imagen basada en NGINX Plus del registro Docker de F5 en su clúster de Kubernetes. Consulte el primer ¡AVISO! en el paso 3 a continuación para obtener más información.
  • Utiliza un único contexto de Kubernetes estándar. ¡Vea el segundo AVISO! en el paso 3.

Implementar MARA en el clúster MicroK8s:

  1. Ejecute el script start.sh .

    Si aún no ha configurado su estación de trabajo para usar Pulumi, se le indicará que inicie sesión en Pulumi (creando una cuenta si es necesario) y luego se le solicitará el token de API asociado con 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.
  2. Seleccione el tipo de implementación y escriba k en el indicador para crear la implementación con archivos kubeconfig. Ignore las advertencias sobre que make y Docker no están instalados: la implementación utiliza una imagen del controlador de ingreso NGINX 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.
  3. En el aviso, especifique el nombre de la pila Pulumi que se creará (aquí, mara ). Debe ser único dentro de su cuenta 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.
  4. En las indicaciones, especifique la ruta completa a su archivo kubeconfig y el nombre del clúster. Aquí están /hogar/<nombre de usuario>/.kube/config y clúster microk8s.

    Provide an absolute path to your kubeconfig filevalue: /home/<username>/.kube/config
    Provide your clustername
    value: microk8s-cluster
    Attempting to connect to kubernetes cluster
  5. Especifique el nombre de dominio completo (FQDN) para el clúster en el siguiente mensaje. El script utiliza el FQDN para dos propósitos: configurar el controlador de ingreso NGINX y crear el certificado autofirmado (el segundo uso significa que el valor no puede ser una dirección IP). Si sustituye un FQDN diferente para mara.example.com , recuerde usarlo también en los siguientes pasos.

  6. Create a fqdn for your deploymentvalue: mara.example.com
  7. 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>
  8. Aparece un seguimiento del proceso de instalación, mostrando la siguiente información para cada paso:

    • Un banner que describe la acción clave realizada en el paso (por ejemplo, Logstore señala el inicio de la implementación 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 se completa el paso final (para Bank of Sirius), el seguimiento informa la dirección IP asignada al controlador de ingreso NGINX por MetalLB (aquí192.168.100.100 ) y el FQDN que eligió para la implementación (aquí mara.example.com ) junto con otra información sobre la implementación.

    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
  9. Cree una asignación entre el FQDN y la dirección IP informada en el paso anterior, en la herramienta que utiliza para resolver FQDN (como el archivo /etc/hosts local o el servidor DNS).

  10. Verificar que una solicitud a la implementación de MARA tenga éxito. Incluya la opción -k para que curl acepte un certificado autofirmado. Para mostrar más información sobre el certificado, agregue 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
  11. Navegue en un navegador a https://mara.example.com para mostrar el sitio web del Banco de Sirius. Al momento de escribir esto, con muchos navegadores (incluidos Firefox y Safari) puedes hacer clic de manera segura en la advertencia que aparece sobre el sitio que utiliza un certificado autofirmado. Le recomendamos que no utilice Chrome: debido a cambios de seguridad recientes, es probable que le impida acceder al sitio.

  12. Ejecute el script test-forward.sh para configurar el reenvío de puertos de Kubernetes para que pueda acceder a las herramientas de la suite de administración MARA: Elasticsearch , Grafana , Kibana , Locust y Prometheus . El script determina los nombres de servicio apropiados y ejecuta comandos kubectl para reenviarlos a los puertos locales.

    Nota:  Para que el reenvío de puertos funcione correctamente, su navegador debe estar ejecutándose en el mismo sistema que el shell de comandos donde ejecuta este comando. En caso contrario (porque estás usando un entorno de virtualización, por ejemplo), el comando parece tener éxito pero el reenvío de puertos en realidad no funciona. Para obtener más información, consulte Acceder a las herramientas de administración en 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! Con estas instrucciones, una implementación de MARA funcional estará lista y funcionando en su entorno en aproximadamente 20 minutos. En este punto, puedes interactuar con la aplicación Bank of Sirius como cualquier otra aplicación de Kubernetes. Un buen lugar para comenzar es utilizar las herramientas de observación integradas para probar cómo se comporta el entorno a medida que genera diferentes cantidades de carga con Locust.

Nuestro objetivo es hacer que MARA sea lo más útil posible para la mayor cantidad posible de usuarios de Kubernetes. ¿No te gustan las elecciones que hemos hecho para algunos de los componentes? Te recomendamos que sustituyas tus componentes y abras una solicitud de extracción si deseas compartirlos. Además, comparta sus ideas y haga preguntas (incluso sobre cualquier suposición cuestionable que hayamos hecho) en las páginas de Problemas y Discusiones de nuestro repositorio.

Publicaciones relacionadas

Esta publicación es parte de una serie. A medida que vayamos añadiendo capacidades a MARA, publicaremos los detalles en el blog:


"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.