Was ist Kubernetes? Ein Leitfaden für Containerisierung und Bereitstellung
Veröffentlicht: 2022-03-11Vor kurzem haben wir die monolithische Webanwendung verwendet: riesige Codebasen, die mit neuen Funktionen und Merkmalen wuchsen, bis sie sich in riesige, langsame und schwer zu verwaltende Giganten verwandelten. Nun kommen immer mehr Entwickler, Architekten und DevOps-Experten zu der Meinung, dass es besser ist, Microservices zu nutzen als einen riesigen Monolithen. Normalerweise bedeutet die Verwendung einer Microservices-basierten Architektur, dass Sie Ihren Monolithen in mindestens zwei Anwendungen aufteilen: die Front-End-App und eine Back-End-App (die API). Nach der Entscheidung für den Einsatz von Microservices stellt sich die Frage: In welcher Umgebung ist es besser, Microservices zu betreiben? Was sollte ich wählen, um meinen Dienst stabil sowie einfach zu verwalten und bereitzustellen? Die kurze Antwort lautet: Verwenden Sie Docker!
In diesem Artikel stelle ich Ihnen Container vor, erkläre Kubernetes und zeige Ihnen, wie Sie eine App mithilfe von CircleCI containerisieren und in einem Kubernetes-Cluster bereitstellen.
Docker? Was ist Docker?
Docker ist ein Tool, das entwickelt wurde, um DevOps (und Ihr Leben) einfacher zu machen. Mit Docker kann ein Entwickler Anwendungen in Containern erstellen, bereitstellen und ausführen. Container ermöglichen es einem Entwickler, eine Anwendung mit allen benötigten Teilen, wie z. B. Bibliotheken und anderen Abhängigkeiten, zu packen und alles als ein Paket zu versenden.
Mithilfe von Containern können Entwickler ein Image problemlos (erneut) auf jedem Betriebssystem bereitstellen. Installieren Sie einfach Docker, führen Sie einen Befehl aus, und Ihre Anwendung ist betriebsbereit. Oh, und machen Sie sich keine Sorgen über Inkonsistenzen mit der neuen Version der Bibliotheken im Host-Betriebssystem. Außerdem können Sie mehr Container auf demselben Host starten – wird es dieselbe oder eine andere App sein? Es spielt keine Rolle.
Docker scheint ein tolles Tool zu sein. Aber wie und wo soll ich Container starten?
Es gibt viele Möglichkeiten, wie und wo Container ausgeführt werden: AWS Elastic Container Service (AWS Fargate oder eine reservierte Instanz mit horizontaler und vertikaler automatischer Skalierung); eine Cloud-Instanz mit vordefiniertem Docker-Image in Azure oder Google Cloud (mit Vorlagen, Instanzgruppen und automatischer Skalierung); auf Ihrem eigenen Server mit Docker; oder natürlich Kubernetes! Kubernetes wurde 2014 von den Google-Ingenieuren speziell für Virtualisierung und Container entwickelt.
Kubernetes? Was ist das?
Kubernetes ist ein Open-Source-System, mit dem Sie Container ausführen, verwalten, Bereitstellungen automatisieren, Bereitstellungen skalieren, Eingänge erstellen und konfigurieren, zustandslose oder zustandsbehaftete Anwendungen bereitstellen und vieles mehr. Grundsätzlich können Sie eine oder mehrere Instanzen starten und Kubernetes installieren, um sie als Kubernetes-Cluster zu betreiben. Holen Sie sich dann den API-Endpunkt des Kubernetes-Clusters, konfigurieren kubectl
(ein Tool zum Verwalten von Kubernetes-Clustern) und Kubernetes ist einsatzbereit.
Warum sollte ich es also verwenden?
Mit Kubernetes können Sie Rechenressourcen maximal nutzen. Mit Kubernetes sind Sie der Kapitän Ihres Schiffes (Infrastruktur) und Kubernetes füllt Ihre Segel. Mit Kubernetes wird Ihr Service HA sein. Und das Wichtigste: Mit Kubernetes sparen Sie viel Geld.
Sieht vielversprechend aus! Vor allem, wenn es Geld spart! Lass uns mehr darüber reden!
Kubernetes gewinnt Tag für Tag an Popularität. Lassen Sie uns tiefer gehen und untersuchen, was sich unter der Haube verbirgt.
Unter der Haube: Was ist Kubernetes?
Kubernetes ist der Name für das gesamte System, aber wie bei Ihrem Auto gibt es viele kleine Teile, die in perfekter Harmonie zusammenarbeiten, damit Kubernetes funktioniert. Lassen Sie uns lernen, was sie sind.
Master Node – Ein Control Panel für den gesamten Kubernetes-Cluster. Die Komponenten des Masters können auf jedem Knoten im Cluster ausgeführt werden. Die Schlüsselkomponenten sind:
- API-Server: Der Einstiegspunkt für alle REST-Befehle, die einzige Komponente des Master-Knotens, auf die Benutzer zugreifen können.
- Datenspeicher: Starker, konsistenter und hochverfügbarer Schlüsselwertspeicher, der vom Kubernetes-Cluster verwendet wird.
- Scheduler: Sucht nach neu erstellten Pods und weist sie Knoten zu. Die Bereitstellung von Pods und Diensten auf den Knoten erfolgt aufgrund des Schedulers.
- Controller-Manager: Führt alle Controller aus, die Routineaufgaben im Cluster ausführen.
- Worker-Knoten: Primärer Knotenagent, auch Minion-Knoten genannt. Die Pods werden hier betrieben. Worker-Knoten enthalten alle notwendigen Dienste, um das Netzwerk zwischen den Containern zu verwalten, mit dem Master-Knoten zu kommunizieren und den geplanten Containern Ressourcen zuzuweisen.
- Docker: Wird auf jedem Worker-Knoten ausgeführt und lädt Images herunter und startet Container.
- Kubelet: Überwacht den Zustand eines Pods und stellt sicher, dass die Container betriebsbereit sind. Es kommuniziert auch mit dem Datenspeicher, erhält Informationen über Dienste und schreibt Details zu neu erstellten Diensten.
- Kube-Proxy: Ein Netzwerk-Proxy und Load Balancer für einen Dienst auf einem einzelnen Worker-Knoten. Sie ist für die Verkehrslenkung zuständig.
- Kubectl: Ein CLI-Tool, mit dem Benutzer mit dem Kubernetes-API-Server kommunizieren können.
Was sind Pods und Dienste?
Pods sind die kleinste Einheit des Kubernetes-Clusters, sie sind wie ein Ziegelstein in der Wand eines riesigen Gebäudes. Ein Pod ist eine Reihe von Containern, die zusammen ausgeführt werden müssen und Ressourcen (Linux-Namespaces, cgroups, IP-Adressen) gemeinsam nutzen können. Schoten sollen nicht lange leben.
Dienste sind eine Abstraktion auf einer Reihe von Pods, die normalerweise einen Proxy darüber erfordern, damit andere Dienste über eine virtuelle IP-Adresse mit ihm kommunizieren können.
Einfaches Bereitstellungsbeispiel
Ich verwende eine einfache Ruby on Rails-Anwendung und GKE als Plattform zum Ausführen von Kubernetes. Tatsächlich können Sie Kubernetes in AWS oder Azure verwenden oder sogar einen Cluster in Ihrer eigenen Hardware erstellen oder Kubernetes lokal mit minikube
– alles Optionen, die Sie auf dieser Seite finden.
Die Quelldateien für diese App finden Sie in diesem GitHub-Repository.
Um eine neue Rails-App zu erstellen, führen Sie Folgendes aus:
rails new blog
So konfigurieren Sie die MySQL-Verbindung für die Produktion in der config/database.yml file
:
production: adapter: mysql2 encoding: utf8 pool: 5 port: 3306 database: <%= ENV['DATABASE_NAME'] %> host: 127.0.0.1 username: <%= ENV['DATABASE_USERNAME'] %> password: <%= ENV['DATABASE_PASSWORD'] %>
Um ein Artikelmodell, einen Controller, Ansichten und eine Migration zu erstellen, führen Sie Folgendes aus:
rails g scaffold Article title:string description:text
So fügen Sie Edelsteine zur Gemfile hinzu:
gem 'mysql2', '< 0.6.0', '>= 0.4.4' gem 'health_check'
Um das Docker-Image zu erstellen, schnappen Sie sich meine Docker-Datei und führen Sie Folgendes aus:
docker build -t REPO_NAME/IMAGE_NAME:TAG . && docker push REPO_NAME/IMAGE_NAME:TAG
Es ist an der Zeit, einen Kubernetes-Cluster zu erstellen. Öffnen Sie die GKE-Seite und erstellen Sie einen Kubernetes-Cluster. Wenn der Cluster erstellt ist, klicken Sie auf die Schaltfläche „Verbinden“ und kopieren Sie den Befehl – stellen Sie sicher, dass Sie das gCloud-CLI-Tool (Anleitung) und kubectl installiert und konfiguriert haben. Führen Sie den kopierten Befehl auf Ihrem PC aus und prüfen Sie die Verbindung zum Kubernetes-Cluster; kubectl cluster-info
.
Die App kann im k8s-Cluster bereitgestellt werden. Lassen Sie uns eine MySQL-Datenbank erstellen. Öffnen Sie die SQL-Seite in der gCloud-Konsole und erstellen Sie eine MySQL-DB-Instance für die Anwendung. Wenn die Instanz bereit ist, erstellen Sie den Benutzer und die DB und kopieren Sie den Verbindungsnamen der Instanz .

