Engineering

Erste Schritte mit Elastic Cloud auf Kubernetes: Deployment

Obwohl die Lösung noch in der Alpha-Phase ist, hat die Ankündigung von Elastic Cloud on Kubernetes (ECK) in den Elasticsearch- und Kubernetes-Communities beträchtliches Interesse geweckt. ECK wird vom gleichen Unternehmen entwickelt wie der Elastic Stack und ist der beste Weg, um Elastic Stack auf Kubernetes bereitzustellen. In dieser zweiteiligen Blogreihe finden Sie eine schrittweise Beschreibung der folgenden Prozesse:

  1. Bereitstellen von ECK in einem Kubernetes-Cluster (Minikube oder GKE)
  2. Bereitstellen des Elastic Stack in ECK
  3. Skalieren und Aktualisieren von Elasticsearch und Kibana in ECK
  4. Bereitstellen einer mit Elastic APM instrumentierten Beispielanwendung und Übertragen von APM-Daten an den mit ECK verwalteten Elasticsearch-Cluster
  5. Bereitstellen von Metricbeat in Kubernetes als DaemonSet und Herstellen einer sicheren Verbindung zwischen Metricbeat und dem mit ECK verwalteten Elasticsearch-Cluster

Nach Ende der Lektüre haben Sie das im folgenden Diagramm gezeigte System. In diesem ersten Blogeintrag konzentrieren wir uns darauf, ECK und den Elastic Stack bereitzustellen.

ECK-Bereitstellungsdiagramm

Aktuellere Informationen zu ECK finden Sie auch auf der Schnellstart-Seite oder auf der Produktseite.

Erstellen Ihres k8s-Clusters

Bevor Sie ECK und Ihren Elastic Stack bereitstellen, benötigen Sie einen einsatzbereiten Kubernetes-Cluster. Für diesen Blogeintrag können Sie entweder Minikube oder Google Kubernetes Engine (GKE) verwenden. Wir unterstützen auch andere Kubernetes-Distributionen wie etwa OpenShift, Amazon EKS und Microsoft AKS. Da wir ECK, Elasticsearch, Kibana, APM Server und eine Beispielanwendung bereitstellen werden, empfehle ich Ihnen, den Cluster mit 16 GB RAM und 4 Prozessorkernen bereitzustellen. Sie können Ihren Kubernetes-Cluster auch mit 12 GB RAM betreiben, aber mit 16 GB erhalten Sie definitiv ein flüssiges Erlebnis.

Minikube

Falls Sie Minikube verwenden werden, folgen Sie der Installationsanleitung für die Lösung. Nachdem Sie Minikube installiert haben, können Sie die Software mit den erforderlichen Ressourcen konfigurieren und starten:

minikube config set memory 16384 
minikube config set cpus 4
minikube start

Das Kubernetes-Dashboard ist extrem praktisch, um Ihren Kubernetes-Cluster zu überwachen und zu verwalten. Sie können das Dashboard für Minikube mit dem folgenden Befehl aktivieren:

minikube dashboard

Daraufhin wird automatisch ein Browserfenster mit dem Kubernetes-Dashboard geöffnet. Damit sind Sie auch schon einsatzbereit.

Google Kubernetes Engine (GKE)

Falls Sie GKE verwenden werden, folgen Sie der Google-Dokumentation, um Ihren Cluster zu konfigurieren. Mein GKE-Cluster besteht aus einem Knoten mit 15 GB RAM und 4 vCPUs. Sie können auch einen kleineren Cluster verwenden, brauchen aber mindestens 12 GB RAM. Für die Arbeit mit GKE brauchen Sie außerdem das gcloud-Befehlszeilentool.

Sobald Ihr GKE-Cluster installiert ist und ausgeführt wird, können Sie mit den folgenden Befehlen eine Verbindung herstellen und die entsprechenden Berechtigungen einrichten. Für GKE brauchen Sie Cluster-Admin-Berechtigungen. Ersetzen Sie Projektname, Zonenname, Clustername und Benutzer-ID durch Ihre entsprechenden Werte:

