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.
¿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!
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 aplicação 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.
¡Con esos antecedentes fuera del camino, estás listo para enfrentar a MARA en MicroK8!
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:
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 aplicação 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 MicroK8s:
$ sudo snap install microk8s --classicmicrok8s (1.23/stable) v1.23.3 from Canonical✓ installed
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
Cierre la sesión de su cuenta con privilegios de raíz y vuelva a iniciarla para que los nuevos permisos surtan efecto.
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 . X ‑ X . X . X . Y
para representar:
192.168.100.100-192.168.100.110
, el valor utilizado a continuación)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
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
...
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 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
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.
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
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. |
==============================================================
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:
¡AVISO!
en el paso 3 a continuación para obtener más información.AVISO!
en el paso 3.Implementar MARA en el clúster MicroK8s:
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.
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.
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.
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
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.
Create a fqdn for your deploymentvalue: mara.example.com
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 seguimiento del proceso de instalación, mostrando la siguiente información para cada paso:
Logstore
señala el inicio de la implementación de Elasticsearch)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
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).
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
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.
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
¡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 aplicação Bank of Sirius como cualquier otra aplicação 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.
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.