Was wird mit K8S als bewährte Methode für die Verwaltung mehrerer Umgebungen (QS, Staging, Produktion, Entwicklung usw.) angesehen?
Angenommen, ein Team arbeitet an einem Produkt, für das einige APIs zusammen mit einer Front-End-Anwendung bereitgestellt werden müssen. Normalerweise erfordert dies mindestens 2 Umgebungen:
- Staging: Für Iterationen / Tests und Validierungen vor der Freigabe an den Client
- Produktion: Dies ist die Umgebung, auf die der Kunde Zugriff hat. Sollte stabile und gut getestete Funktionen enthalten.
Angenommen, das Team verwendet Kubernetes. Was wäre eine gute Vorgehensweise, um diese Umgebungen zu hosten? Bisher haben wir zwei Optionen in Betracht gezogen:
- Verwenden Sie für jede Umgebung einen K8s-Cluster
- Verwenden Sie nur einen K8s-Cluster und bewahren Sie diese in verschiedenen Namespaces auf.
(1) Scheint die sicherste Option zu sein, da sie das Risiko potenzieller menschlicher Fehler und Maschinenausfälle minimiert, die die Produktionsumgebung gefährden könnten. Dies ist jedoch mit den Kosten für mehr Master-Maschinen und auch mit den Kosten für mehr Infrastrukturmanagement verbunden.
(2) Sieht so aus, als würde dies das Infrastruktur- und Bereitstellungsmanagement vereinfachen, da es einen einzigen Cluster gibt, wirft jedoch einige Fragen auf:
- Wie stellt man sicher, dass ein menschlicher Fehler die Produktionsumgebung beeinflusst?
- Wie kann sichergestellt werden, dass eine hohe Last in der Staging-Umgebung keinen Leistungsverlust in der Produktionsumgebung verursacht?
Es könnte noch andere Bedenken geben, daher wende ich mich an die K8-Community auf StackOverflow, um besser zu verstehen, wie Menschen mit solchen Herausforderungen umgehen.
quelle
Antworten:
Überlegungen zu mehreren Clustern
Schauen Sie sich diesen Blog-Beitrag von Vadim Eisenberg ( IBM / Istio ) an: Checkliste: Vor- und Nachteile der Verwendung mehrerer Kubernetes-Cluster und Verteilung der Workloads zwischen diesen .
Ich möchte einige der Vor- und Nachteile hervorheben:
In Anbetracht einer nicht zu teuren Umgebung mit durchschnittlicher Wartung und dennoch Sicherheitsisolierung für Produktionsanwendungen würde ich empfehlen:
Umweltparität
Es ist eine gute Übung , Entwicklung, Inszenierung und Produktion so ähnlich wie möglich zu halten:
Kombinieren Sie ein leistungsstarkes CI / CD-Tool mit Helm . Sie können die Flexibilität der Steuerstandwerte verwenden , um Standardkonfigurationen festzulegen, indem Sie nur die Konfigurationen überschreiben, die sich von einer Umgebung zur anderen unterscheiden.
GitLab CI / CD mit AutoDevops verfügt über eine leistungsstarke Integration in Kubernetes, mit der Sie mehrere Kubernetes-Cluster verwalten können, die bereits Helmunterstützung bieten.
Verwalten mehrerer Cluster (
kubectl
Interaktionen)Um dies zu überwinden:
asdf
diese Option , um mehrerekubectl
Versionen zu verwaltenKUBECONFIG
Umgebung so ein, dass zwischen mehrerenkubeconfig
Dateien gewechselt wirdkube-ps1
diese Option , um Ihren aktuellen Kontext / Namespace zu verfolgenkubectx
undkubens
, um schnell zwischen Clustern / Namespaces zu wechselnIch habe einen Artikel, der beispielhaft zeigt, wie dies erreicht werden kann: Verwenden verschiedener Kubectl-Versionen mit mehreren Kubernetes-Clustern
Ich empfehle auch die folgenden Lesungen:
quelle
Verwenden Sie auf jeden Fall einen separaten Cluster für die Entwicklung und Erstellung von Docker-Images, damit Ihre Staging- / Produktionscluster sicherheitshalber gesperrt werden können. Ob Sie separate Cluster für verwenden,
staging + production
liegt bei Ihnen, basierend auf Risiko / Kosten. Wenn Sie diese getrennt halten, können Siestaging
Auswirkungen vermeidenproduction
.Ich würde auch empfehlen, GitOps zu verwenden, um Versionen Ihrer Apps zwischen Ihren Umgebungen zu bewerben.
Um menschliches Versagen zu minimieren, empfehle ich Ihnen außerdem, sich so weit wie möglich mit der Automatisierung Ihrer CI / CD und Ihrer Werbung zu befassen.
Hier ist eine Demo zur Automatisierung von CI / CD mit mehreren Umgebungen auf Kubernetes mithilfe von GitOps für die Werbung zwischen Umgebungen und Vorschau von Umgebungen auf Pull-Anforderungen, die live auf GKE durchgeführt wurde, obwohl Jenkins X die meisten Kubernetes-Cluster unterstützt
quelle
Dies hängt davon ab, was Sie in den einzelnen Szenarien testen möchten. Im Allgemeinen würde ich versuchen, das Ausführen von Testszenarien im Produktionscluster zu vermeiden, um unnötige Nebenwirkungen (Auswirkungen auf die Leistung usw.) zu vermeiden.
Wenn Sie mit einem Staging-System testen möchten , das das Produktionssystem genau nachahmt, würde ich empfehlen, ein genaues Replikat des gesamten Clusters zu starten und es nach Abschluss des Tests herunterzufahren und die Bereitstellungen in die Produktion zu verschieben.
Wenn Sie ein Staging-System testen möchten , mit dem die Bereitstellung der Anwendung getestet werden kann , würde ich einen kleineren Staging-Cluster dauerhaft ausführen und die Bereitstellungen (mit einer verkleinerten Version der Bereitstellungen) nach Bedarf für kontinuierliche Tests aktualisieren.
Um die verschiedenen Cluster zu steuern, bevorzuge ich einen separaten ci / cd-Computer, der nicht Teil des Clusters ist, aber zum Starten und Herunterfahren von Clustern sowie zum Durchführen von Bereitstellungsarbeiten, Initiieren von Tests usw. verwendet wird. Dies ermöglicht das Einrichten und Herunterfahren Cluster als Teil automatisierter Testszenarien.
quelle
Es ist klar, dass das Risiko potenzieller Fehler, die sich auf die Produktionsservices auswirken, verringert wird, wenn das Produktionscluster von der Bereitstellungsphase getrennt wird. Dies kostet jedoch mehr Infrastruktur- / Konfigurationsmanagement, da mindestens Folgendes erforderlich ist:
Vergessen wir auch nicht, dass es mehr als eine Umgebung geben kann. Ich habe zum Beispiel in Unternehmen gearbeitet, in denen es mindestens drei Umgebungen gibt:
Ich denke, kurzlebige / On-Demand-Cluster sind sinnvoll, aber nur für bestimmte Anwendungsfälle (Last- / Leistungstests oder sehr große Integrations- / End-to-End-Tests), aber für beständigere / klebrigere Umgebungen sehe ich einen Overhead, der möglicherweise reduziert wird indem Sie sie in einem einzelnen Cluster ausführen.
Ich wollte mich wohl an die k8s-Community wenden, um herauszufinden, welche Muster für solche Szenarien wie die von mir beschriebenen verwendet werden.
quelle
Sofern Compliance oder andere Anforderungen nichts anderes vorschreiben, bevorzuge ich einen einzelnen Cluster für alle Umgebungen. Bei diesem Ansatz sind die Aufmerksamkeitspunkte:
Stellen Sie sicher, dass Sie auch Knoten pro Umgebung mithilfe von Beschriftungen gruppieren. Sie können dann die
nodeSelector
Ressourcen on verwenden, um sicherzustellen, dass sie auf bestimmten Knoten ausgeführt werden. Dies verringert die Wahrscheinlichkeit eines (übermäßigen) Ressourcenverbrauchs zwischen den Umgebungen.Behandeln Sie Ihre Namespaces als Subnetze und verbieten Sie standardmäßig den gesamten Ausgangs- / Eingangsverkehr. Siehe https://kubernetes.io/docs/concepts/services-networking/network-policies/ .
Haben Sie eine Strategie für die Verwaltung von Dienstkonten.
ClusterRoleBindings
implizieren etwas anderes, wenn ein Cluster mehr als eine Umgebung hostet.Verwenden Sie die Kontrolle, wenn Sie Werkzeuge wie Helm verwenden. In einigen Diagrammen werden offensichtlich Dienstkonten mit clusterweiten Berechtigungen installiert. Die Berechtigungen für Dienstkonten sollten jedoch auf die Umgebung beschränkt sein, in der sie sich befinden.
quelle
Die Verwendung mehrerer Cluster ist die Norm, um eine starke Trennung zwischen Produktion und "Nichtproduktion" zu erzwingen.
Beachten Sie in diesem Sinne, dass GitLab 13.2 (Juli 2020) jetzt Folgendes enthält:
Siehe Dokumentation und Ausgabe /
quelle
Ich halte das Ausführen eines einzelnen Clusters für sinnvoll, da dadurch der Overhead und die Überwachung reduziert werden. Sie müssen jedoch sicherstellen, dass Netzwerkrichtlinien und Zugriffssteuerungen vorhanden sind.
Netzwerkrichtlinie - Verbietet die Arbeitsbelastung der Dev / QA-Umgebung für die Interaktion mit Produkt- / Staging-Speichern.
Zugriffskontrolle - die mithilfe von ClusterRoles, Roles usw. Zugriff auf verschiedene Umgebungsressourcen haben.
quelle