Als wir mit der Arbeit am NGINX Modern Apps Reference Architecture (MARA)-Projekt begannen, entschieden wir uns für AWS als unseren IaaS-Anbieter, da wir mit der Plattform bereits vertraut waren und sie über unser Abteilungsbudget bezahlen konnten. Natürlich verfügt nicht jeder über die gleiche Erfahrung oder das gleiche Budget, und viele von Ihnen haben uns gebeten, Optionen für die lokale Ausführung von MARA – in einer Laborumgebung oder sogar auf einer Workstation – mit Kubernetes-Distributionen wie K3s , Canonical MicroK8s und minikube bereitzustellen.
Wir haben Sie gehört und freuen uns, Ihnen heute mitteilen zu können, dass wir MARA auf MicroK8s getestet haben und Anweisungen zur Verfügung stellen, damit Sie es selbst einsetzen können!
Warum haben wir für unsere Tests MicroK8s ausgewählt? Weil es die DNS-, Speicher- und Egress-Funktionen bietet, die MARA benötigt, in einem einfach bereitzustellenden Modell mit geringem Speicherbedarf. Mit MicroK8s können wir Testszenarien einfach und wiederholt durchlaufen, um die Mindestanforderungen für Bereitstellungen zu ermitteln, die ein angemessenes Leistungsniveau liefern.
Wir gehen davon aus, dass diese Arbeit unsere Tests anderer Kubernetes-Distributionen erleichtern wird. Informationen zum aktuellen Status verschiedener Distributionen finden Sie in unserem GitHub-Repository . Wenn Sie eine bevorzugte Distribution haben, die Sie in der Liste sehen möchten, laden wir Sie ein, diese zu forken, zu testen und Pull Requests zu erstellen!
Der größte Engpass für den lokalen Betrieb von MARA sind Arbeitsspeicher und CPU. Unsere ersten Tests zeigten, dass die meisten Speicherprobleme bei Elasticsearch auftreten. Mit weniger als 16 GB Arbeitsspeicher ist Kibana kaum nutzbar. Um das zu lösen, bieten wir in der MARA-Konfigurationsdatei Einstellungen an, mit denen Sie die sonst üblichen Redundanzschutzmechanismen bei Elasticsearch ausschalten können. Zwar steigt dadurch das Risiko von Ausfällen, doch ist das der notwendige Kompromiss in ressourcenbegrenzten Umgebungen.
CPU-Einschränkungen stehen in direktem Zusammenhang mit der Belastung unserer Beispielanwendung „Bank of Sirius“ . Die MARA-Bereitstellung umfasst Locust , um Last auf der Bank of Sirius zu generieren, mit benutzergesteuerten Einstellungen für die Anzahl der Benutzer und die Spawn-Rate für neue Benutzer.
Beachten Sie, dass eine erhöhte Belastung der Bank of Sirius auch Auswirkungen auf den Rest des Systems hat. Wenn entweder die Benutzeranzahl oder die Spawn-Rate zu hoch ist, verschlechtert sich die MARA-Leistung bis zu dem Punkt, an dem Komponenten wahrscheinlich abstürzen oder hängen bleiben. Die Werte, die dieses Verhalten verursachen, hängen von der verfügbaren CPU ab. Sie können jedoch davon ausgehen, dass eine Bereitstellung mit mindestens der in den Anforderungen angegebenen Kapazität die Last von bis zu 64 Benutzern und einer Span-Rate von 16 Benutzern gleichzeitig bewältigen kann.
Nachdem Sie diesen Hintergrund geklärt haben, sind Sie bereit, MARA auf MicroK8s zu starten!
Root-
Zugriff auf ein System (Bare-Metal-Linux-Server, virtualisiert oder Cloud) mit Ubuntu 20.04 (Focal) oder höher, mit mindestens:
Eine virtuelle Python 3-Umgebung auf dem lokalen System mit allen von MARA benötigten Bibliotheken und Binärdateien. Wenn Python 3 noch nicht installiert ist, führen Sie diese Befehle aus:
$ sudo apt update$ sudo apt install -y python3-venv
Mindestens eine freie IPv4-Adresse für den integrierten MetalLB- Load Balancer von MicroK8s, die dem Ausgang des NGINX Ingress Controllers zugewiesen werden kann. Wenn Sie über den lokalen Host auf die Bank of Sirius-Anwendung zugreifen, ist jede verfügbare private ( RFC 1918 -kompatible) Adresse akzeptabel. Wenn Ihr Netzwerk beispielsweise 192.168.100.0/24 ist, können Sie eine Adresse wie 10.10.10.10 verwenden.
Ein Pulumi-Konto und ein Zugriffstoken. Wenn Sie diese noch nicht haben, erstellen Sie sie in Schritt 1 von „MARA bereitstellen“ .
Beachten Sie, dass Sie mit Pulumi die Statusdatei zwar in einem S3-kompatiblen Objektspeicher oder im lokalen Dateisystem speichern können, MARA dies zum Zeitpunkt des Schreibens jedoch nicht unterstützt. Diese Einschränkung wird in einer zukünftigen Version von MARA oder Pulumi entfernt.
Installieren Sie MicroK8s:
$ sudo snap install microk8s --classicmicrok8s (1.23/stable) v1.23.3 from Canonical✓ installed
Legen Sie die erforderlichen Berechtigungen zum Ausführen von Microk8s
-Befehlen fest. Für <Benutzername>
, ersetzen Sie Ihr Konto, das Wurzel
Berechtigung auf dem System:
$ sudo usermod -a -G microk8s <username>$ sudo chown -f -R <username> ~/.kube
$ newgrp microk8s
Melden Sie sich von Ihrem Root-Konto ab und wieder an, damit die neuen Berechtigungen wirksam werden.
Aktivieren Sie die MicroK8s-Add-ons für DNS , Speicher und MetalLB .
Geben Sie bei der Eingabeaufforderung einen IP-Adressbereich im Format X . X . X . X ‑ X . X . X . Y
an, um Folgendes darzustellen:
192.168.100.100-192.168.100.110
, der unten verwendete Wert)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
Bestätigen Sie, dass MicroK8s ausgeführt wird:
$ 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
...
Laden Sie die MicroK8s-Konfiguration in die Datei, in der die meisten Dienstprogramme sie erwarten ( ~/.kube/config ), und legen Sie die empfohlenen Berechtigungen für das Verzeichnis und die Datei fest:
$ microk8s config > ~/.kube/config$ sudo chmod 0644 ~/.kube/config
Klonen Sie das MARA-Repository und initialisieren Sie das Bank of Sirius-Untermodul:
$ git clone https://github.com/nginxinc/kic-reference-architectures.git$ cd kic-reference-architectures/
$ git submodule update --init --recursive --remote
Arbeiten Sie im Stammverzeichnis des geklonten MARA-Repositorys (Sie haben dort im vorherigen Schritt das Verzeichnis gewechselt) und richten Sie die virtuelle Python-Umgebung für den MicroK8s-Cluster ein:
$ ./bin/setup_venv.sh
Dieser Befehl generiert eine lange Ablaufverfolgung. Wenn Fehler auftreten, prüfen Sie bitte den Abschnitt „Bekannte Probleme/Einschränkungen“ im MARA-GitHub-Repo, um Vorschläge zu erhalten.
Aktivieren Sie die virtuelle Python-Umgebung. Der Befehl legt Ihren PATH
und andere Umgebungsvariablen fest, um die virtuelle Umgebung zu verwenden:
$ source ./pulumi/python/venv/bin/activate
Bestätigen Sie, dass der MicroK8s-Cluster für die MARA-Bereitstellung richtig konfiguriert ist:
$ ./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. |
==============================================================
Das Skript start.sh
, das in diesem Abschnitt zum Bereitstellen von MARA verwendet wird, enthält Optionen, die zusätzliche Aktionen erfordern, damit die Bereitstellung erfolgreich ist. Der Einfachheit halber gehen wir hier von einer Basisbereitstellung aus, die:
HINWEIS!
in Schritt 3 weiter unten.HINWEIS!
in Schritt 3.Stellen Sie MARA im MicroK8s-Cluster bereit:
Führen Sie das Skript start.sh
aus.
Wenn Sie Ihre Workstation noch nicht für die Verwendung von Pulumi konfiguriert haben, werden Sie aufgefordert, sich bei Pulumi anzumelden (ggf. unter Erstellung eines Kontos) und dann zur Eingabe des API-Tokens aufgefordert, das Ihrem Pulumi-Konto zugeordnet ist.
$ ./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.
Wählen Sie den Bereitstellungstyp aus, indem Sie in der Eingabeaufforderung „k“
eingeben, um die Bereitstellung mit Kubeconfig-Dateien zu erstellen. Ignorieren Sie die Warnungen, dass Make
und Docker nicht installiert sind. Die Bereitstellung verwendet stattdessen ein NGINX Ingress Controller-Image aus einem Register.
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.
Geben Sie bei der Eingabeaufforderung den Namen des zu erstellenden Pulumi-Stapels an (hier: mara
). Es muss innerhalb Ihres Pulumi-Kontos eindeutig sein.
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.
Geben Sie bei den Eingabeaufforderungen den vollständigen Pfad zu Ihrer Kubeconfig-Datei und den Namen des Clusters an. Hier sind sie /heim/<Benutzername>/.kube/config
Und 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
Geben Sie bei der nächsten Eingabeaufforderung den vollqualifizierten Domänennamen (FQDN) für den Cluster an. Das Skript verwendet den FQDN für zwei Zwecke: zum Konfigurieren des NGINX Ingress Controllers und zum Erstellen des selbstsignierten Zertifikats (die zweite Verwendung bedeutet, dass der Wert keine IP-Adresse sein kann). Wenn Sie mara.example.com
durch einen anderen FQDN ersetzen, denken Sie daran, diesen auch in den folgenden Schritten zu verwenden.
Create a fqdn for your deploymentvalue: mara.example.com
Geben Sie das Grafana-Administratorkennwort an:
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>
Es wird eine Ablaufverfolgung des Installationsvorgangs angezeigt, in der für jeden Schritt die folgenden Informationen angezeigt werden:
Logstore
signalisiert beispielsweise den Beginn der Elasticsearch-Bereitstellung)Wenn der letzte Schritt (für Bank of Sirius) abgeschlossen ist, meldet der Trace die IP-Adresse, die dem NGINX Ingress Controller von MetalLB zugewiesen wurde (hier192.168.100.100
) und den FQDN, den Sie für die Bereitstellung gewählt haben (hier mara.example.com
), zusammen mit weiteren Informationen zur Bereitstellung.
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
Erstellen Sie in dem Tool, das Sie zum Auflösen von FQDNs verwenden (z. B. der lokalen Datei /etc/hosts oder dem DNS-Server), eine Zuordnung zwischen dem im vorherigen Schritt gemeldeten FQDN und der IP-Adresse.
Überprüfen Sie, ob eine Anforderung an die MARA-Bereitstellung erfolgreich ist. Fügen Sie die Option -k
ein, damit curl
ein selbstsigniertes Zertifikat akzeptiert. Um weitere Informationen zum Zertifikat anzuzeigen, fügen Sie die Option -v
hinzu.
$ 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
Navigieren Sie in einem Browser zu https://mara.example.com, um die Website der Bank of Sirius anzuzeigen. Zum Zeitpunkt des Schreibens dieses Artikels können Sie bei vielen Browsern (einschließlich Firefox und Safari) die angezeigte Warnung bezüglich der Site, die ein selbstsigniertes Zertifikat verwendet, bedenkenlos ignorieren. Wir empfehlen Ihnen, Chrome nicht zu verwenden. Aufgrund der jüngsten Sicherheitsänderungen ist es wahrscheinlich, dass Ihnen der Zugriff auf die Site verweigert wird.
Führen Sie das Skript test-forward.sh
aus, um die Kubernetes-Portweiterleitung einzurichten, damit Sie auf die Tools in der MARA-Verwaltungssuite zugreifen können – Elasticsearch , Grafana , Kibana , Locust und Prometheus . Das Skript ermittelt die entsprechenden Dienstnamen und führt Kubectl
-Befehle aus, um sie an lokale Ports weiterzuleiten.
Notiz: Damit die Portweiterleitung ordnungsgemäß funktioniert, muss Ihr Browser auf demselben System ausgeführt werden wie die Befehlsshell, in der Sie diesen Befehl ausführen. Wenn nicht (weil Sie beispielsweise eine Virtualisierungsumgebung verwenden), scheint der Befehl erfolgreich zu sein, die Portweiterleitung funktioniert jedoch nicht. Weitere Informationen finden Sie unter „Zugriff auf die Verwaltungstools in MARA“ in unserem GitHub-Repository.
$ ./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
Das ist es! Mit diesen Anweisungen ist eine funktionierende MARA-Bereitstellung in Ihrer Umgebung innerhalb von etwa 20 Minuten einsatzbereit. Ab diesem Zeitpunkt können Sie mit der Bank of Sirius-Anwendung wie mit jeder anderen Kubernetes-Anwendung interagieren. Ein guter Ausgangspunkt ist die Verwendung der integrierten Beobachtungstools, um zu testen, wie sich die Umgebung verhält, wenn Sie mit Locust unterschiedliche Lastmengen erzeugen.
Unser Ziel ist es, MARA für möglichst viele Kubernetes-Benutzer so nützlich wie möglich zu machen. Ihnen gefällt die Auswahl einiger Komponenten nicht? Wir empfehlen Ihnen, Ihre Komponenten zu ersetzen und eine Pull-Anfrage zu öffnen, wenn Sie sie freigeben möchten. Teilen Sie uns außerdem Ihre Gedanken mit und stellen Sie Fragen – auch zu unseren fragwürdigen Annahmen – auf den Seiten „Probleme“ und „Diskussionen“ in unserem Repo.
Dieser Beitrag ist Teil einer Serie. Wenn wir MARA im Laufe der Zeit um neue Funktionen erweitern, veröffentlichen wir die Einzelheiten im Blog:
„Dieser Blogbeitrag kann auf Produkte verweisen, die nicht mehr verfügbar und/oder nicht mehr unterstützt werden. Die aktuellsten Informationen zu verfügbaren F5 NGINX-Produkten und -Lösungen finden Sie in unserer NGINX-Produktfamilie . NGINX ist jetzt Teil von F5. Alle vorherigen NGINX.com-Links werden auf ähnliche NGINX-Inhalte auf F5.com umgeleitet."