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 !
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 !
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.
Maintenant que vous avez tout compris, vous êtes prêt à défendre MARA sur MicroK8s !
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 :
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 MicroK8s :
$ sudo snap install microk8s --classicmicrok8s (1.23/stable) v1.23.3 from Canonical✓ installed
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
Déconnectez-vous de votre compte root et reconnectez-vous pour que les nouvelles autorisations prennent effet.
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 . X ‑ X . X . X . Y
pour représenter :
192.168.100.100-192.168.100.110
, la valeur utilisée ci-dessous)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
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
...
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
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
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.
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
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. |
==============================================================
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 :
AVIS !
à l’étape 3 ci-dessous pour plus d’informations.AVIS !
à l’étape 3.Déployer MARA dans le cluster MicroK8s :
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.
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.
À 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.
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
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.
Create a fqdn for your deploymentvalue: mara.example.com
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>
Une trace du processus d'installation apparaît, affichant les informations suivantes pour chaque étape :
Logstore
signale le début du déploiement d'Elasticsearch)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
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).
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
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.
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
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.
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."