gcloud config set project elastic-sa 
gcloud config set compute/zone us-central1-a
gcloud config set container/cluster aquan
gcloud auth login
gcloud container clusters get-credentials aquan --zone us-central1-a --project elastic-sa
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=adam.quan@elastic.co
kubectl create clusterrolebinding adam.quan-cluster-admin-binding --clusterrole=cluster-admin --user=adam.quan@elastic.co

Zuletzt verwenden wir das Kubernetes-Befehlszeilentool, um mit Minikube bzw. mit GKE zu interagieren. Folgen Sie den Anweisungen, um kubectl zu installieren. Achten Sie darauf, die kubectl-Version 1.11+ zu installieren.

Sie können die für diesen Blogeintrag verwendeten Artefakte aus diesem GitHub-Repository herunterladen.

Bereitstellen des Elasticsearch-Operators

Können Sie sich vorstellen, dass Sie ECK mit nur einem einzigen Befehl bereitstellen können? Führen Sie einfach den folgenden Befehl aus, um die neueste ECK-Version 0.9.0 (zum Erstellungszeitpunkt dieses Texts) bereitzustellen. Kinderleicht.

kubectl apply -f https://download.elastic.co/downloads/eck/0.9.0/all-in-one.yaml

Nach der Bereitstellung können Sie den folgenden Befehl ausführen, um die Logs vom Operator zu überwachen und sicherzustellen, dass alles reibungslos funktioniert. ECK ist innerhalb von wenigen Momenten einsatzbereit.

kubectl -n elastic-system logs -f statefulset.apps/elastic-operator

Bereitstellen des Elastic Stack

ECK ist jetzt einsatzbereit, und wir können den Elastic Stack bereitstellen. Dazu brauchen wir ebenfalls nur einen einzigen Befehl. Öffnen Sie apm_es_kibana.yaml und sehen Sie sich an, wie einfach Sie Kibana und den APM-Server mit „elasticsearchRef“ so konfigurieren können, dass sie miteinander kommunizieren.

Sie können Ihr Deployment auf viele verschiedene Arten anpassen, wie etwa:

  • Pod-Vorlage
  • Knotenkonfiguration
  • Virtueller Arbeitsspeicher
  • Benutzerdefiniertes HTTP-Zertifikat
  • Sicherheitseinstellungen

Stellen Sie den Stack mit dem folgenden Befehl bereit:

kubectl apply -f apm_es_kibana.yaml

Überprüfen Sie den Status von Elasticsearch, Kibana und APM-Server mit kubectl oder dem Kubernetes-Dashboard, um sicherzustellen, dass alle Komponenten grün angezeigt werden und einsatzbereit sind:

kubectl get elasticsearch,kibana,apmserver

Sobald alle drei Komponenten in grün angezeigt werden, wird Ihr Elasticsearch-Cluster ausgeführt und ist bereit für eingehende Daten. ECK nimmt uns viele Aufgaben ab. Bevor wir fortfahren, sehen wir uns an, was ECK bisher für unseren Cluster getan hat:

  • Die Security ist für ECK aktiviert. Alle mit ECK bereitgestellten Elastic Stack-Ressourcen werden standardmäßig geschützt. Der integrierte Authentifizierungsbenutzer „elastic“ wurde eingerichtet, und der Netzwerkdatenverkehr von, zu und in Ihrem Elasticsearch-Cluster wird mit TLS geschützt.
  • Zertifikate: Standardmäßig wird ein selbstsigniertes ZS-Zertifikat für jeden Cluster verwendet. Sie können auch benutzerdefinierte HTTPS-Zertifikate konfigurieren.
  • Standardmäßige Dienstbereitstellung: Ein ClusterIP-Dienst wird für Ihren Cluster und für Kibana erstellt. Sie können diese Komponenten selbstverständlich auch als LoadBalancer-Typen konfigurieren.

Damit sind Elasticsearch, Kibana und APM-Server einsatzbereit, und wir können uns Kibana ansehen.

Zugreifen auf Kibana

Kibana wird standardmäßig als Dienst mit einer IP bereitgestellt, die zwar von innerhalb des Clusters verfügbar ist, aber nicht vom Internet aus. Sie können jedoch den folgenden Portweiterleitungsbefehl ausführen, um Kibana für Ihren Laptop erreichbar zu machen:

