Heute werden wir uns auf die GitOps-Aspekte von ACM konzentrieren und diese anhand der folgenden Modellkonfiguration aufschlüsseln:
Wir haben hier also drei OpenShift-Cluster. ACM verwendet ein Hub-verwaltetes Modell zum Verwalten von Clustern, wobei Hub der Cluster ist, auf dem ACM ausgeführt wird, und verwaltet die Cluster sind, die ACM verwaltet. Der Hub verwendet die folgende Red Hat-Software:
| DURCH | Ausführung |
|---|---|
| Red Hat OpenShift Container-Plattform | 4.5.7 |
| Red Hat Advanced Cluster Management | 2.0 Fixpack 2.0.2 |
Bitte beachten Sie, dass verwaltete Cluster unterschiedliche Bezeichnungen haben. Wir werden sie aktiv verwenden, wenn Sie Anwendungen in unterschiedlichen Umgebungen platzieren.
Wie in der Abbildung gezeigt, wird in der AWS-Cloud in der EU-Region ein verwalteter Entwicklungscluster namens Managed-Cluster1-Dev bereitgestellt. Außerdem gibt es in der US-Region einen verwalteten Produktionscluster namens Managed-Cluster2-Prod, der auch für AWS bereitgestellt wird.
Anwendungslebenszyklus
ACM bietet umfangreiche Funktionen für das Application Lifecycle Management. Hier sehen wir uns diejenigen an, die zur Kategorie GitOps gehören und in den folgenden Szenarien nützlich sind:
- Stellen Sie Ihre Anwendung in mehreren Umgebungen bereit.
- Stellen Sie Blau / Grün bereit.
- Anwendungsmigration.
- Notfallwiederherstellung
Definieren wir zunächst die Begriffe und Konzepte, die wir in diesem Artikel verwenden werden.
Kanäle
Kanäle verweisen auf einen physischen Ort, an dem die bereitzustellenden Ressourcen gespeichert sind. Hier werden Pipes vom Typ Git verwendet, obwohl es auch andere Pipetypen gibt (Helm, Namespaces usw.).
Weitere
Informationen PlacementRules
Durch das Erstellen und Verwalten von Placement-Regeln definieren Sie, wo Ihre Kubernetes-Ressourcenabonnements und Helm-Releases bereitgestellt werden sollen. Durch Anwenden dieser Regeln können Sie die Bereitstellung von Kubernetes-Ressourcen in mehreren Umgebungen erheblich vereinfachen.
Weitere
Informationen zu Abonnements
Abonnements sind eine Reihe von Definitionen für die Auswahl von Kubernetes-Ressourcen in Kanälen mithilfe von Anmerkungen, Beschriftungen und Versionen. Abonnementressourcen werden am Hub eingerichtet und an verwaltete Cluster übertragen. Der Abonnement-Controller überwacht den Quellspeicherort (Kanal) auf neue oder aktualisierte Ressourcen. In diesem Fall kann er die entsprechende Ressource direkt vom Quellspeicherort (Kanal) in den verwalteten Cluster herunterladen, ohne zuvor den Hub-Cluster zu überprüfen (da das Abonnement bereits gesendet wurde).
Das Abonnement kann Helm-Releases filtern, um die richtige Version des Diagramms auszuwählen. In diesem Fall überprüft der Abonnement-Controller anhand des Versionsparameters, welche Version der Helm-Version (Diagramm) für die Bereitstellung verwendet werden soll.
Weitere
Anwendungen
Das Anwendungsobjekt kann als eine Möglichkeit angesehen werden, Abonnements zu einer Gruppe zusammenzufassen. Hierzu gibt es entsprechende Tools und eine Konsole, um die Aggregation durchzuführen und alle Komponenten der Anwendung anzuzeigen.
Mehr Details
Git-Repository
Unsere Anwendungen werden gemäß GitOps-Vorlagen bereitgestellt. Für verschiedene Umgebungen benötigen Sie verschiedene Manifeste, die in einem Git-Repository gespeichert werden, dessen Struktur in der folgenden Tabelle aufgeführt ist:
| Ast | Beschreibung |
|---|---|
| Konfig | Speichert Basisdateien für Anwendungen, die in allen Umgebungen verwendet werden |
| Prod | Speichert Overlay-Dateien für Anwendungen, die in Produktionsumgebungen verwendet werden |
| Bühne | Speichert Overlay-Dateien für Anwendungen, die in Testumgebungen verwendet werden |
Hinweis. Red Hat ACM schränkt die Struktur Ihres Git-Repositorys ein. Es kann nicht nur wie in dieser Tabelle gezeigt organisiert werden, sondern auch auf jede andere für Sie bequeme Weise.
Bereitstellen einer Anwendung in mehreren Umgebungen
Schauen wir uns nun an, wie Sie mit ACM Ihre Anwendung in mehreren Umgebungen mithilfe eines einfachen Webdienstes bereitstellen können, der Wörter invertiert. Dieser Service verfügt über zwei Versionen: Stage (dies ist die Version, die Entwickler derzeit testen) und Production (dies ist die Version, die Kunden verwenden).
ACM unterstützt Kustomize , wodurch es sehr einfach ist, Anwendungen für die Zielbereitstellungsumgebung anzupassen.
Wie bereits erwähnt, verwenden wir in beiden Umgebungen dieselbe Anwendung, jedoch nur in unterschiedlichen Versionen.
Um die Anwendung bereitzustellen, verwenden wir das oc-Tool und eine Reihe von yaml-Manifesten mit den erforderlichen Konfigurationen für ACM, mit denen Channel, Subscription und PlacementRule festgelegt werden. Alles, was wir über die Befehlszeile tun, kann über die Webkonsole erledigt werden.
Im oc-Tool haben wir drei konfigurierte Kontexte, einen für jede Umgebung:
| Kontext | Beschreibung |
|---|---|
| Nabe | CLI-Profil für den HUB-Cluster (in dem ACM bereitgestellt wird) |
| Dev | CLI-Profil für verwalteten Entwicklungscluster (verwalteter Cluster1-Entwickler) |
| Profi | CLI-Profil für verwalteten Produktionscluster (verwalteter Cluster2-Produkt) |
Weitere Informationen zu CLI-Profilen finden Sie hier .
Schauen wir uns nun die Ressourcen an, die in unserem Beispiel verwendet werden:
Channel
apiVersion: apps.open-cluster-management.io/v1
kind: Channel
metadata:
name: acm-app-lifecycle-blog
namespace: open-cluster-management
spec:
type: Git
pathname: https://github.com/RHsyseng/acm-app-lifecycle-blog.git
Wir haben Channel als Git-Channel festgelegt, den unsere Abonnements verwenden, um Kubernetes-Ressourcen für die Bereitstellung unserer Anwendung zu erhalten.
In unserem Fall ist der Kanal so konfiguriert, dass er Kubernetes-Ressourcen vom Git-Repository github.com/RHsyseng/acm-app-lifecycle-blog.git empfängt.
Namespace
apiVersion: v1
kind: Namespace
metadata:
name: reverse-words-stage
Wenn wir Abonnement verwenden, wird der Namespace, der dieses Abonnement enthält, an den Zielbereitstellungscluster übergeben. Hier erstellen wir also einen Namespace namens Reverse-Words-Stage, der über dieses Abonnement an unsere Entwicklercluster weitergeleitet wird.
Platzierungsregel
apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
name: development-clusters
namespace: reverse-words-stage
spec:
clusterConditions:
- type: "ManagedClusterConditionAvailable"
status: "True"
clusterSelector:
matchExpressions: []
matchLabels:
environment: "dev"
Die Liste der Cluster, in denen Abonnements übergeben werden, stammt aus der PlacementRule. Mit anderen Worten, wir müssen bestimmte Cluster aus unseren Umgebungen auswählen und auf verschiedene Abonnements übertragen. Dies ist genau die Aufgabe, die PlacementRules löst. In
unserem Beispiel gibt PlacementRule mit dem Namen Entwicklungscluster alle als Verfügbar gekennzeichneten Cluster mit einer Bezeichnung zurück, die die Umgebungsbedingungen erfüllt : dev. Das heißt, in unserem Fall ist die Ausgabe ein verwalteter Entwicklungscluster mit dem Namen "Verwalteter Cluster1-Entwickler".
Abonnement
apiVersion: apps.open-cluster-management.io/v1
kind: Subscription
metadata:
name: reversewords-dev-app-subscription
namespace: reverse-words-stage
labels:
app: reversewords-dev-app
annotations:
apps.open-cluster-management.io/git-path: apps/reversewords/
apps.open-cluster-management.io/git-branch: stage
spec:
channel: open-cluster-management/acm-app-lifecycle-blog
placement:
placementRef:
kind: PlacementRule
name: development-clusters
Im obigen Beispiel ist Subscription für die Bereitstellung einer Liste von Kubernetes-Ressourcen (aus dem Channel) für Cluster aus der Liste (aus der PlacementRule) verantwortlich. Daneben können Sie aber auch angeben, wo genau sich diese Kubernetes-Ressourcen im Git-Repository (Kanal) befinden.
Unser Abonnement verwendet den oben definierten Kanal und bezieht Kubernetes-Ressourcen aus dem Stage-Zweig, wo sie im Ordner apps / reverseewords / gesucht werden.
Anwendung
apiVersion: app.k8s.io/v1beta1
kind: Application
metadata:
name: reversewords-dev-app
namespace: reverse-words-stage
spec:
componentKinds:
- group: apps.open-cluster-management.io
kind: Subscription
descriptor: {}
selector:
matchExpressions:
- key: app
operator: In
values:
- reversewords-dev-app
Die Anwendung hilft beim Erstellen der Topologie unserer Anwendung auf von ACM verwalteten Clustern. Zu diesem Zweck wählt die Anwendung ein oder mehrere Abonnements aus, die letztendlich Ressourcen in verschiedenen Clustern erstellen, sodass wir verfolgen können, wer was und wo erstellt hat.
Hinweis. Hier haben wir nur die Ressourcen behandelt, die beim Bereitstellen einer Anwendung in einer Entwicklungsumgebung verwendet werden. Ressourcen für andere Umgebungen finden Sie im GitHub-Repository. Sie sind ziemlich selbsterklärend und ähneln denen, die wir behandelt haben.
Bereitstellen der Anwendung in einer Entwicklungsumgebung
1. Der erste Schritt besteht darin, eine Kanaldefinition zu erstellen.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/base/00_channel.yaml
2. Als Nächstes erstellen wir einen Namespace zum Speichern der Manifeste unserer Anwendung.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/00_namespace.yaml
3. Jetzt erstellen wir eine PlacementRule, die unsere verwalteten Entwicklungscluster auswählt.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/01_placement_rule.yaml
Siehe den Status der PlacementRule. Beachten Sie, dass diese Regel den verwalteten Cluster1-dev dev-cluster ausgewählt hat:
oc --context hub -n reverse-words-stage get placementrule development-clusters -o yaml
<OMITTED_OUTPUT>
status:
decisions:
- clusterName: managed-cluster1-dev
clusterNamespace: managed-cluster1-dev
4. Sie können jetzt mit PlacementRule ein Abonnement und eine Anwendung erstellen, um auf den Entwicklungscluster abzuzielen.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/02_subscription-dev.yaml
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/03_application-dev.yaml
Siehe den Abonnementstatus. Achten Sie auf das weitergegebene Wort. Dies bedeutet, dass das Abonnement an den Zielcluster gesendet wurde:
oc --context hub -n reverse-words-stage get subscription reversewords-dev-app-subscription -o yaml
<OMITTED_OUTPUT>
status:
message: Active
phase: Propagated
5. Schließlich sehen wir uns den Entwicklungscluster an und stellen fest, dass die Anwendung bereitgestellt wurde und funktioniert.
oc --context dev -n reverse-words-stage get deployments,services,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/reverse-words 1/1 1 1 73s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/reverse-words LoadBalancer 172.30.217.208 a84668cb23acf4d109a78b119dfddbef-750551.eu-central-1.elb.amazonaws.com 8080:30053/TCP 73s
NAME READY STATUS RESTARTS AGE
pod/reverse-words-68b9b894dd-jfgpf 1/1 Running 0 73s
Wenn wir versuchen, Anforderungen an den Produktionscluster auszuführen, werden wir feststellen, dass die Anwendung dort nicht ausgeführt wird.
oc --context pro -n reverse-words-stage get deployments,services,pods
No resources found in reverse-words-stage namespace.
6. Führen Sie nun eine Anforderung an unsere Anwendung aus und stellen Sie sicher, dass wir die erforderliche Version bereitgestellt haben, nämlich Staging:
curl http://$(oc --context dev -n reverse-words-stage get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
Reverse Words Release: Stage Release v0.0.3. App version: v0.0.3
Bereitstellen der Anwendung in einer Produktionsumgebung
1. Es ist nicht erforderlich, einen neuen Kanal zu erstellen, da wir dasselbe Git-Repo als Quelle verwenden, aber nur einen anderen Zweig.
2. Erstellen Sie einen Namespace, um die Manifeste unserer Anwendung zu speichern.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/00_namespace.yaml
3. Jetzt erstellen wir eine PlacementRule, die Produktionscluster auswählt:
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/01_placement_rule.yaml
Siehe den Status der PlacementRule. Beachten Sie, dass diese Regel den Managed-Cluster2-Prod-Produktionscluster ausgewählt hat.
oc --context hub -n reverse-words-prod get placementrule production-clusters -o yaml
<OMITTED_OUTPUT>
status:
decisions:
- clusterName: managed-cluster2-prod
clusterNamespace: managed-cluster2-prod
4. Sie können jetzt ein Abonnement und eine Anwendung erstellen, um den Produktionscluster mithilfe von PlacementRule als Ziel festzulegen.
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/02_subscription-pro.yaml
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/03_application-pro.yaml
Siehe den Abonnementstatus. Achten Sie auf das weitergegebene Wort. Dies bedeutet, dass das Abonnement an den Zielcluster gesendet wurde:
oc --context hub -n reverse-words-prod get subscription reversewords-pro-app-subscription -o yaml
<OMITTED_OUTPUT>
status:
message: Active
phase: Propagated
5. Und schließlich sehen wir uns den Produktionscluster an und stellen fest, dass die Anwendung bereitgestellt wurde und funktioniert.
oc --context pro -n reverse-words-prod get deployments,services,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/reverse-words 1/1 1 1 93s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/reverse-words LoadBalancer 172.30.100.0 a6067d9a2cd904003a1b53b65f9e1cb3-450574743.us-west-2.elb.amazonaws.com 8080:30293/TCP 96s
NAME READY STATUS RESTARTS AGE
pod/reverse-words-7dd94446c-vkzr8 1/1 Running 0 94s
6. Führen Sie nun eine Anforderung an unsere Anwendung aus und stellen Sie sicher, dass wir die erforderliche Version bereitgestellt haben, nämlich die Produktion:
curl http://$(oc --context pro -n reverse-words-prod get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
Reverse Words Release: Production release v0.0.2. App version: v0.0.2
7. Wir haben jetzt verschiedene Versionen unserer Anwendung für verschiedene Bereitstellungsumgebungen:
# Query development environment
curl http://$(oc --context dev -n reverse-words-stage get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
# Query production environment
curl http://$(oc --context pro -n reverse-words-prod get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
# Dev Query
Reverse Words Release: Stage Release v0.0.3. App version: v0.0.3
# Pro Query
Reverse Words Release: Production release v0.0.2. App version: v0.0.2
Lassen Sie uns abschließend sehen, wie es in der Webkonsole aussieht:
ACM Applications General View

Ansicht der ACM-Entwicklungsanwendung

Fortsetzung folgt
Im nächsten Beitrag zeigen wir Ihnen, wie Sie ACM für Blue / Green-Bereitstellungen, Anwendungsmigration und Disaster Recovery verwenden.