Red Hat Advanced Cluster Management und Application Management, Teil 1: Bereitstellung in mehreren Umgebungen

Wir starten eine Reihe von Beiträgen, in denen wir Ihnen zeigen, wie Advanced Cluster Management (ACM) umfassende Funktionen für das Lebenszyklusmanagement für Anwendungen bietet, die in mehreren Umgebungen gleichzeitig vorhanden sein müssen, sei es in der Cloud oder in einem Unternehmensdatenzentrum.



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.



All Articles