Migra de Istio 1.11 o posterior a Cloud Service Mesh
En este instructivo, se muestra cómo migrar una aplicación de un clúster de Google Kubernetes Engine (GKE) que usa Istio a un clúster nuevo que usa Cloud Service Mesh administrado, la malla de servicios completamente administrada y compatible con Istio de Google.
En este instructivo, harás lo siguiente:
- Crea un clúster nuevo de Google Kubernetes Engine y, luego, instala 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 de Online Boutique en el clúster con Istio.
- Crea otro clúster de Google Kubernetes Engine en el mismo Google Cloud proyecto.
- Habilita Cloud Service Mesh administrado en el segundo clúster y, luego, implementa la puerta de enlace de entrada de Cloud Service Mesh.
- Implementa Online Boutique en el clúster con Cloud Service Mesh para replicar la implementación del clúster con Istio.
- Traslada el 50% del tráfico de usuarios del clúster con Istio al clúster con Cloud Service Mesh mediante las capacidades de división de tráfico de Istio en el clúster con Istio.
- Completa la migración de Istio a Cloud Service Mesh dirigiendo la entrada del sistema de nombres de dominio (DNS) del clúster con Istio al clúster con Cloud 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 lanzarla a todos los usuarios. Implica aumentar de forma incremental el porcentaje de tráfico que se envía a la versión nueva. En este instructivo, configurarás un clúster nuevo con Cloud Service Mesh administrado y trasladarás de forma incremental el tráfico de usuarios a él. Comenzarás dirigiendo el 0% del tráfico de usuarios al clúster nuevo, luego el 50% y, por último, el 100%. En la 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 situación reduciendo el porcentaje al 0%.
Plano de control de Canary en comparación con el clúster de Canary
Existen dos estrategias de uso común para las migraciones de Istio 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 está instalado Istio.
- 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, recorrerás 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
- Accede a tu Google Cloud cuenta. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the required APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the required APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
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 Google Cloud recursos.
Cloud Shell ya viene instalado en el Google Cloud CLI, kubectl y las herramientas de línea de comandos de istioctl. La gcloud CLI proporciona la CLI principal para Google Cloud.
Para abrir 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 Kubernetes y de 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 Istio
Crea el clúster y, luego, instala Istio
En la sección, crearás tu clúster que usa Istio. En la práctica, este sería el clúster o los clústeres que ya estás usando.
Reemplaza
PROJECT_IDpor el ID de tu 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=3Cambia 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-istioVerifica que se haya cambiado el nombre del contexto del clúster:
kubectl config get-contexts --output="name"Instala Istio en el clúster. Para simplificar, instalarás el perfil predeterminado de Istio y la versión que coincida con tu
istioctlinstalación.istioctl installSe te pedirá que escribas “y” y, luego, presiones 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 onlineboutiqueImplementa los 12 servicios de Online Boutique, que incluyen un generador de carga que imita el tráfico de usuarios:
kubectl \ --namespace=onlineboutique \ --context=cluster-with-istio \ apply -f microservices-demo/release/kubernetes-manifests.yamlEn el paso anterior, también se implementó un servicio llamado
frontend-external(de tipoLoadBalancer) al que se le asigna una dirección IP externa. Sin embargo, solo deseas 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-externalImplementa un recurso
Gatewayde Istio y un recursoVirtualServicede 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.yamlObtén la dirección IP externa 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 externa del servicio
istio-ingressgatewayy, luego, accede a ella a través de tu navegador web. Verás la app de muestra 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 Istio.
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.googCambia 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-csmVerifica que se haya cambiado el nombre del contexto del clúster:
kubectl config get-contexts --output="name"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_IDEl 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-csm-membership \ --gke-cluster=us-central1-a/cluster-with-csm \ --enable-workload-identity \ --project PROJECT_IDEl resultado es similar al siguiente:
Waiting for membership to be created...done. Finished registering to the Fleet.Habilita Cloud Service Mesh administrado en el clúster:
gcloud container fleet mesh update \ --management automatic \ --memberships cluster-with-csm-membership \ --project PROJECT_IDEl resultado es similar al siguiente:
Waiting for Feature Service Mesh to be updated...done.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_IDPuede tomar unos 10 minutos que Cloud Service Mesh se aprovisione y esté listo para usarse en el clúster. Si ves
controlPlaneManagement.state: DISABLEDocontrolPlaneManagement.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-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
Implementarás la puerta de enlace de entrada de Cloud Service Mesh en un espacio de nombres independiente llamado
asm-ingress. Crea el espacio de nombres:kubectl \ --context cluster-with-csm \ create namespace asm-ingressUsa la etiqueta
istio.io/rev=asm-managedpara agregar el espacio de nombresasm-ingressa 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'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.yamlEl 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-csm \ create namespace onlineboutiqueUsa la etiqueta
istio.io/rev=asm-managedpara agregar el espacio de nombresonlineboutiquea 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'Implementa los 12 servicios de Online Boutique, incluido el generador de carga que imita el tráfico de 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.yamlObté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}'Copia la dirección IP externa del servicio
asm-ingressgatewayy accede a ella a través de tu navegador web. Verás la app de muestra 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 Istio de modo que el 50% del tráfico de usuarios a Online Boutique se traslade a la instancia de Online Boutique en el clúster con Cloud Service Mesh administrado. Para lograr esto, implementa dos recursos de Istio en el clúster con Istio:
- un ServiceEntry para informarle a Istio sobre el extremo de Online Boutique del clúster de Cloud Service Mesh administrado
- un VirtualService para indicarle a la puerta de enlace de entrada de Istio que divida el tráfico 50-50
Configura la dirección IP de la puerta de enlace de entrada del clúster de Cloud 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.yamlImplementa el
ServiceEntryen 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.yamlImplementa el
VirtualServiceen 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.yamlVisita 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 serviceActualiza 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 se controlan con un Pod en el clúster con Cloud Service Mesh administrado.
Migra al clúster con Cloud Service Mesh administrado
En esta sección, se supone que tienes un nombre de dominio y acceso a su configuración de DNS (servidor de nombres de dominio).
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 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 poder revertir rápidamente la entrada DNS si necesitas revertir la situación.
Configura 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.
Cuando la migración se realice correctamente, 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 Google Cloud cuenta 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
- En la Google Cloud consola, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que tú quieres borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.
Borra 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?
- Obtén información sobre Cloud Service Mesh administrado.
- Obtén información sobre las prácticas recomendadas de seguridad de Cloud Service Mesh.