En este instructivo, se muestra cómo migrar una aplicación desde un clúster de Google Kubernetes Engine (GKE) con Istio a un clúster nuevo con Anthos Service Mesh administrado, la malla de servicios completamente administrada de Google que cumple con los requisitos de Istio.
En este instructivo, harás lo siguiente:
- Crear un clúster de Google Kubernetes Engine nuevo y, luego, instalar Istio y la puerta de enlace de entrada de Istio en el clúster Este clúster actuará como el clúster existente del que deseas migrar.
- Implementa la aplicación de muestra Online Boutique en el clúster con Istio.
- Crear otro clúster de Google Kubernetes Engine en el mismo proyecto de Google Cloud
- Habilita Anthos Service Mesh administrado en el segundo clúster y, luego, implementa la puerta de enlace de entrada de Anthos Service Mesh.
- Implementa Online Boutique en el clúster con Anthos Service Mesh para replicar la implementación desde el clúster con Istio.
- Pasa el 50% del tráfico de usuarios del clúster con Istio al clúster con Anthos Service Mesh mediante las capacidades de división de tráfico de Istio en el clúster con Istio.
- Para completar la migración de Istio a Anthos Service Mesh, apunta la entrada del sistema de nombres de dominio (DNS) del clúster con Istio al clúster con Anthos Service Mesh.
Implementación de versiones canary
La “implementación de versiones 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 lanzar esa versión nueva 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 Anthos Service Mesh administrado y cambiarás el tráfico de usuarios de forma incremental hacia él. Comenzarás dirigiendo 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 cada vez más pequeños. Si en algún momento notas que el clúster nuevo no puede controlar un porcentaje de tráfico, puedes revertirlo si reduces el porcentaje a 0%.
Plano de control de versiones canary frente a clúster de versiones canary
Existen dos estrategias de uso general para las migraciones de Istio a Anthos Service Mesh administrado:
- Migración del plano de control de detección de fallos: En esta estrategia, aprovisionas Anthos Service Mesh administrado en el mismo clúster en el que tienes instalado Istio.
- Migración de clústeres de versiones canary: En esta estrategia, creas un clúster nuevo y, luego, aprovisionas Anthos Service Mesh administrado.
En este instructivo, revisaremos la estrategia de migración de clústeres de la versión 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
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required 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 la plataforma.
Cloud Shell viene preinstalado con las herramientas de línea de comandos de Google Cloud CLI, kubectl y solactl. Gcloud CLI proporciona la CLI principal para Google Cloud.
Abre una sesión de Cloud Shell en la esquina superior derecha de esta página, haz clic en terminal 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 Istio y Kubernetes 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 Istio
Crea el clúster e instala Istio
En la sección, crearás un clúster que usa Istio. En la práctica, estos serían los clústeres que ya estás usando.
Reemplaza
PROJECT_ID
por el ID del proyecto y crea un clúster nuevo:gcloud container clusters create cluster-with-istio \ --project=PROJECT_ID \ --zone=us-central1-a \ --machine-type=e2-standard-2 --num-nodes=3
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-istio \ cluster-with-istio
Comprueba que se haya cambiado el nombre del contexto del clúster:
kubectl config get-contexts --output="name"
Instalar Istio en el clúster Para simplificar, instalarás el perfil predeterminado de Istio y la versión que coincida con la instalación de
istioctl
.istioctl install
Se le pedirá que escriba "y" y, luego, presione Intro.
El resultado es similar al siguiente:
This will install the Istio X.Y.Z default profile with ["Istio core" "Istiod" "Ingress gateways"] components into the cluster. Proceed? (y/N) ✔ Istio core installed ✔ Istiod installed ✔ Ingress gateways installed ✔ Installation complete Making this installation the default for injection and validation.
Implementa Online Boutique
Implementarás Online Boutique en un espacio de nombres independiente llamado
onlineboutique
. Crea el espacio de nombres:kubectl \ --context cluster-with-istio \ create namespace onlineboutique
Implementa los 12 servicios de Online Boutique, que incluyen un generador de cargas que imita el tráfico del usuario:
kubectl \ --namespace=onlineboutique \ --context=cluster-with-istio \ apply -f microservices-demo/release/kubernetes-manifests.yaml
En el paso anterior, también se implementó un servicio llamado
frontend-external
(de tipoLoadBalancer
), al que se le asigna una dirección IP pública. Sin embargo, solo quieres permitir la entrada pública a través de la implementación de la puerta de enlace de entrada de Istio. Borra el recurso de serviciofrontend-external
:kubectl \ --namespace=onlineboutique \ --context=cluster-with-istio \ delete service frontend-external
Implementa un recurso
Gateway
de Istio y un recursoVirtualService
de Istio para que el tráfico público acceda a Online Boutique:kubectl \ --namespace=onlineboutique \ --context=cluster-with-istio \ apply -f microservices-demo/istio-manifests/frontend-gateway.yaml
Obtén la dirección IP pública de la puerta de enlace de entrada de Istio:
kubectl \ --namespace istio-system \ --context=cluster-with-istio \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
Copia la dirección IP pública del servicio
istio-ingressgateway
y accede a ella a través de tu navegador web. Verás la app de ejemplo Online Boutique.
Configura el clúster nuevo con Anthos Service Mesh administrado
Crea el clúster y aprovisiona Anthos Service Mesh administrado
En esta sección, crearás el clúster al que migrarás. Aprovisionarás Anthos Service Mesh administrado y, luego, implementarás Online Boutique para replicar las implementaciones desde el clúster que usa Istio.
Almacena el número de tu proyecto en una variable de entorno:
export PROJECT_NUMBER=$(gcloud projects \ describe PROJECT_ID --format='get(projectNumber)')
Crea un clúster nuevo:
gcloud container clusters create cluster-with-managed-asm \ --project=PROJECT_ID --zone=us-central1-a \ --machine-type=e2-standard-4 --num-nodes=2 \ --workload-pool PROJECT_ID.svc.id.goog \ --labels mesh_id=proj-${PROJECT_NUMBER}
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-managed-asm \ cluster-with-managed-asm
Comprueba que se haya cambiado el nombre del contexto del clúster:
kubectl config get-contexts --output="name"
Habilita Anthos 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.
Registra el clúster en la flota del proyecto:
gcloud container fleet memberships register cluster-with-managed-asm-membership \ --gke-cluster=us-central1-a/cluster-with-managed-asm \ --enable-workload-identity \ --project PROJECT_ID
El resultado es similar al siguiente:
Waiting for membership to be created...done. Created a new membership [projects/your-project-id/locations/global/memberships/cluster-with-gke-membership] for the cluster [cluster-with-gke-membership] Generating the Connect Agent manifest... Deploying the Connect Agent on cluster [cluster-with-gke-membership] in namespace [gke-connect]... Deployed the Connect Agent on cluster [cluster-with-gke-membership] in namespace [gke-connect]. Finished registering the cluster [cluster-with-gke-membership] with the Fleet.
Habilita Anthos Service Mesh administrado en el clúster:
gcloud container fleet mesh update \ --management automatic \ --memberships cluster-with-managed-asm-membership \ --project PROJECT_ID
El resultado es similar al siguiente:
Waiting for Feature Service Mesh to be updated...done.
Verifica si se aprovisionó Anthos Service Mesh administrado para el clúster y si está listo para usarse:
gcloud container fleet mesh describe --project PROJECT_ID
Puede tomar unos 10 minutos que Anthos Service Mesh se aprovisione y esté listo para usarse en el clúster. Si ves
controlPlaneManagement.state: DISABLED
ocontrolPlaneManagement.state: PROVISIONING
, deberás volver a ejecutar el comando anterior cada algunos minutos hasta que veascontrolPlaneManagement.state: ACTIVE
.El resultado es similar al siguiente:
createTime: '2022-07-06T01:05:39.110120474Z' membershipSpecs: projects/123456789123/locations/global/memberships/cluster-with-managed-asm-membership: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/123456789123/locations/global/memberships/cluster-with-managed-asm-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 Anthos Service Mesh
Implementarás la puerta de enlace de entrada de Anthos Service Mesh en un espacio de nombres independiente llamado
asm-ingress
. Crea el espacio de nombres:kubectl \ --context cluster-with-managed-asm \ create namespace asm-ingress
Usa la etiqueta
istio.io/rev=asm-managed
para agregar el espacio de nombresasm-ingress
a la malla de servicios y habilitar la inserción automática del proxy de sidecar.kubectl \ --context cluster-with-managed-asm \ label namespace asm-ingress 'istio.io/rev=asm-managed'
Implementa la puerta de enlace de entrada de Anthos Service Mesh:
kubectl \ --context cluster-with-managed-asm \ --namespace=asm-ingress \ apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/asm-gateway-deployment-svc.yaml kubectl \ --context cluster-with-managed-asm \ --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
Implementarás Online Boutique en un espacio de nombres independiente llamado
onlineboutique
. Crea el espacio de nombres:kubectl \ --context cluster-with-managed-asm \ create namespace onlineboutique
Usa la etiqueta
istio.io/rev=asm-managed
para agregar el espacio de nombresonlineboutique
a la malla de servicios y habilitar la inserción automática del proxy de sidecar.kubectl \ --context cluster-with-managed-asm \ label namespace onlineboutique 'istio.io/rev=asm-managed'
Implementa los 12 servicios de Online Boutique, incluido el generador de cargas que imita el tráfico del usuario:
kubectl \ --context cluster-with-managed-asm \ --namespace=onlineboutique \ apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml kubectl \ --context cluster-with-managed-asm \ --namespace=onlineboutique \ apply -f anthos-service-mesh-samples/docs/shared/online-boutique/virtual-service.yaml
Obtén la dirección IP pública de la puerta de enlace de entrada de Anthos Service Mesh:
kubectl \ --context cluster-with-managed-asm \ --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
Copia la dirección IP pública del servicio
asm-ingressgateway
y accede a ella a través de tu navegador web. Verás la app de ejemplo Online Boutique. Usarás la dirección IP pública 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-managed-asm \ --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )
Prueba el clúster con Anthos Service Mesh mediante una implementación de versiones canary
En esta sección, configurarás el clúster con Istio para que el 50% del tráfico de usuarios a Online Boutique se transfiera a la instancia de Online Boutique en el clúster con Anthos Service Mesh administrado. Para lograrlo, implementa dos recursos de Istio en el clúster con Istio:
- Una ServiceEntry para indicarle a Istio sobre el extremo Online Boutique del clúster administrado de Anthos Service Mesh
- un VirtualService para indicarle a la puerta de enlace de entrada de Istio que divida el tráfico de 50 a 50.
Establece la dirección IP de la puerta de enlace de entrada del clúster de Anthos Service Mesh administrado 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
Implementa el
ServiceEntry
en el clúster con Istio:kubectl \ --context cluster-with-istio \ --namespace onlineboutique \ apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
Implementa el
VirtualService
en el clúster con Istio:kubectl \ --context cluster-with-istio \ --namespace onlineboutique \ apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/virtual-service.yaml
Visita la dirección IP de la puerta de enlace de entrada del clúster con Istio en tu navegador web:
kubectl \ --context cluster-with-istio \ --namespace istio-system \ get service
Actualiza la página principal de Online Boutique varias veces y verifica el pie de página cada vez. Ten en cuenta que el 50% de las solicitudes las maneja un Pod en el clúster con Anthos Service Mesh administrado.
Migra al clúster con Anthos Service Mesh administrado
En esta sección, se supone que eres propietario de un nombre de dominio y que tienes acceso a su configuración de DNS (servidor de nombres de dominio).
Agrega un registro A a la configuración de DNS para apuntar 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 Istio.
Para acceder a Online Boutique, visita el nombre de dominio en tu navegador web.
Minimiza el tiempo de actividad (TTL) del registro DNS para asegurarte de que puedas revertir con rapidez la entrada de DNS si necesitas hacerlo.
Configura el registro A de tu nombre de dominio con la dirección IP pública de la puerta de enlace de entrada del clúster con Anthos Service Mesh administrado.
Cuando la migración se complete de forma correcta, borra el clúster con Istio:
gcloud container clusters delete cluster-with-istio \ --zone=us-central1-a \ --project=PROJECT_ID
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borrar el proyecto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Borra recursos
Borra el clúster con Anthos Service Mesh administrado:
gcloud container clusters delete cluster-with-managed-asm \
--zone=us-central1-a \
--project=PROJECT_ID
¿Qué sigue?
- Obtén más información sobre Anthos Service Mesh administrado.
- Obtén información sobre las prácticas recomendadas de seguridad de Anthos Service Mesh.