Migra el plano de control en el clúster al plano de control administrado en un clúster nuevo

En este instructivo, se muestra cómo migrar una aplicación de un clúster de Google Kubernetes Engine (GKE) que usa Cloud Service Mesh integrado en el clúster a un clúster nuevo con Cloud Service Mesh administrado, la malla de servicios totalmente administrada de Google que cumple con Istio.

En este instructivo, harás lo siguiente:

  1. Crea un clúster de Google Kubernetes Engine nuevo y, luego, instala Cloud Service Mesh en el clúster y la puerta de enlace de entrada de Cloud Service Mesh. Este clúster actuará como el clúster existente del que deseas migrar.
  2. Implementa la aplicación de muestra Online Boutique en el clúster con Cloud Service Mesh en el clúster.
  3. Crea otro clúster de Google Kubernetes Engine en el mismo proyecto de Google Cloud.
  4. Aprovisiona Cloud Service Mesh administrado en el segundo clúster y, luego, implementa la puerta de enlace de entrada de Cloud Service Mesh.
  5. Implementa Online Boutique en el clúster con Cloud Service Mesh administrado para replicar la implementación desde el clúster con Cloud Service Mesh en el clúster.
  6. Traslada el 50% del tráfico de los usuarios del clúster con Cloud Service Mesh integrado al clúster con Cloud Service Mesh administrado mediante las capacidades de división de tráfico de Istio en el clúster con Cloud Service Mesh integrado.
  7. Para completar la migración de Cloud Service Mesh en el clúster a Cloud Service Mesh administrado, dirige la entrada del sistema de nombres de dominio (DNS) del clúster con Cloud Service Mesh en el clúster con Cloud Service Mesh administrado.

El tráfico de los usuarios se divide en partes iguales entre un clúster con Cloud Service Mesh en el clúster y un clúster con Cloud Service Mesh administrado. Cada clúster contiene su propia implementación de Online Boutique.

Implementación de versiones canary

La "implementación Canary" es una técnica que se usa en el desarrollo de software para probar una versión nueva de algún software antes de lanzarla a todos los usuarios. Implica aumentar de forma incremental el porcentaje de tráfico enviado a la versión nueva. En este instructivo, configurarás un clúster nuevo con Cloud Service Mesh administrado y transferirás de forma incremental el tráfico de los usuarios a él. Comenzarás por dirigir el 0% del tráfico de usuarios al clúster nuevo, luego el 50% y, por último, el 100%. En producción, debes usar incrementos más pequeños y más. Si en algún momento notas que el clúster nuevo no puede controlar un porcentaje de tráfico, puedes revertir la actualización reduciendo el porcentaje al 0%.

Comparación entre el plano de control de Canary y el clúster de Canary

Existen dos estrategias de uso general para las migraciones de Cloud Service Mesh en el clúster a Cloud Service Mesh administrado:

  • Migración del plano de control de Canary: En esta estrategia, aprovisionas Cloud Service Mesh administrado en el mismo clúster en el que se instala Cloud Service Mesh en el clúster.
  • Migración de clústeres de la versión canary: En esta estrategia, creas un clúster nuevo y, luego, aprovisionas Cloud Service Mesh administrado en él.

En este instructivo, analizarás la estrategia de migración de clústeres Canary.

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

Cuando completes el instructivo puedes borrar los recursos que hayas creado para evitar que se te sigan cobrando. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the required APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the required APIs.

    Enable the APIs

Inicia Cloud Shell

En este instructivo, usarás Cloud Shell, que es un entorno de shell alojado en Google Cloud que te permite administrar tus recursos de Google Cloud.

Cloud Shell ya viene instalado en las herramientas de línea de comandos de Google Cloud CLI, kubectl y istioctl. Gcloud CLI proporciona la CLI principal para Google Cloud.

Abre una sesión de Cloud Shell desde la esquina superior derecha de esta página, haz clic en y, luego, en Confirmar. Se abrirá una sesión de Cloud Shell dentro de un marco en la parte inferior de la página. Completa los siguientes comandos en esa sesión de Cloud Shell.

Descarga el código de muestra

Clona los repositorios de Git que contienen los recursos de Kubernetes y Istio que usarás:

  git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples.git
  git clone https://github.com/GoogleCloudPlatform/microservices-demo.git

Configura el clúster con Cloud Service Mesh en el clúster

Crea el clúster y, luego, instala Cloud Service Mesh en él

