Skalierbare Webanwendung unter Kubernetes
Für dieses Lernprogramm können Kosten anfallen. Mit dem Kostenschätzer können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung generieren.
In diesem Lernprogramm erfahren Sie, wie Sie eine Webanwendung lokal in einem Container ausführen und diese anschließend in einem Kubernetes-Cluster bereitstellen, der mit Kubernetes Service erstellt wurde. Optional können Sie ein Container-Image erstellen und das Image an eine private Registry senden. Darüber hinaus erfahren Sie, wie Sie eine angepasste Unterdomäne binden, den Status der Umgebung überwachen und die Anwendung skalieren.
Container sind eine Standardmethode zum Paketieren von Apps mit allen zugehörigen Abhängigkeiten, damit die Apps problemlos zwischen Umgebungen verschoben werden können. Im Gegensatz zu virtuellen Maschinen ist bei Containern das Betriebssystem nicht in das Paket einbezogen. Nur App-Code, Laufzeit, Systemtools, Bibliotheken und Einstellungen werden in Container gepackt. Container sind schlanker, leichter portierbar und effizienter als virtuelle Maschinen.
Ziele
- Stellen Sie eine Webanwendung im Kubernetes-Cluster bereit.
- Angepasste Unterdomäne binden
- Protokolle und Status des Clusters überwachen
- Kubernetes-Pods skalieren
- Ein Entwickler lädt eine Beispiel-Webanwendung herunter oder klont sie.
- Erstellen Sie optional die Anwendung, um ein Container-Image zu erstellen.
- Wahlweise wird das Image in einen Namensbereich in der IBM Cloud Container Registry übertragen.
- Die Anwendung wird in einem Kubernetes-Cluster bereitgestellt.
- Benutzer greifen auf die Anwendung zu.
Vorbereitende Schritte
Für dieses Lernprogramm ist Folgendes erforderlich:
- IBM Cloud CLI,
- IBM Cloud Kubernetes Service-Plug-in (
kubernetes-service)
- IBM Cloud Kubernetes Service-Plug-in (
kubectlzur Interaktion mit Kubernetes-ClusternHelm 3für die Bereitstellung von Charts
Anweisungen zum Herunterladen und Installieren dieser Tools für Ihre Betriebsumgebung finden Sie in der Anleitung zur Einführung in die Lernprogramme.
Um die Installation dieser Tools zu vermeiden, können Sie Cloud Shell über die IBM Cloud-Konsole verwenden.
Darüber hinaus:
- Sie benötigen eine Secrets Manager-Instanz. Mit Secrets Manager können Sie geheime Schlüssel, die in IBM Cloud-Services oder Ihren kundenspezifischen Anwendungen verwendet werden, erstellen, nutzen (leasen) und zentral verwalten. Geheime Schlüssel werden in einer dedizierten Secrets Manager-Instanz gespeichert und Sie können integrierte Funktionen verwenden, um den Ablauf zu überwachen, Ihre geheimen Schlüssel zu planen oder manuell turnusmäßig zu wechseln. In diesem Tutorial verwenden Sie Kubernetes, um ein TLS-Zertifikat von Secrets Manager abzurufen und in Kubernetes einzufügen. Sie können eine vorhandene Instanz verwenden, wenn Sie bereits über eine Instanz verfügen, oder eine neue erstellen, indem Sie die beschriebenen Schritte im Abschnitt Secrets Manager-Serviceinstanz erstellen ausführen.
- Optional richten Sie einen Registry-Namensbereich ein. Dies ist nur erforderlich, wenn Sie ein eigenes angepasstes Container-Image erstellen.
- Machen Sie sich mit den Grundlagen von Kubernetes.
Service-zu-Service-Kommunikation mit Secrets Manager aktivieren
Für die Integration von Secrets Manager in Ihren Cluster mit IBM Cloud Kubernetes Service ist eine Berechtigung für die Kommunikation zwischen Services erforderlich. Befolgen Sie diese Schritte, um die Autorisierung einzurichten. Weitere Informationen finden Sie unter Integrationen für Secrets Manager.
- Klicken Sie in der IBM Cloud-Konsole auf Verwalten > Zugriff (IAM).
- Klicken Sie auf Autorisierungen.
- Klicken Sie auf Erstellen.
- Wählen Sie in der Liste "Source service" Kubernetes Service aus.
- Wählen Sie die Option aus, um den Zugriff auf Alle Ressourcen zu definieren.
- Wählen Sie in der Liste "Target-Dienste" Secrets Manager aus.
- Wählen Sie die Option aus, um den Zugriff auf Alle Ressourcen zu definieren.
- Aktivieren Sie im Abschnitt "Servicezugriff " die Option "Manager ".
- Klicken Sie auf Autorisieren.
Kubernetes-Cluster erstellen
IBM Cloud Kubernetes Service ist ein verwaltetes Angebot zur Erstellung Ihres eigenen Kubernetes von Rechenhosts zur Bereitstellung und Verwaltung von Container-Apps in IBM Cloud. Ein Mindestcluster mit einer (1) Zone, einem (1) Workerknoten und der kleinsten verfügbaren Größe (Version) ist für dieses Lernprogramm ausreichend.
-
Öffnen Sie Kubernetes und klicken Sie auf "Cluster erstellen ".
-
Erstellen Sie einen Cluster auf der Infrastruktur Ihrer Wahl.
-
Die folgenden Schritte sind auszuführen, wenn Sie VPC für Kubernetes in der VPC-Infrastruktur auswählen. Sie müssen eine VPC und ein Teilnetz erstellen, bevor Sie den Kubernetes-Cluster erstellen. Weitere Details finden Sie in der Dokumentation VPC-Cluster erstellen.
- Klicken Sie auf VPC erstellen.
- Wählen Sie im Abschnitt Standort eine Geografie und eine Region aus, z. B.
EuropeundLondon. - Geben Sie einen Namen für Ihre VPC ein, wählen Sie eine Ressourcengruppe aus und fügen Sie optional Tags hinzu, um Ihre Ressourcen zu organisieren.
- Wählen Sie SSH zulassen und Ping zulassen in der Standardsicherheitsgruppe ab.
- Deaktivieren Sie "Subnetz in jeder Zone erstellen ".
- Klicken Sie auf Erstellen.
- Wählen Sie unter Workerzonen und Teilnetze die beiden Zonen ab, für die das Teilnetz nicht erstellt wurde.
- Setzen Sie Workerknoten pro Zone auf
1und klicken Sie auf Typ ändern, um die Workerknotengröße Ihrer Wahl zu untersuchen und zu ändern. - Aktivieren Sie unter Ingress das Ingress-Management geheimer Schlüssel und wählen Sie Ihre vorhandene Instanz von Secrets Manager aus.
- Geben Sie einen Clusternamen ein und wählen Sie dieselbe Ressourcengruppe aus, die Sie für die VPC verwendet haben.
- Protokollierung oder Überwachung sind in diesem Lernprogramm nicht erforderlich. Inaktivieren Sie diese Optionen und klicken Sie auf Create.
- Wenn Sie warten, bis der Cluster aktiv wird, hängen Sie ein öffentliches Gateway an die VPC an. Navigieren Sie zu Virtual Private Clouds.
- Klicken Sie auf den Namen der VPC, die vom Cluster verwendet wird, und blättern Sie abwärts zum Abschnitt mit den Teilnetzen.
- Klicken Sie auf den Namen des zuvor erstellten Teilnetzes und im Abschnitt Public Gateway auf Abgehängt, um den Status in Zugeordnet zu ändern.
-
Die folgenden Schritte werden ausgeführt, wenn Sie Classic für Kubernetes in der Classic-Infrastruktur auswählen. Weitere Details finden Sie in der Dokumentation zum Erstellen eines klassischen Standardclusters.
- Wählen Sie im Abschnitt Standort eine Geografie, Verfügbarkeit mit mehreren Zonen und Metro aus, z. B.
EuropeundLondon. - Wählen Sie unter Workerzonen und VLANs alle Zonen mit Ausnahme einer ab.
- Setzen Sie Workerknoten pro Zone auf
1und klicken Sie auf Typ ändern, um die Workerknotengröße Ihrer Wahl zu untersuchen und zu ändern. - Wählen Sie unter Master-Serviceendpunkt die Option Private und öffentliche Endpunkte aus.
- Aktivieren Sie unter Ingress das Ingress-Management geheimer Schlüssel und wählen Sie Ihre vorhandene Instanz von Secrets Manager aus.
- Geben Sie einen Clusternamen ein und wählen Sie die Ressourcengruppe aus, unter der diese Ressourcen erstellt werden.
- Protokollierung oder Überwachung sind in diesem Lernprogramm nicht erforderlich. Inaktivieren Sie diese Optionen und klicken Sie auf Create.
- Wählen Sie im Abschnitt Standort eine Geografie, Verfügbarkeit mit mehreren Zonen und Metro aus, z. B.
-
Beispielanwendung klonen
In diesem Abschnitt werden Sie ein GitHub-Repo mit einer einfachen Helm-basierten NodeJS-Beispielanwendung mit einer Landing Page und zwei Endpunkten klonen, um loszulegen. Sie können die Beispielanwendung jederzeit entsprechend Ihren Anforderungen erweitern.
- Führen Sie auf einem Terminal den folgenden Befehl aus, um das GitHub-Repositoryzu klonen:
git clone https://github.com/IBM-Cloud/kubernetes-node-app - Wechseln Sie in das Anwendungsverzeichnis:
cd kubernetes-node-app
Dieser Beispielanwendungscode enthält alle erforderlichen Konfigurationsdateien für die lokale Entwicklung und Bereitstellung in Kubernetes.
Anwendung mithilfe eines Helm-Charts im Cluster bereitstellen
Anwendung mit Helm 3 bereitstellen
Das Container-Image für die Anwendung wurde bereits erstellt und in ein öffentliches Register in IBM Cloud Container Registry verschoben. In diesem Abschnitt werden Sie die Beispielanwendung mit Helm bereitstellen. Helm unterstützt Sie bei der Verwaltung von Kubernetes-Anwendungen durch Helm-Charts, die das Definieren, Installieren und Aktualisieren hoch komplexer Kubernetes-Anwendungen erleichtern.
Hinweis: Wenn Sie die Anwendung erstellen und in Ihre eigene Container-Registry verschieben möchten, können Sie dazu Docker verwenden. Das Dockerfile wird im Repository bereitgestellt und die Images können IBM Cloud Container Registry oder
eine andere Container-Registry übertragen werden.
-
Definieren Sie eine Umgebungsvariable mit dem Namen
MYAPPund legen Sie den Namen der Anwendung fest, indem Sie den Platzhalter durch Ihre Initialen ersetzen:export MYAPP=<your-initials>kubenodeapp -
Ermitteln Sie Ihren Cluster:
ibmcloud ks cluster ls -
Initialisieren Sie die Variable mit dem Clusternamen:
export MYCLUSTER=<CLUSTER_NAME> -
Initialisiere die
kubectl-CLI-Umgebung:ibmcloud ks cluster config --cluster $MYCLUSTERStellen Sie sicher, dass die Befehlszeilenschnittstelle für die Region und Ressourcengruppe konfiguriert ist, in der Ihr Cluster mit
ibmcloud target -r <region> -g <resource_group>erstellt wurde. Weitere Informationen für den Zugriff auf Ihren Cluster sowie zur Konfiguration der CLI für die Ausführung der Befehle des Typs 'kubectl' finden Sie im Abschnitt zur CLI-Konfiguration. -
Sie können entweder den Kubernetes-Namensbereich
defaultverwenden oder einen neuen Namensbereich für diese Anwendung erstellen.- Wenn Sie den Namensraum
defaultKubernetes verwenden möchten, führen Sie den folgenden Befehl aus, um eine Umgebungsvariable festzulegen:export KUBERNETES_NAMESPACE=default - Wenn Sie einen neuen Kubernetes-Namensbereich erstellen wollen, führen Sie die Schritte aus, die in der Dokumentation für Kubernetes Service unter Vorhandenen geheimen Schlüssel für Image-Pull-Operationen kopieren und Geheimen Schlüssel für Image-Pull-Operationen im Kubernetes Service-Konto für den ausgewählten Namensbereich speichern beschrieben sind. Führen Sie
nach Abschluss den folgenden Befehl aus:
export KUBERNETES_NAMESPACE=<KUBERNETES_NAMESPACE_NAME>
- Wenn Sie den Namensraum
-
Wechseln Sie in das Verzeichnis "chart" unter Ihrem Beispielanwendungsverzeichnis:
cd chart/kubernetesnodeapp -
Installieren Sie das Helm Chart:
helm install $MYAPP --namespace $KUBERNETES_NAMESPACE . --set image.repository=icr.io/solution-tutorials/tutorial-scalable-webapp-kubernetes -
Wechseln Sie zurück zum Verzeichnis der Beispielanwendung:
cd ../..
Anwendung anzeigen
- Listen Sie die Services von Kubernetes im Namensbereich auf:
kubectl get services -n $KUBERNETES_NAMESPACE - Listen Sie Kubernetes im Namensraum auf:
kubectl get pods -n $KUBERNETES_NAMESPACE
Von IBM bereitgestellte Domäne für Ihren Cluster verwenden
Cluster werden mit einer IBM Domain geliefert. Dadurch können Sie Anwendungen wie gewohnt mit einer URL-Adresse und über standardmäßige HTTP- bzw. HTTPS-Ports verfügbar machen.
Verwenden Sie Ingress, um die eingehende Clusterverbindung für den Service einzurichten.
-
Ermitteln Sie Ihre von IBMbereitgestellte Ingress-Unterdomäne und Ihren geheimen Ingress-Schlüssel:
ibmcloud ks cluster get --cluster $MYCLUSTERbei Suche nach
Ingress subdomain: mycluster.us-south.containers.appdomain.cloud Ingress secret: mycluster -
Definieren Sie die Umgebungsvariable
INGRESS_SUBDOMAINfür den Wert der Ingress-Unterdomäne:export INGRESS_SUBDOMAIN=<INGRESS_SUBDOMAIN> -
Definieren Sie die Umgebungsvariable
INGRESS_SECRET, um den Wert des geheimen Ingress-Schlüssels zu speichern:export INGRESS_SECRET=<INGRESS_SECRET> -
Führen Sie im Beispielanwendungsverzeichnis den folgenden Bash-Befehl aus, um eine Ingress-Datei
ingress-ibmsubdomain.yamlzu erstellen, die auf die IBM Domain mit Unterstützung für HTTP und HTTPS verweist:./ingress.sh ibmsubdomain_httpsDie Datei wird aus einer Vorlagendatei
ingress-ibmsubdomain-template.yamlim Ordner yaml-templates generiert, indem alle in den Platzhaltern ($) enthaltenen Werte durch die entsprechenden Werte aus den Umgebungsvariablen ersetzt werden. -
Stellen Sie die Ingress-Datei bereit:
kubectl apply -f ingress-ibmsubdomain.yaml -
Öffnen Sie Ihre Anwendung in einem Browser unter
https://<myapp>.<ingress-subdomain>/oder führen Sie den folgenden Befehl aus, um HTTP anzuzeigen:curl -I https://$MYAPP.$INGRESS_SUBDOMAIN
Eigene angepasste Unterdomäne verwenden
Für diesen Abschnitt ist es erforderlich, dass Sie Eigner einer angepassten Domäne sind. Sie müssen einen CNAME-Eintrag erstellen, der auf die IBM Eingangs-Subdomain für den Cluster verweist. Wenn Ihre Domäne example.com ist, verweist der CNAME <myapp>.<example.com> auf <myapp>.<ingress-subdomain>.
Mit HTTP
- Erstellen Sie eine Umgebungsvariable, die auf Ihre benutzerdefinierte Domain verweist:
export CUSTOM_DOMAIN=<example.com> - Erstellen Sie aus der Vorlagendatei
ingress-customdomain-http.yamleine Ingress-Datei namensingress-customdomain-http-template.yaml, die auf Ihre Domäne verweist:./ingress.sh customdomain_http - Stellen Sie die Ingress-Datei bereit:
kubectl apply -f ingress-customdomain-http.yaml - Greifen Sie unter
http://<myapp>.<example.com>/auf die Anwendung zu.
Mit HTTPS
Wenn Sie an dieser Stelle versuchen, Ihre Anwendung über HTTPS https://<myapp>.example.com/ aufzurufen, weist in Ihrem Web-Browser wahrscheinlich eine Sicherheitswarnung darauf hin, dass dies keine private Verbindung ist.
Importieren Sie jetzt Ihr Zertifikat in die Secrets Manager-Instanz, die Sie zuvor in Ihrem Cluster konfiguriert haben.
-
Greifen Sie über die Ressourcenliste unter Sicherheit auf die Serviceinstanz Secrets Manager zu.
-
Klicken Sie in der linken Navigation auf Geheime Schlüssel.
-
Klicken Sie auf Hinzufügen.
-
Sie können Öffentliches Zertifikat, Importiertes Zertifikat oder Privates Zertifikat auswählen. Ausführliche Schritte finden Sie in den entsprechenden Dokumentationsthemen: Öffentliche SSL/TLS-Zertifikate bestellen, SSL/TLS-Zertifikate importieren oder Private SSL/TLS-Zertifikate erstellen. Wenn Sie ein Zertifikat importieren möchten, stellen Sie sicher, dass Sie das Zertifikat, den privaten Schlüssel und die Zwischenzertifikatsdateien hochladen.
-
Suchen Sie den Eintrag für das importierte oder bestellte Zertifikat und klicken Sie darauf.
- Überprüfen Sie, ob der Domainname mit Ihrer $CUSTOM_DOMAIN übereinstimmt. Wenn Sie ein Platzhalterzertifikat hochgeladen haben, wird ein Stern in den Domänennamen eingeschlossen.
- Klicken Sie auf das Kopiersymbol neben der CRN des Zertifikats.
- Erstellen Sie eine Umgebungsvariable, die auf den soeben kopierten Wert verweist:
export CERTIFICATE_CRN=<certificate CRN> -
Erstellen Sie einen geheimen Ingress-Schlüssel in Ihrem Cluster für das SSL/TLS-Zertifikat:
ibmcloud ks ingress secret create --name nodeapp-tls-cert --cluster $MYCLUSTER --cert-crn $CERTIFICATE_CRN --namespace $KUBERNETES_NAMESPACE -
Erstellen Sie eine Umgebungsvariable, die auf Ihre benutzerdefinierte Domain verweist:
export CUSTOM_DOMAIN=<example.com> -
Erstellen Sie eine Ingress-Datei
ingress-customdomain-https.yaml, die auf Ihre Domain verweist, aus der Vorlageingress-customdomain-https-template-sm.yaml:./ingress.sh customdomain_https_sm -
Stellen Sie die Ingress-Datei bereit:
kubectl apply -f ingress-customdomain-https.yaml -
Greifen Sie unter
https://$MYAPP.$CUSTOM_DOMAIN/auf die Anwendung zu.
curl -I https://$MYAPP.$CUSTOM_DOMAIN
Status der Anwendung überwachen
- Um den Status Ihrer Anwendung zu überprüfen, navigieren Sie zu den Clustern, um eine Liste der Cluster anzuzeigen, und klicken Sie auf Ihren Cluster.
- Klicken Sie auf Kubernetes-Dashboard, um das Dashboard auf einer neuen Registerkarte aufzurufen.
- Klicken Sie links auf Pods und anschließend auf einen Podnamen, der mit $MYAPP übereinstimmt.
- Untersuchen Sie die CPU-und Hauptspeicherbelegung.
- Notieren Sie den Knoten-IP-Namen.
- Klicken Sie im Aktionsmenü oben rechts auf Protokolle anzeigen, um die Standardausgabe und den Standardfehler der Anwendung anzuzeigen.
- Wählen Sie im linken Bereich "Knoten" aus, klicken Sie auf den Namen eines zuvor notierten Knotens und sehen Sie sich die Zuweisungsressourcen an, um den Zustand Ihrer Knoten zu überprüfen.
- Zum Ausführen im Container wählen Sie Ausführen in im Aktionsmenü aus
Kubernetes-Pods skalieren
Wenn die Workload für Ihre Anwendung zunimmt, können Sie die Anzahl der Podreplikate in Ihrer Bereitstellung manuell erhöhen. Replikate werden von einem ReplicaSetverwaltet. Führen Sie den folgenden Befehl aus, um die Anwendung auf zwei Replikate zu skalieren:
kubectl scale deployment kubernetesnodeapp-deployment --replicas=2
Nach kurzer Zeit werden Sie im Kubernetes (oder bei kubectl get pods ) zwei Pods für Ihre Anwendung sehen. Der Ingress-Controller im Cluster übernimmt die Lastverteilung zwischen den beiden Replikaten.
Mit Kubernetes können Sie die horizontale Pod-Autoskalierung aktivieren, um die Anzahl der Instanzen Ihrer Apps basierend auf der CPU automatisch zu erhöhen oder zu verringern.
Führen Sie zum Erstellen eines Autoscalers und zum Definieren Ihrer Richtlinie den nachfolgenden Befehl aus.
kubectl autoscale deployment kubernetesnodeapp-deployment --cpu-percent=5 --min=1 --max=5
Sobald der Autoskalierer erfolgreich erstellt wurde, sollte Folgendes angezeigt werden
horizontalpodautoscaler.autoscaling/<deployment-name> autoscaled.
Ressourcen entfernen
-
Löschen Sie den horizontalen Pod-Autoscaler:
kubectl delete horizontalpodautoscaler.autoscaling/kubernetesnodeapp-deployment -
Löschen Sie die angewendeten Ressourcen:
kubectl delete -f ingress-customdomain-https.yaml kubectl delete -f ingress-customdomain-http.yaml kubectl delete -f ingress-ibmsubdomain.yaml -
Löschen Sie die Kubernetes-Artefakte, die für diese Anwendung erstellt wurden:
helm uninstall $MYAPP --namespace $KUBERNETES_NAMESPACE -
Löschen Sie den geheimen Kubernetes-Schlüssel:
kubectl -n $KUBERNETES_NAMESPACE delete secret kubernetesnodeapp-api-key -
Löschen Sie den Operator für externe geheime Schlüssel:
helm uninstall external-secrets -
Service-ID löschen:
ibmcloud iam service-id-delete $SERVICE_ID -
Löschen Sie den Cluster.