BLOG | NGINX

MARA: Actuellement en cours d'exécution sur un poste de travail près de chez vous

Vignette de Jason Schmidt
Jason Schmidt
Publié le 22 avril 2022

Lorsque nous avons commencé à travailler sur le projet NGINX Modern Apps Reference Architecture (MARA), nous avons choisi AWS comme fournisseur IaaS car nous connaissions déjà la plateforme et nous pouvions utiliser notre budget départemental pour le financer. Bien entendu, tout le monde n’a pas la même expérience ni le même budget, et beaucoup d’entre vous nous ont demandé de fournir des options pour exécuter MARA localement (dans un environnement de laboratoire ou même sur un poste de travail) avec des distributions Kubernetes telles que K3s , Canonical MicroK8s et minikube .

Nous vous avons entendu et aujourd’hui nous sommes heureux d’annoncer que nous avons testé MARA sur MicroK8s et que nous fournissons des instructions pour que vous puissiez le déployer vous-même !

Diagramme montrant la topologie de l'architecture de référence des applications modernes NGINX exécutée sur un poste de travail

Pourquoi avons-nous choisi MicroK8s pour nos tests ? Parce qu'il fournit les capacités DNS, de stockage et de sortie dont MARA a besoin, dans un modèle facile à déployer avec une faible empreinte mémoire. Avec MicroK8s, nous pouvons facilement et à plusieurs reprises parcourir des scénarios de test pour déterminer les exigences minimales pour les déploiements qui offrent des niveaux de performances raisonnables.

Nous espérons que ce travail facilitera nos tests sur d'autres distributions Kubernetes ; pour plus d'informations sur l'état actuel des différentes distributions, consultez notre dépôt GitHub . Si vous avez une distribution préférée que vous souhaitez voir sur la liste, nous vous invitons à forker, tester et créer des pull requests !

Gérer les contraintes de ressources

Les principales contraintes pour exécuter MARA localement sont la mémoire et le processeur. Lors des tests préliminaires, nous avons constaté que la majorité des problèmes d’épuisement de mémoire venaient d’Elasticsearch. Kibana devient presque inutilisable avec une configuration disposant d’une mémoire très limitée (moins de 16 Go). Pour remédier à cela, nous avons ajouté dans le fichier de configuration MARA des réglages supprimant les protections de redondance normalement présentes dans un déploiement complet d’Elasticsearch. Si cela augmente les risques de pannes, ce compromis reste indispensable en environnement aux ressources limitées.

Les contraintes sur le processeur sont directement liées à la quantité de charge imposée à notre exemple d'application Bank of Sirius . Le déploiement MARA inclut Locust pour générer une charge sur Bank of Sirius, avec des paramètres contrôlés par l'utilisateur pour le nombre d'utilisateurs et le taux d'apparition de nouveaux utilisateurs.

Notez que l’augmentation de la charge sur Bank of Sirius affecte également le reste du système. Si le nombre d'utilisateurs ou le taux d'apparition est trop élevé, les performances de MARA se dégradent au point où les composants risquent de planter ou de se bloquer. Les valeurs qui provoquent ce comportement dépendent du processeur disponible, mais vous pouvez vous attendre à un déploiement avec au moins la capacité spécifiée dans Exigences pour gérer la charge créée par jusqu'à 64 utilisateurs et une fréquence d'exécution de 16 utilisateurs à la fois.

Déploiement de MARA sur MicroK8s

Maintenant que vous avez tout compris, vous êtes prêt à défendre MARA sur MicroK8s !

Exigences

  • accès root sur un système (serveur Linux bare-metal, virtualisé ou cloud) exécutant Ubuntu 20.04 (Focal) ou une version ultérieure, avec au minimum :

    • Disque de 20 Go
    • Mémoire de 16 Go
    • L'équivalent de 4 CPU
  • Un environnement virtuel Python 3 sur le système local avec toutes les bibliothèques et binaires requis par MARA. Si Python 3 n’est pas déjà installé, exécutez ces commandes :

    $  sudo apt update$  sudo apt install -y python3-venv
  • Au moins une adresse IPv4 libre pour l'équilibreur de charge MetalLB intégré de MicroK8s à attribuer à la sortie du contrôleur d'entrée NGINX. Si vous accédez à l'application Bank of Sirius via localhost, toute adresse privée disponible (conforme RFC 1918 ) est acceptable. Par exemple, si votre réseau est 192.168.100.0/24, vous pouvez utiliser une adresse telle que 10.10.10.10.

  • Un compte Pulumi et un jeton d'accès. Si vous ne les possédez pas déjà, vous les créerez à l'étape 1 du déploiement de MARA .

    Notez que même si Pulumi vous permet de stocker le fichier d’état dans un magasin d’objets compatible S3 ou sur le système de fichiers local, MARA ne prend pas en charge cette fonction au moment de la rédaction. Cette limitation sera supprimée dans une future version de MARA ou Pulumi.

