Red Hat Advanced Cluster Management y Application Management, Parte 1: Implementaci贸n en m煤ltiples entornos

Iniciamos una serie de publicaciones en las que le mostraremos c贸mo Advanced Cluster Management (ACM) ofrece capacidades de administraci贸n del ciclo de vida enriquecidas para aplicaciones que deben existir en m煤ltiples entornos a la vez, ya sea en la nube o en un centro de datos corporativo.



Hoy nos centraremos en los aspectos de GitOps de ACM y los desglosaremos utilizando la siguiente configuraci贸n de modelo:







Entonces, tenemos tres cl煤steres de OpenShift aqu铆. ACM usa un modelo administrado por concentrador para administrar cl煤steres, donde concentrador es el cl煤ster que ejecuta ACM y administrado son los cl煤steres que administra ACM. El concentrador utiliza el siguiente software de Red Hat:



POR Versi贸n
Plataforma de contenedores Red Hat OpenShift 4.5.7
Gesti贸n avanzada de cl煤steres de Red Hat 2.0 Fix Pack 2.0.2


Tenga en cuenta que los cl煤steres administrados tienen diferentes etiquetas, los usaremos activamente al colocar aplicaciones en diferentes entornos.



Como se muestra en la figura, tenemos un cl煤ster de desarrollo administrado llamado managed-cluster1-dev implementado en la nube de AWS en la regi贸n de la UE. Y tambi茅n hay un cl煤ster de producci贸n administrado llamado managed-cluster2-prod, que tambi茅n se implementa en AWS, en la regi贸n de EE. UU.



Ciclo de vida de la aplicaci贸n



ACM ofrece amplias capacidades de gesti贸n del ciclo de vida de las aplicaciones. Aqu铆 veremos los que pertenecen a la categor铆a GitOps y ser谩n 煤tiles en los siguientes escenarios:



  • Implemente su aplicaci贸n en m煤ltiples entornos.
  • Implementar azul / verde.
  • Migraci贸n de aplicaciones.
  • Recuperaci贸n de desastres


Primero, definamos los t茅rminos y conceptos que operaremos en este art铆culo.



Canales Los



canales apuntan a una ubicaci贸n f铆sica donde se almacenan los recursos que se van a implementar. Aqu铆 usaremos tuber铆as del tipo Git, aunque existen otros tipos de tuber铆as (Helm, Namespaces, etc.).



M谩s informaci贸n



PlacementRules



Al crear y administrar reglas de ubicaci贸n, usted define d贸nde implementar sus suscripciones de recursos de Kubernetes y versiones de Helm. Al aplicar estas reglas, puede simplificar enormemente la implementaci贸n de los recursos de Kubernetes en varios entornos.



M谩s informaci贸n



Suscripciones



Las suscripciones son un conjunto de definiciones para seleccionar recursos de Kubernetes en canales mediante anotaciones, etiquetas y versiones. Los recursos de suscripci贸n se configuran en el concentrador y se env铆an a cl煤steres administrados. El controlador de suscripci贸n supervisa la ubicaci贸n de origen (canal) en busca de recursos nuevos o actualizados. Cuando esto sucede, puede descargar el recurso correspondiente directamente desde la ubicaci贸n de origen (canal) al cl煤ster administrado sin verificar primero el cl煤ster del concentrador (dado que la suscripci贸n ya se envi贸).



La suscripci贸n puede filtrar las versiones de Helm para seleccionar la versi贸n correcta del gr谩fico. En este caso, el controlador de suscripci贸n examina el par谩metro de versi贸n para comprender qu茅 versi贸n de la versi贸n de Helm (gr谩fico) debe tomarse para la implementaci贸n.



M谩s



aplicaciones



El objeto Aplicaci贸n se puede considerar como una forma de agregar suscripciones en un grupo. Para ello, existen las herramientas correspondientes y una consola para realizar la agregaci贸n y visualizar todos los componentes de la Aplicaci贸n.



M谩s detalles



Repositorio de Git



Nuestras aplicaciones se implementar谩n de acuerdo con las plantillas de GitOps, y para diferentes entornos necesitar谩 diferentes manifiestos que se almacenar谩n en un repositorio de Git, cuya estructura se muestra en la siguiente tabla:



Rama Descripci贸n
Config Almacena archivos base para aplicaciones que se utilizan en todos los entornos.
Pinchar Almacena archivos de superposici贸n para aplicaciones utilizadas en entornos de producci贸n.
Etapa Almacena archivos de superposici贸n para aplicaciones que se utilizan en entornos de prueba.


Nota. Red Hat ACM restringe la forma en que estructura su repositorio de Git. Puede organizarse no solo como se muestra en esta tabla, sino tambi茅n de cualquier otra forma que le resulte conveniente.



Implementar la aplicaci贸n en m煤ltiples entornos



Ahora veamos c贸mo ACM puede ayudarlo a implementar su aplicaci贸n en m煤ltiples entornos utilizando un servicio web simple que invierte las palabras. Este servicio tiene dos versiones: etapa (esta es la versi贸n que los desarrolladores est谩n probando actualmente) y producci贸n (esta es la versi贸n que est谩n usando los clientes).



ACM es compatible con Kustomize , lo que facilita la personalizaci贸n de aplicaciones para el entorno de implementaci贸n de destino.



Como ya se mencion贸, en ambos entornos usamos la misma aplicaci贸n, pero solo en diferentes versiones.



Para implementar la aplicaci贸n, usaremos la herramienta oc y un conjunto de manifiestos yaml con las configuraciones necesarias para ACM, que establecen Channel, Subscription y PlacementRule. Todo lo que hacemos desde la l铆nea de comandos se puede hacer desde la consola web.



En la herramienta oc tendremos tres contextos configurados, uno para cada entorno:



Contexto Descripci贸n
Cubo Perfil CLI para el cl煤ster HUB (donde se implementa ACM)
Dev Perfil de CLI para cl煤ster de desarrollo administrado (managed-cluster1-dev)
Pro Perfil de CLI para cl煤ster de producci贸n administrado (managed-cluster2-prod)


Puede leer m谩s sobre los perfiles CLI aqu铆 .



Ahora veamos los recursos que se utilizar谩n en nuestro ejemplo:



Canal



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


Configuramos Channel para que sea un Git de tipo Channel, que nuestras suscripciones usar谩n para obtener los recursos de Kubernetes para implementar nuestra aplicaci贸n.



En nuestro caso, el canal est谩 configurado para recibir recursos de Kubernetes del repositorio de Git github.com/RHsyseng/acm-app-lifecycle-blog.git.



Espacio de nombres



apiVersion: v1
kind: Namespace
metadata:
  name: reverse-words-stage


Cuando usamos Suscripci贸n, el espacio de nombres que contiene esta suscripci贸n se pasa al cl煤ster de implementaci贸n de destino. Entonces, aqu铆 estamos creando un espacio de nombres llamado reverse-words-stage que se enviar谩 a nuestros cl煤steres de desarrollo a trav茅s de esta suscripci贸n.



PlacementRule



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"


La lista de cl煤steres a los que se transfieren las suscripciones se toma de lo que devuelve PlacementRule. En otras palabras, necesitamos seleccionar de alguna manera ciertos cl煤steres de nuestros entornos y transferirlos a diferentes suscripciones, esta es exactamente la tarea que resuelve PlacementRules.En



nuestro ejemplo, la PlacementRule llamada desarrollo-cl煤steres devuelve todos los cl煤steres marcados como Disponibles, y con una etiqueta que cumple con la condici贸n del entorno. : dev. Es decir, en nuestro caso, la salida ser谩 un cl煤ster de desarrollo administrado llamado managed-cluster1-dev.



Suscripci贸n



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


En el ejemplo anterior, Subscription es responsable de implementar una lista de recursos de Kubernetes (tomados del canal) en cl煤steres de la lista (tomados de PlacementRule). Pero adem谩s de eso, tambi茅n puede especificar d贸nde se encuentran exactamente estos recursos de Kubernetes en el repositorio (canal) de Git.



Nuestra suscripci贸n utiliza el canal que definimos anteriormente y toma los recursos de Kubernetes de la rama de etapa, donde los busca en la carpeta apps / reversewords /.



Solicitud



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