Außerdem müssen wir auf der Seite „ API & Dienste “ einen Dienstkontoschlüssel erstellen, um von einem Sidecar-Container aus auf eine MySQL-DB zugreifen zu können. Weitere Informationen zu diesem Prozess finden Sie hier. Benennen Sie die heruntergeladene Datei in service-account.json
. Wir werden später auf diese Datei zurückkommen.
Wir sind bereit, unsere Anwendung in Kubernetes bereitzustellen, aber zuerst sollten wir Geheimnisse für unsere Anwendung erstellen – ein geheimes Objekt in Kubernetes, das zum Speichern vertraulicher Daten erstellt wird. Laden Sie die zuvor heruntergeladene Datei service-account.json
:
kubectl create secret generic mysql-instance-credentials \ --from-file=credentials.json=service-account.json
Erstellen Sie Geheimnisse für die Anwendung:
kubectl create secret generic simple-app-secrets \ --from-literal=username=$MYSQL_PASSWORD \ --from-literal=password=$MYSQL_PASSWORD \ --from-literal=database-name=$MYSQL_DB_NAME \ --from-literal=secretkey=$SECRET_RAILS_KEY
Vergessen Sie nicht, Werte zu ersetzen oder Umgebungsvariablen durch Ihre Werte zu setzen.
Bevor Sie eine Bereitstellung erstellen, werfen wir einen Blick auf die Bereitstellungsdatei. Ich habe drei Dateien zu einer verkettet; Der erste Teil ist ein Dienst, der Port 80 verfügbar macht und alle Verbindungen, die an Port 80 kommen, an 3000 weiterleitet. Der Dienst hat einen Selektor, mit dem der Dienst weiß, an welche Pods er Verbindungen weiterleiten soll.
Der nächste Teil der Datei ist die Bereitstellung, die die Bereitstellungsstrategie beschreibt – Container, die innerhalb des Pods gestartet werden, Umgebungsvariablen, Ressourcen, Probes, Mounts für jeden Container und andere Informationen.
Der letzte Teil ist der Horizontal Pod Autoscaler. HPA hat eine ziemlich einfache Konfiguration. Denken Sie daran, dass HPA nicht funktioniert, wenn Sie im Bereitstellungsabschnitt keine Ressourcen für den Container festlegen.
Sie können Vertical Autoscaler für Ihren Kubernetes-Cluster auf der GKE-Bearbeitungsseite konfigurieren. Es hat auch eine ziemlich einfache Konfiguration.
Es ist an der Zeit, es an den GKE-Cluster zu senden! Zunächst sollten wir Migrationen per Job ausführen. Ausführen:
kubectl apply -f rake-tasks-job.yaml
– Dieser Job wird für den CI/CD-Prozess nützlich sein.
kubectl apply -f deployment.yaml
– zum Erstellen von Service, Bereitstellung und HPA.
Überprüfen Sie dann Ihren Pod, indem Sie den folgenden Befehl ausführen: kubectl get pods -w
NAME READY STATUS RESTARTS AGE sample-799bf9fd9c-86cqf 2/2 Running 0 1m sample-799bf9fd9c-887vv 2/2 Running 0 1m sample-799bf9fd9c-pkscp 2/2 Running 0 1m
Lassen Sie uns nun einen Ingress für die Anwendung erstellen:
- Erstellen Sie eine statische IP:
gcloud compute addresses create sample-ip --global
- Ingress (Datei) erstellen:
kubectl apply -f ingress.yaml
- Überprüfen Sie, ob der Ingress erstellt wurde, und holen Sie sich die IP:
kubectl get ingress -w
- Erstellen Sie die Domain/Subdomain für Ihre Anwendung.
CI/CD
Lassen Sie uns eine CI/CD-Pipeline mit CircleCI erstellen. Eigentlich ist es einfach, eine CI/CD-Pipeline mit CircleCI zu erstellen, aber denken Sie daran, dass ein schneller und schmutziger, vollautomatischer Bereitstellungsprozess ohne solche Tests für kleine Projekte funktionieren wird, aber bitte tun Sie dies nicht für etwas Ernsthaftes, weil , wenn ein neuer Code Probleme in der Produktion hat, werden Sie Geld verlieren. Aus diesem Grund sollten Sie darüber nachdenken, einen robusten Bereitstellungsprozess zu entwerfen, Canary-Aufgaben vor dem vollständigen Rollout zu starten, Fehler in Protokollen zu überprüfen, nachdem Canary gestartet wurde, und so weiter.
Derzeit haben wir ein kleines, einfaches Projekt, also erstellen wir einen vollständig automatisierten, testfreien CI/CD-Bereitstellungsprozess. Zunächst sollten Sie CircleCI in Ihr Repository integrieren – Sie finden alle Anweisungen hier. Dann sollten wir eine Konfigurationsdatei mit Anweisungen für das CircleCI-System erstellen. Config sieht ziemlich einfach aus. Die wichtigsten Punkte sind, dass es im GitHub-Repo zwei Zweige gibt: master
und production
.
- Der Master-Zweig ist für die Entwicklung, für den frischen Code. Wenn jemand neuen Code in den Master-Branch pusht, startet CircleCI einen Workflow für den Master-Branch – Build- und Test-Code.
- Der Produktionszweig dient zum Bereitstellen einer neuen Version in der Produktionsumgebung. Der Workflow für den Production-Branch sieht wie folgt aus: Pushen Sie neuen Code (oder noch besser, öffnen Sie PR vom Master-Branch in die Produktion), um einen neuen Build- und Deployment-Prozess auszulösen; Während des Builds erstellt CircleCI neue Docker-Images, pusht sie zum GCR und erstellt einen neuen Rollout für die Bereitstellung; Wenn der Rollout fehlschlägt, löst CircleCI den Rollback-Prozess aus.
Bevor Sie einen Build ausführen, sollten Sie ein Projekt in CircleCI konfigurieren. Erstellen Sie ein neues Dienstkonto in der API und eine Diensteseite in GCloud mit diesen Rollen: Vollzugriff auf GCR und GKE, öffnen Sie die heruntergeladene JSON-Datei und kopieren Sie den Inhalt, erstellen Sie dann eine neue Umgebungsvariable in den Projekteinstellungen in CircleCI mit dem Namen GCLOUD_SERVICE_KEY
und fügen Sie den Inhalt der Dienstkontodatei als Wert ein. Außerdem müssen Sie die nächsten Umgebungsvariablen erstellen: GOOGLE_PROJECT_ID
(Sie finden sie auf der Startseite der GCloud-Konsole), GOOGLE_COMPUTE_ZONE
(eine Zone für Ihren GKE-Cluster) und GOOGLE_CLUSTER_NAME
(GKE-Clustername).
Der letzte Schritt (Bereitstellung) bei CircleCI sieht folgendermaßen aus:
kubectl patch deployment sample -p '{"spec":{"template":{"spec":{"containers":[{"name":"sample","image":"gcr.io/test-d6bf8/simple:'"$CIRCLE_SHA1"'"}]}}}}' if ! kubectl rollout status deploy/sample; then echo "DEPLOY FAILED, ROLLING BACK TO PREVIOUS" kubectl rollout undo deploy/sample # Deploy failed -> notify slack else echo "Deploy succeeded, current version: ${CIRCLE_SHA1}" # Deploy succeeded -> notify slack fi deployment.extensions/sample patched Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 2 of 3 updated replicas are available... Waiting for deployment "sample" rollout to finish: 2 of 3 updated replicas are available... deployment "sample" successfully rolled out Deploy succeeded, current version: 512eabb11c463c5431a1af4ed0b9ebd23597edd9
Fazit
Es sieht so aus, als wäre der Prozess zum Erstellen eines neuen Kubernetes-Clusters nicht so schwer! Und der CI/CD-Prozess ist wirklich genial!
Jawohl! Kubernetes ist großartig! Mit Kubernetes wird Ihr System stabiler, einfacher zu verwalten und macht Sie zum Kapitän Ihres Systems. Ganz zu schweigen davon, dass Kubernetes das System ein wenig gamifiziert und +100 Punkte für Ihr Marketing gibt!
Jetzt, da Sie die Grundlagen beherrschen, können Sie weiter gehen und dies in eine fortgeschrittenere Konfiguration umwandeln. Ich plane, mehr in einem zukünftigen Artikel zu behandeln, aber in der Zwischenzeit ist hier eine Herausforderung: Erstellen Sie einen robusten Kubernetes-Cluster für Ihre Anwendung mit einer zustandsbehafteten DB, die sich innerhalb des Clusters befindet (einschließlich Sidecar-Pod zum Erstellen von Sicherungen), installieren Sie Jenkins darin denselben Kubernetes-Cluster für die CI/CD-Pipeline verwenden und Jenkins Pods als Slaves für die Builds verwenden lassen. Verwenden Sie certmanager zum Hinzufügen/Erhalten eines SSL-Zertifikats für Ihren Ingress. Erstellen Sie mit Stackdriver ein Überwachungs- und Warnsystem für Ihre Anwendung.
Kubernetes ist großartig, weil es einfach skalierbar ist, es keine Anbieterbindung gibt und Sie Geld sparen, da Sie für die Instanzen bezahlen. Allerdings ist nicht jeder ein Kubernetes-Experte oder hat die Zeit, einen neuen Cluster einzurichten – für eine alternative Sichtweise plädiert Toptaler Amin Shah Gilani für die Verwendung von Heroku, GitLab CI und einer großen Menge an Automatisierung, die er bereits herausgefunden hat , um mehr Code zu schreiben und weniger Betriebsaufgaben zu erledigen in How to Build an Effective Initial Deployment Pipeline .
- Rechnen Sie selbst: Automatische Skalierung von Microservices-Anwendungen mit Orchestratoren
- K8s/Kubernetes: AWS vs. GCP vs. Azure
- Ein Kubernetes-Service-Mesh-Vergleich