Installer et configurer MicroK8s

  1. Installer MicroK8s :

    $ sudo snap install microk8s --classicmicrok8s (1.23/stable) v1.23.3 from Canonical✓ installed
  2. Définissez les autorisations nécessaires pour exécuter les commandes microk8s . Pour <nom d'utilisateur>, remplacez votre compte qui a racine privilège sur le système :

    $ sudo usermod -a -G microk8s <username>$ sudo chown -f -R <username> ~/.kube
    $ newgrp microk8s
  3. Déconnectez-vous de votre compte root et reconnectez-vous pour que les nouvelles autorisations prennent effet.

  4. Activez les modules complémentaires MicroK8s pour DNS , stockage et MetalLB .

    À l'invite, spécifiez une plage d'adresses IP au format X . X . X . XX . X . X . Y pour représenter :

    • Une plage réelle d'adresses IP privées (par exemple,192.168.100.100-192.168.100.110 , la valeur utilisée ci-dessous)
    • Une seule adresse IP privée (par exemple,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. Confirmez que MicroK8s est en cours d'exécution :

    $ 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. Chargez la configuration MicroK8s dans le fichier où la plupart des utilitaires s'attendent à la trouver ( ~/.kube/config ) et définissez les autorisations recommandées sur le répertoire et le fichier :

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

Cloner le référentiel MARA et configurer le cluster MicroK8s

  1. Clonez le référentiel MARA et initialisez le sous-module Bank of Sirius :

    $ git clone https://github.com/nginxinc/kic-reference-architectures.git$ cd kic-reference-architectures/
    $ git submodule update --init --recursive --remote
  2. En travaillant dans le répertoire racine du référentiel MARA cloné (vous avez changé de répertoire à l'étape précédente), configurez l'environnement virtuel Python pour le cluster MicroK8s :

    $ ./bin/setup_venv.sh

    Cette commande génère une longue trace. S'il y a des erreurs, veuillez consulter la section Problèmes connus/Avertissements du référentiel GitHub MARA pour obtenir des suggestions.

  3. Activer l'environnement virtuel Python. La commande définit votre PATH et d’autres variables d’environnement pour utiliser l’environnement virtuel :

    $ source ./pulumi/python/venv/bin/activate
  4. Confirmez que le cluster MicroK8s est correctement configuré pour le déploiement 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.                                            |
    ==============================================================

Déployer MARA

Le script start.sh , utilisé dans cette section pour déployer MARA, prend en charge les options qui nécessitent des actions supplémentaires pour que le déploiement réussisse. Par souci de simplicité, nous supposons ici un déploiement de base qui :

  • Utilise les fichiers kubeconfig plutôt que l’une des autres options de déploiement prises en charge. Pour plus de détails sur les autres options, consultez le Guide de démarrage sur notre dépôt GitHub.
  • Utilise la version la plus récente de NGINX Open Source avec laquelle nous avons testé MARA (pas nécessairement la toute dernière version).
  • Utilise le contrôleur d'entrée NGINX basé sur NGINX Open Source. Si vous souhaitez utiliser le contrôleur d’entrée NGINX basé sur NGINX Plus, vous devez utiliser une image basée sur NGINX Plus à partir du registre Docker F5 dans votre cluster Kubernetes. Consultez le premier AVIS ! à l’étape 3 ci-dessous pour plus d’informations.
  • Utilise un seul contexte Kubernetes standard. Voir le deuxième AVIS ! à l’étape 3.

Déployer MARA dans le cluster MicroK8s :

  1. Exécutez le script start.sh .

    Si vous n'avez pas encore configuré votre poste de travail pour utiliser Pulumi, vous êtes invité à vous connecter à Pulumi (en créant un compte si nécessaire), puis à saisir le jeton API associé à votre compte 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. Sélectionnez le type de déploiement en tapant k à l’invite pour créer le déploiement avec les fichiers kubeconfig. Ignorez les avertissements concernant make et Docker qui ne sont pas installés : le déploiement utilise à la place une image NGINX Ingress Controller à partir d’un registre.

    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. À l'invite, spécifiez le nom de la pile Pulumi à créer (ici, mara ). Il doit être unique dans votre compte 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. Aux invites, spécifiez le chemin d’accès complet à votre fichier kubeconfig et le nom du cluster. Les voici /maison/<nom d'utilisateur>/.kube/config et cluster 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. Spécifiez le nom de domaine complet (FQDN) du cluster à l’invite suivante. Le script utilise le FQDN à deux fins : pour configurer NGINX Ingress Controller et pour créer le certificat auto-signé (la deuxième utilisation signifie que la valeur ne peut pas être une adresse IP). Si vous remplacez mara.example.com par un autre FQDN, n'oubliez pas de l'utiliser également dans les étapes suivantes.

  6. Create a fqdn for your deploymentvalue: mara.example.com
  7. Spécifiez le mot de passe administrateur 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. Une trace du processus d'installation apparaît, affichant les informations suivantes pour chaque étape :

    • Une bannière décrivant l'action clé effectuée dans l'étape (par exemple, Logstore signale le début du déploiement d'Elasticsearch)
    • Une liste des tâches que Pulumi va effectuer
    • Un indicateur d'état en temps réel pour chaque tâche Pulumi
    • Diagnostics générés par Pulumi et MARA, par exemple, le nom d'hôte et l'adresse IP définis
    • Nombre de ressources concernées
    • Le temps écoulé

    Lorsque l'étape finale (pour Bank of Sirius) est terminée, la trace indique l'adresse IP attribuée au contrôleur d'entrée NGINX par MetalLB (ici192.168.100.100 ) et le FQDN que vous avez choisi pour le déploiement (ici mara.example.com ) ainsi que d'autres informations sur le déploiement.

    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. Créez un mappage entre le FQDN et l’adresse IP signalés à l’étape précédente, dans l’outil que vous utilisez pour résoudre les FQDN (tel que le fichier /etc/hosts local ou le serveur DNS).

  10. Vérifiez qu’une demande de déploiement MARA réussit. Incluez l’option -k pour que curl accepte un certificat auto-signé. Pour afficher plus d'informations sur le certificat, ajoutez l'option -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. Accédez à https://mara.example.com dans un navigateur pour afficher le site Web de la Bank of Sirius. Au moment de la rédaction de cet article, avec de nombreux navigateurs (y compris Firefox et Safari), vous pouvez cliquer en toute sécurité sur l’avertissement qui s’affiche concernant le site utilisant un certificat auto-signé. Nous vous recommandons de ne pas utiliser Chrome : en raison de récents changements de sécurité, il est probable que vous ne puissiez pas accéder au site.

  12. Exécutez le script test-forward.sh pour configurer la redirection de port Kubernetes afin de pouvoir accéder aux outils de la suite de gestion MARA : Elasticsearch , Grafana , Kibana , Locust et Prometheus . Le script détermine les noms de service appropriés et exécute les commandes kubectl pour les transmettre aux ports locaux.

    Note: Pour que la redirection de port fonctionne correctement, votre navigateur doit être exécuté sur le même système que l'interpréteur de commandes sur lequel vous exécutez cette commande. Dans le cas contraire (parce que vous utilisez un environnement de virtualisation, par exemple), la commande semble réussir, mais la redirection de port ne fonctionne pas réellement. Pour plus d'informations, consultez Accès aux outils de gestion dans MARA dans notre référentiel 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

Résumé

C'est ça! Avec ces instructions, un déploiement MARA fonctionnel est opérationnel dans votre environnement en 20 minutes environ. À ce stade, vous pouvez interagir avec l’application Bank of Sirius comme n’importe quelle autre application Kubernetes. Un bon point de départ consiste à utiliser les outils d’observabilité intégrés pour tester le comportement de l’environnement lorsque vous générez différentes quantités de charge avec Locust.

Notre objectif est de rendre MARA aussi utile que possible pour autant d'utilisateurs Kubernetes que possible. Vous n'aimez pas les choix que nous avons faits pour certains composants ? Nous vous encourageons à remplacer vos composants et à ouvrir une demande d'extraction si vous souhaitez partager. N'hésitez pas également à partager vos réflexions et à poser des questions, notamment sur les hypothèses douteuses que nous avons formulées, sur les pages Problèmes et discussions de notre référentiel.

Articles Similaires

Cet article fait partie d'une série. Au fur et à mesure que nous ajoutons des fonctionnalités à MARA, nous publions les détails sur le blog :


« Cet article de blog peut faire référence à des produits qui ne sont plus disponibles et/ou qui ne sont plus pris en charge. Pour obtenir les informations les plus récentes sur les produits et solutions F5 NGINX disponibles, explorez notre famille de produits NGINX . NGINX fait désormais partie de F5. Tous les liens NGINX.com précédents redirigeront vers un contenu NGINX similaire sur F5.com."