En la sección, crearás tu clúster que usa Cloud Service Mesh en el clúster. En la práctica, estos serían los clústeres que ya usas.

  1. Reemplaza PROJECT_ID por el ID de tu proyecto y crea un clúster nuevo:

    gcloud container clusters create cluster-with-in-cluster-asm \
      --project=PROJECT_ID \
      --zone=us-central1-a \
      --machine-type=e2-standard-4 --num-nodes=2 \
      --workload-pool=PROJECT_ID.svc.id.goog
    
  2. Cambia el nombre del contexto del clúster para que sea más fácil trabajar con él:

    kubectl config rename-context \
      gke_PROJECT_ID_us-central1-a_cluster-with-in-cluster-asm \
      cluster-with-in-cluster-asm
    
  3. Verifica que se haya cambiado el nombre del contexto del clúster:

    kubectl config get-contexts --output="name"
    
  4. Descarga la versión que instala Cloud Service Mesh 1.23.3 en el directorio de trabajo actual:

    curl https://storage.googleapis.com/csm-artifacts/asm/asmcli_1.23 > asmcli
    

    Se te pedirá que escribas "y" y, luego, presiones Intro.

    El resultado es similar al siguiente:

    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
    100  167k  100  167k    0     0   701k      0 --:--:-- --:--:-- --:--:--  701k
    
  5. Haz que la secuencia de comandos asmcli sea ejecutable:

    chmod +x asmcli
    
  6. Instala Cloud Service Mesh en el clúster con asmcli:

    ./asmcli install \
      --project_id PROJECT_ID \
      --cluster_name cluster-with-in-cluster-asm \
      --cluster_location us-central1-a \
      --output_dir . \
      --enable_all \
      --ca mesh_ca
    

    La herramienta asmcli puede tardar varios minutos en completarse. La herramienta genera mensajes informativos para que puedas seguir su progreso.

    Si se ejecuta de forma correcta, el resultado es similar al siguiente:

    ...
    asmcli: Successfully installed ASM.
    

Implementa la puerta de enlace de entrada de Cloud Service Mesh

  1. Implementarás la puerta de enlace de entrada de Cloud Service Mesh en un espacio de nombres separado llamado asm-ingress. Crea el espacio de nombres:

    kubectl \
      --context cluster-with-in-cluster-asm \
      create namespace asm-ingress
    
  2. Usa la etiqueta istio.io/rev=asm-1233-2 para agregar el espacio de nombres asm-ingress a la malla de servicios y habilitar la inserción automática de proxy de sidecar.

    kubectl \
      --context cluster-with-in-cluster-asm \
      label --overwrite namespace asm-ingress istio.io/rev=asm-1233-2
    

    El resultado es similar al siguiente:

    namespace/asm-ingress labeled
    
    .
  3. Implementa la puerta de enlace de entrada de Cloud Service Mesh:

    kubectl \
      --context cluster-with-in-cluster-asm \
      --namespace=asm-ingress \
      apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/asm-gateway-deployment-svc.yaml
    kubectl \
      --context cluster-with-in-cluster-asm \
      --namespace=asm-ingress \
      apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/gateway.yaml
    

    El resultado es similar al siguiente:

    serviceaccount/asm-ingressgateway created
    service/asm-ingressgateway created
    deployment.apps/asm-ingressgateway created
    gateway.networking.istio.io/asm-ingressgateway created
    

Implementa Online Boutique

  1. Implementarás Online Boutique en un espacio de nombres independiente llamado onlineboutique. Crea el espacio de nombres:

    kubectl \
      --context cluster-with-in-cluster-asm \
      create namespace onlineboutique
    
  2. Usa la etiqueta istio.io/rev=asm-1233-2 para agregar el espacio de nombres onlineboutique a la malla de servicios y habilitar la inserción automática de proxy de sidecar.

    kubectl \
      --context cluster-with-in-cluster-asm \
      label --overwrite namespace onlineboutique istio.io/rev=asm-1233-2
    

    El resultado es similar al siguiente:

    namespace/onlineboutique labeled
    
  3. Implementa los 12 servicios de Online Boutique, incluido el generador de cargas que imita el tráfico de los usuarios:

    kubectl \
      --context cluster-with-in-cluster-asm \
      --namespace=onlineboutique \
      apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml
    kubectl \
      --context cluster-with-in-cluster-asm \
      --namespace=onlineboutique \
      apply -f anthos-service-mesh-samples/docs/shared/online-boutique/virtual-service.yaml
    
  4. Obtén la dirección IP externa de la puerta de enlace de entrada de Cloud Service Mesh:

    kubectl \
      --context cluster-with-in-cluster-asm \
      --namespace asm-ingress \
      get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
    
  5. Copia la dirección IP externa de la puerta de enlace de entrada y accede a ella a través de tu navegador web. Verás la app de ejemplo de Online Boutique.

Configura el clúster nuevo con Cloud Service Mesh administrado

Crea el clúster y aprovisiona Cloud Service Mesh administrado