La aplicaci贸n ayuda a crear la topolog铆a de nuestra aplicaci贸n en cl煤steres administrados por ACM. Para hacer esto, la Aplicaci贸n selecciona una o m谩s suscripciones, que finalmente crean recursos en varios cl煤steres, para que podamos rastrear qui茅n cre贸 qu茅 y d贸nde se cre贸.



Nota. Aqu铆, hemos cubierto solo los recursos que se utilizar谩n al implementar una aplicaci贸n en un entorno de desarrollo. Los recursos para otros entornos se pueden encontrar en el repositorio de GitHub y se explican por s铆 mismos y son similares a los que hemos cubierto.



Implementar la aplicaci贸n en un entorno de desarrollo





1. El primer paso es crear una definici贸n de canal.



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/base/00_channel.yaml


2. A continuaci贸n, creamos un espacio de nombres para almacenar los manifiestos de nuestra aplicaci贸n.



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/00_namespace.yaml


3. Ahora creamos una PlacementRule que seleccionar谩 nuestros cl煤steres de desarrollo administrados.



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/01_placement_rule.yaml


Ver el estado de PlacementRule. Tenga en cuenta que esta regla seleccion贸 el cl煤ster de desarrollo managed-cluster1-dev:



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. Ahora puede crear una suscripci贸n y una aplicaci贸n para apuntar al cl煤ster de desarrollo mediante PlacementRule.



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


Consulte el estado de la suscripci贸n. Preste atenci贸n a la palabra propagada, significa que la suscripci贸n se envi贸 al cl煤ster de destino:



oc --context hub -n reverse-words-stage get subscription reversewords-dev-app-subscription -o yaml
<OMITTED_OUTPUT>
status:
  message: Active
  phase: Propagated


5. Finalmente, observamos el cl煤ster de desarrollo y vemos que la aplicaci贸n se ha implementado y est谩 funcionando.



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


Si intentamos ejecutar solicitudes al cl煤ster de producci贸n, veremos que la aplicaci贸n no se est谩 ejecutando all铆.



oc --context pro -n reverse-words-stage get deployments,services,pods
No resources found in reverse-words-stage namespace.


6. Ahora ejecutemos una solicitud a nuestra aplicaci贸n y asegur茅monos de haber implementado la versi贸n requerida, es decir, la puesta en escena:



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


Implementar la aplicaci贸n en un entorno de producci贸n





1. No es necesario crear un nuevo canal, ya que usaremos el mismo repositorio de Git como fuente, pero solo una rama diferente.



2. Cree un espacio de nombres para almacenar los manifiestos de nuestra aplicaci贸n.



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/00_namespace.yaml


3. Ahora creamos una PlacementRule que selecciona cl煤steres de producci贸n:



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/01_placement_rule.yaml


Ver el estado de PlacementRule. Tenga en cuenta que esta regla seleccion贸 el cl煤ster de producci贸n managed-cluster2-prod.



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. Ahora puede crear una Suscripci贸n y una Aplicaci贸n para establecer el cl煤ster de producci贸n como el objetivo usando PlacementRule.



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


Consulte el estado de la suscripci贸n. Preste atenci贸n a la palabra propagada, significa que la suscripci贸n se envi贸 al cl煤ster de destino:



oc --context hub -n reverse-words-prod get subscription reversewords-pro-app-subscription -o yaml

<OMITTED_OUTPUT>
status:
  message: Active
  phase: Propagated


5. Y finalmente, miramos el cl煤ster de producci贸n y vemos que la aplicaci贸n se ha implementado y est谩 funcionando.



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. Ahora ejecutemos una solicitud a nuestra aplicaci贸n y asegur茅monos de haber implementado la versi贸n requerida, es decir, producci贸n:



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. Ahora tenemos diferentes versiones de nuestra aplicaci贸n para diferentes entornos de implementaci贸n:



# 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


Por 煤ltimo, veamos c贸mo se ve en la consola web:



Vista general de aplicaciones ACM







Vista de la aplicaci贸n de desarrollo de ACM







Continuar谩



En la pr贸xima publicaci贸n, le mostraremos c贸mo usar ACM para implementaciones Blue / Green, migraci贸n de aplicaciones y recuperaci贸n ante desastres.



All Articles