kubectl port-forward service/kibana-sample-kb-http 5601

Bevor wir uns bei Kibana anmelden können, brauchen wir die Anmeldeinformationen des elastic-Standardbenutzers. Sie können „kubectl get secrets“ ausführen und sich die Ausgabe ansehen, um den JSON-Pfad des geheimen Schlüssels herauszufinden. Hier ist der korrekte geheime Schlüssel und der Pfad für unser Beispiel:

echo `kubectl get secret elasticsearch-sample-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode`

Das Passwort für den elastic-Benutzer wird angezeigt. Kopieren Sie das Passwort und speichern Sie es in einem Texteditor.

Öffnen Sie einen Browser und verbinden Sie sich mit https://localhost:5601. Da wir ein selbstsigniertes Zertifikat verwenden, müssen Sie die Sicherheitswarnung des Browsers akzeptieren. Melden Sie sich mit dem elastic-Benutzer und dem Passwort, das wir soeben abgerufen haben, bei Kibana an. Daraufhin werden Sie zur Kibana-Startseite weitergeleitet. Unser Cluster ist komplett und einsatzbereit!

Skalieren und Aktualisieren

Falls Sie Ihren Elasticsearch-Cluster in ECK skalieren oder aktualisieren möchten, können Sie dazu einfach die Deployment-Konfiguration bearbeiten und mit kubectl anwenden.

Skalieren

Bearbeiten Sie Ihr Deployment-Manifest „apm_es_kibana.yaml“ und ändern Sie die Arbeitsspeichergröße Ihres Elasticsearch-Containers im folgenden Abschnitt von 2 GB zu 3 GB:

        containers: 
- name: elasticsearch
resources:
limits:
memory: 3Gi

Speichern Sie die Daten und skalieren Sie Ihren Knoten mit diesem Befehl:

kubectl apply -f apm_es_kibana.yaml

Wenn Sie sofort zu Ihrer Kubernetes-Konsole wechseln, können Sie zusehen, wie Ihr neuer Elasticsearch-Pod erstellt wird. ECK skaliert Ihren Elasticsearch-Knoten ohne jegliche Ausfallzeit. Nach wenigen Momenten sehen Sie, dass der neue Pod ausgeführt wird, und der ursprüngliche Pod verschwindet. Die Daten aus dem alten Pod wurden nahtlos übernommen.

Sie können Ihren Cluster natürlich auch auf andere Arten skalieren, zum Beispiel indem Sie zusätzliche Knoten hinzufügen. In jedem Fall reicht dafür ein einfacher „kubectl apply“-Befehl aus.

Elasticsearch-Pod wird erstellt

Aktualisieren

Wir werden unseren Cluster jetzt auf 7.2.0 aktualisieren, indem wir die Version für Elasticsearch-Kibana und APM-Server in der Deployment-Manifestdatei „apm_es_kibana.yaml“ von 7.1.0 zu 7.2.0 ändern. Speichern Sie die Datei und wenden Sie die Aktualisierung mit dem folgenden Befehl an:

kubectl apply -f apm_es_kibana.yaml

In der Kubernetes-Konsole können Sie parallel dazu beobachten, wie Elasticsearch, Kibana und APM-Server von ECK ohne jegliche Ausfallzeit nahtlos aktualisiert werden.

Nach Abschluss der Aktualisierung können Sie sich vergewissern, dass Sie jetzt Version 7.2.0 des Elastic Stack ausführen. Glauben Sie mir inzwischen, dass ECK extrem leistungsfähig ist? Ich hoffe schon.

Zusammenfassung

Ich hoffe, Ihnen hat diese kurze Einführung in Elastic Cloud on Kubernetes gefallen und Sie wissen die Simplizität zu schätzen. In Teil 2 dieses Blogeintrags werden wir eine einfache, mit APM instrumentierte Anwendung bereitstellen und verwenden, um APM-Daten an unseren mit ECK verwalteten Cluster zu senden. Außerdem werden wir Metricbeat in Kubernetes bereitstellen, um Metrikdaten an den Cluster zu senden.