En esta sección, crearás el clúster al que migrarás. Aprovisionarás Cloud Service Mesh administrado y, luego, implementarás Online Boutique para replicar las implementaciones del clúster que usa Cloud Service Mesh en el clúster.

  1. Crea un clúster nuevo:

    gcloud container clusters create cluster-with-csm \
      --project=PROJECT_ID --zone=us-central1-a \
      --machine-type=e2-standard-4 --num-nodes=2 \
      --workload-pool PROJECT_ID.svc.id.goog
    
  2. Cambia el nombre del contexto del clúster para que sea más fácil trabajar con él:

    kubectl config rename-context \
      gke_PROJECT_ID_us-central1-a_cluster-with-csm \
      cluster-with-csm
    
  3. Verifica que se haya cambiado el nombre del contexto del clúster:

    kubectl config get-contexts --output="name"
    
  4. Habilita Cloud Service Mesh en la flota de tu proyecto. Una flota es una agrupación lógica de clústeres de Kubernetes y otros recursos que se pueden administrar juntos.

    gcloud container fleet mesh enable --project PROJECT_ID
    

    El resultado es similar al siguiente:

    Waiting for Feature Service Mesh to be created...done.
    
  5. Registra el clúster en la flota del proyecto:

    gcloud container fleet memberships register cluster-with-csm-membership \
      --gke-cluster=us-central1-a/cluster-with-csm \
      --enable-workload-identity \
      --project PROJECT_ID
    

    El resultado es similar al siguiente:

    Waiting for membership to be created...done.
    Finished registering to the Fleet.
    
  6. Habilita Cloud Service Mesh administrado en el clúster:

    gcloud container fleet mesh update \
      --management automatic \
      --memberships cluster-with-csm-membership \
      --project PROJECT_ID
    

    El resultado es similar al siguiente:

    Waiting for Feature Service Mesh to be updated...done.
    
  7. Verifica que se haya aprovisionado Cloud Service Mesh administrado para el clúster y que esté listo para usarse:

    gcloud container fleet mesh describe --project PROJECT_ID
    

    Cloud Service Mesh puede tardar unos 10 minutos en aprovisionarse y estar listo para usarse en el clúster. Si ves controlPlaneManagement.state: DISABLED o controlPlaneManagement.state: PROVISIONING, deberás volver a ejecutar el comando anterior cada algunos minutos hasta que veas controlPlaneManagement.state: ACTIVE.

    El resultado es similar al siguiente:

    createTime: '2022-07-06T01:05:39.110120474Z'
    membershipSpecs:
      projects/123456789123/locations/global/memberships/cluster-with-csm-membership:
        mesh:
          management: MANAGEMENT_AUTOMATIC
    membershipStates:
      projects/123456789123/locations/global/memberships/cluster-with-csm-membership:
        servicemesh:
          controlPlaneManagement:
            details:
            - code: REVISION_READY
              details: 'Ready: asm-managed'
            state: ACTIVE
          dataPlaneManagement:
            details:
            - code: OK
              details: Service is running.
            state: ACTIVE
        state:
          code: OK
          description: 'Revision(s) ready for use: asm-managed.'
          updateTime: '2022-07-06T01:19:24.243993678Z'
    name: projects/your-project-id/locations/global/features/servicemesh
    resourceState:
      state: ACTIVE
    spec: {}
    state:
      state: {}
    updateTime: '2022-07-06T01:19:27.475885687Z'
    

Implementa la puerta de enlace de entrada de Cloud Service Mesh

  1. Implementarás la puerta de enlace de entrada de Cloud Service Mesh en un espacio de nombres separado llamado asm-ingress. Crea el espacio de nombres:

    kubectl \
      --context cluster-with-csm \
      create namespace asm-ingress
    
  2. Usa la etiqueta istio.io/rev=asm-managed para agregar el espacio de nombres asm-ingress a la malla de servicios y habilitar la inserción automática de proxy de sidecar.

    kubectl \
      --context cluster-with-csm \
      label namespace asm-ingress 'istio.io/rev=asm-managed'
    
  3. Implementa la puerta de enlace de entrada de Cloud Service Mesh:

    kubectl \
      --context cluster-with-csm \
      --namespace=asm-ingress \
      apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/asm-gateway-deployment-svc.yaml
    kubectl \
      --context cluster-with-csm \
      --namespace=asm-ingress \
      apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/gateway.yaml
    

    El resultado es similar al siguiente:

    namespace/asm-ingress configured
    serviceaccount/asm-ingressgateway configured
    service/asm-ingressgateway configured
    deployment.apps/asm-ingressgateway configured
    gateway.networking.istio.io/asm-ingressgateway configured
    

Implementa Online Boutique

  1. Implementarás Online Boutique en un espacio de nombres independiente llamado onlineboutique. Crea el espacio de nombres:

    kubectl \
      --context cluster-with-csm \
      create namespace onlineboutique
    
  2. Usa la etiqueta istio.io/rev=asm-managed para agregar el espacio de nombres onlineboutique a la malla de servicios y habilitar la inserción automática de proxy de sidecar.

    kubectl \
      --context cluster-with-csm \
      label namespace onlineboutique 'istio.io/rev=asm-managed'
    
  3. Implementa los 12 servicios de Online Boutique, incluido el generador de cargas que imita el tráfico de los usuarios:

    kubectl \
      --context cluster-with-csm \
      --namespace=onlineboutique \
      apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml
    kubectl \
      --context cluster-with-csm \
      --namespace=onlineboutique \
      apply -f anthos-service-mesh-samples/docs/shared/online-boutique/virtual-service.yaml
    
  4. Obtén la dirección IP externa de la puerta de enlace de entrada de Cloud Service Mesh:

    kubectl \
      --context cluster-with-csm \
      --namespace asm-ingress \
      get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
    
  5. Copia la dirección IP externa del servicio de asm-ingressgateway y accede a él a través de tu navegador web. Verás la app de ejemplo de Online Boutique. Usarás la dirección IP externa en la siguiente sección, así que cópiala en una variable de entorno:

    export INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM=$( \
      kubectl \
        --context cluster-with-csm \
        --namespace asm-ingress \
        get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \
      )
    

Prueba el clúster con Cloud Service Mesh mediante una implementación de versiones canary

En esta sección, configurarás el clúster con Cloud Service Mesh en el clúster de modo que el 50% del tráfico de usuarios a Online Boutique se dirija a la instancia de Online Boutique en el clúster con Cloud Service Mesh administrado. Para lograrlo, debes implementar dos recursos de Istio en el clúster con Cloud Service Mesh en el clúster:

  • un ServiceEntry para informar a Cloud Service Mesh en el clúster sobre el extremo de la Boutique en línea del clúster de Cloud Service Mesh administrado
  • un VirtualService para indicarle a la puerta de enlace de entrada de Cloud Service Mesh en el clúster que divida el tráfico en partes iguales.
  1. Configura la dirección IP de la puerta de enlace de entrada del clúster administrado de Cloud Service Mesh dentro del recurso ServiceEntry:

    sed -i "s/1.2.3.4/${INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM}/" anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
    
  2. Implementa ServiceEntry en el clúster con Cloud Service Mesh en el clúster:

    kubectl \
      --context cluster-with-in-cluster-asm \
      --namespace onlineboutique \
      apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
    
  3. Implementa VirtualService en el clúster con Cloud Service Mesh en el clúster:

    kubectl \
      --context cluster-with-in-cluster-asm \
      --namespace onlineboutique \
      apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/virtual-service-in-cluster-asm.yaml
    
  4. Visita la dirección IP de la puerta de enlace de entrada del clúster con Cloud Service Mesh en el clúster, en tu navegador web:

    kubectl \
      --context cluster-with-in-cluster-asm \
      --namespace asm-ingress \
      get service
    

    Actualiza la página principal de Online Boutique varias veces y revisa el pie de página cada vez. Ten en cuenta que un Pod del clúster con Cloud Service Mesh administrado controla el 50% de las solicitudes.

Migra al clúster con Cloud Service Mesh administrado

En esta sección, se da por sentado que eres propietario de un nombre de dominio y tienes acceso a su configuración de DNS (servidor de nombres de dominio).

  1. Agrega un registro A a la configuración de DNS para dirigir el nombre de dominio (como example.com) a la dirección IP de la puerta de enlace de entrada que se ejecuta en el clúster con Cloud Service Mesh en el clúster.

  2. Para acceder a Online Boutique, visita el nombre de dominio en tu navegador web.

  3. Minimiza el tiempo de actividad (TTL) del registro DNS para asegurarte de poder revertir rápidamente la entrada de DNS si necesitas realizar una reversión.

  4. Establece el registro A de tu nombre de dominio en la dirección IP externa de la puerta de enlace de entrada del clúster con Cloud Service Mesh administrado.

  5. Cuando la migración se complete de forma correcta, borra el clúster con Cloud Service Mesh en el clúster:

    gcloud container clusters delete cluster-with-in-cluster-asm \
      --zone=us-central1-a \
      --project=PROJECT_ID
    

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borrar proyecto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Borra los recursos

Borra el clúster con Cloud Service Mesh administrado:

  gcloud container clusters delete cluster-with-managed-asm \
    --zone=us-central1-a \
    --project=PROJECT_ID

¿Qué sigue?