En este instructivo, se explica un caso de uso común: el lanzamiento de una implementación canary con Cloud Service Mesh a través de las APIs de Istio.
¿Qué es una implementación de versiones canary?
Una implementación de versiones canary enruta un pequeño porcentaje del tráfico a una nueva versión de un microservicio. Luego, aumenta gradualmente ese porcentaje mientras se elimina y retira la versión anterior. Si algo sale mal durante este proceso, se puede volver a cambiar el tráfico a la versión anterior. Con Cloud Service Mesh, puedes enrutar el tráfico para garantizar que los servicios nuevos se introduzcan de forma segura.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
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
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un proyecto.
Aprovisiona la malla de servicios de Cloud en un clúster de GKE o en otro clúster de Kubernetes compatible.
Clone el repositorio:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples/docs/canary-service
Implementa Online Boutique
Establece el contexto actual de
kubectl
en el clúster en el que planeas implementar Online Boutique. El comando depende de si aprovisionaste Cloud Service Mesh en un clúster de GKE o en un clúster de Kubernetes fuera de GKE:GKE en Google Cloud
gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
GKE fuera de Google Cloud
kubectl config use-context CLUSTER_NAME
Crea el espacio de nombres para la aplicación de muestra y la puerta de enlace de entrada:
kubectl create namespace onlineboutique
Etiqueta el espacio de nombres
onlineboutique
para insertar de forma automática los proxies de Envoy. Sigue los pasos sobre cómo habilitar la inserción automática de sidecar.Implementa la app de ejemplo. Para este instructivo, implementarás Online Boutique una app de demo de microservicios.
kubectl apply \ -n onlineboutique \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/shared/online-boutique/kubernetes-manifests.yaml
Para agregar una etiqueta
version=v1
a la implementaciónproductcatalog
, ejecuta el siguiente comando:kubectl patch deployments/productcatalogservice -p '{"spec":{"template":{"metadata":{"labels":{"version":"v1"}}}}}' \ -n onlineboutique
Visualiza los servicios que implementaste:
kubectl get pods -n onlineboutique
Resultado esperado:
NAME READY STATUS RESTARTS AGE adservice-85598d856b-m84m6 2/2 Running 0 2m7s cartservice-c77f6b866-m67vd 2/2 Running 0 2m8s checkoutservice-654c47f4b6-hqtqr 2/2 Running 0 2m10s currencyservice-59bc889674-jhk8z 2/2 Running 0 2m8s emailservice-5b9fff7cb8-8nqwz 2/2 Running 0 2m10s frontend-77b88cc7cb-mr4rp 2/2 Running 0 2m9s loadgenerator-6958f5bc8b-55q7w 2/2 Running 0 2m8s paymentservice-68dd9755bb-2jmb7 2/2 Running 0 2m9s productcatalogservice-84f95c95ff-c5kl6 2/2 Running 0 114s recommendationservice-64dc9dfbc8-xfs2t 2/2 Running 0 2m9s redis-cart-5b569cd47-cc2qd 2/2 Running 0 2m7s shippingservice-5488d5b6cb-lfhtt 2/2 Running 0 2m7s
Un
2/2
en la columnaREADY
indica que un Pod está en funcionamiento con un Envoy. proxy insertado correctamente.Implementa tu
VirtualService
yDestinationRule
para la v1 deproductcatalog
:kubectl apply -f destination-vs-v1.yaml -n onlineboutique
Ten en cuenta que solo
v1
está presente en los recursos.Visita la aplicación en tu navegador con la dirección IP externa de tu puerta de enlace de entrada:
kubectl get services -n GATEWAY_NAMESPACE
En la siguiente sección, se explora la IU de Cloud Service Mesh y se muestra cómo puedes ver tus métricas.
Ver tus servicios en la consola de Google Cloud
En la consola de Google Cloud, ve a la página Servicios de la edición empresarial de Google Kubernetes Engine (GKE).
Ve a Servicios de la edición Enterprise de Google Kubernetes Engine (GKE)
De forma predeterminada, los servicios se ven en la vista Lista.
La descripción general de la tabla te permite observar todos tus servicios y las métricas importantes con facilidad.
En la esquina superior derecha, haz clic en Topología. Aquí puedes ver tus servicios y su interacción entre sí.
Puedes expandir Servicios y ver las Solicitudes por segundo de cada uno de tus servicios si colocas el cursor sobre ellos.
Regresa a la Vista de tabla.
En la Tabla de servicios, selecciona
productcatalogservice
. Esto te llevará a una descripción general de tu servicio.En el lado izquierdo de la pantalla, haz clic en Tráfico.
Asegúrate de que el 100% del tráfico entrante a
productcatalogservice
vaya al servicio de la carga de trabajo.
En la siguiente sección, se explica cómo crear una v2 del servicio productcatalog
.
Implementa la v2 de un servicio
En este instructivo,
productcatalogservice-v2
agrega una latencia de 3 segundos a las solicitudes con el campoEXTRA_LATENCY
. Esto simula un en la versión nueva del servicio.Aplica este recurso al espacio de nombres
onlineboutique
.kubectl apply -f productcatalog-v2.yaml -n onlineboutique
Verifica los Pods de tu aplicación.
kubectl get pods -n onlineboutique
Resultado esperado:
NAME READY STATUS RESTARTS AGE adservice-85598d856b-8wqfd 2/2 Running 0 25h cartservice-c77f6b866-7jwcr 2/2 Running 0 25h checkoutservice-654c47f4b6-n8c6x 2/2 Running 0 25h currencyservice-59bc889674-l5xw2 2/2 Running 0 25h emailservice-5b9fff7cb8-jjr89 2/2 Running 0 25h frontend-77b88cc7cb-bwtk4 2/2 Running 0 25h loadgenerator-6958f5bc8b-lqmnw 2/2 Running 0 25h paymentservice-68dd9755bb-dckrj 2/2 Running 0 25h productcatalogservice-84f95c95ff-ddhjv 2/2 Running 0 25h productcatalogservice-v2-6df4cf5475-9lwjb 2/2 Running 0 8s recommendationservice-64dc9dfbc8-7s7cx 2/2 Running 0 25h redis-cart-5b569cd47-vw7lw 2/2 Running 0 25h shippingservice-5488d5b6cb-dj5gd 2/2 Running 0 25h
Ten en cuenta que ahora hay dos
productcatalogservices
enumerados.Usa
DestinationRule
para especificar los subconjuntos de un servicio. En este caso, hay un subconjunto para la v1 y, luego, un subconjunto independiente para la v2 deproductcatalogservice
.Observa el campo
labels
. Las versiones deproductcatalogservice
se distinguen después de queVirtualService
enruta el tráfico.Aplica
DestinationRule
:kubectl apply -f destination-v1-v2.yaml -n onlineboutique
Divide el tráfico entre v1 y v2
Usa
VirtualService
para definir un pequeño porcentaje del tráfico que se dirigirá a la v2 deproductcatalogservice
.El campo del subconjunto indica la versión, y el campo de peso indica la división porcentual del tráfico. El 75% del tráfico se dirige a v1 de productcatalog y el 25% a v2.
Aplica
VirtualService
:kubectl apply -f vs-split-traffic.yaml -n onlineboutique
Si visitas la EXTERNAL_IP
de la entrada del clúster, deberías notar que, periódicamente, el frontend es más lento para cargar.
En la siguiente sección, explorarás la división del tráfico en la consola de Google Cloud.
Observa la división del tráfico en la consola de Google Cloud
Regresa a la consola de Google Cloud y ve a la página de servicios de GKE Enterprise. Ir a Servicios de GKE Enterprise
En la esquina superior derecha, haz clic en Topología.
Expande la carga de trabajo
productcatalogservice
y observa las implementaciones deproductcatalogservice
yproductcatalogservice-v2
.Regresa a la Vista de tabla.
Haz clic en
productcatalogservice
en la tabla de servicios.Vuelve a Tráfico en la barra de navegación izquierda.
Ten en cuenta que el tráfico entrante se divide entre v1 y v2 según el porcentaje especificado en el archivo
VirtualService
y que hay 2 cargas de trabajo del servicio productcatalog.En el lado derecho de la página, verás Solicitudes, Tasa de error y Métricas de latencia. Con Cloud Service Mesh, cada servicio tiene estas métricas descritas para proporcionarte métricas de observabilidad.
Lanzar o revertir a una versión
Después de observar las métricas durante una implementación de versiones canary, puedes completar el
lanzar la nueva versión del servicio o revertirla a la versión original
mediante el uso del recurso VirtualService
Lanzar
Una vez que estés conforme con el comportamiento de un servicio v2, puedes aumentar de forma gradual el porcentaje de tráfico dirigido al servicio v2. Con el tiempo, el tráfico se puede dirigir en un 100% al nuevo servicio en el recurso VirtualService que creó anteriormente quitando la división del tráfico de ese recurso.
Para dirigir todo el tráfico a la v2 de productcatalogservice
, haz lo siguiente:
kubectl apply -f vs-v2.yaml -n onlineboutique
Revertir
Si necesitas revertir al servicio v1, aplica destination-vs-v1.yaml
de antes. Esto dirige el tráfico solo a la v1 de productcatalogservice
.
Para dirigir todo el tráfico a la v1 de productcatalogservice
, haz lo siguiente:
kubectl apply -f vs-v1.yaml -n onlineboutique
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.
Para evitar que se apliquen cargos continuos a tu cuenta de Google Cloud por los recursos que se usaron en este instructivo, puedes borrar el proyecto o borrar los recursos individuales.
Borra el proyecto
En Cloud Shell, borra el proyecto:
gcloud projects delete PROJECT_ID
Borra recursos
Si deseas evitar cargos adicionales, borra el clúster:
gcloud container clusters delete CLUSTER_NAME \
--project=PROJECT_ID \
--zone=CLUSTER_LOCATION
Si registraste tu clúster con la flota usando gcloud container fleet memberships
(en lugar de --enable-fleet
o --fleet-project
durante la creación del clúster), quita la membresía inactiva:
gcloud container fleet memberships delete MEMBERSHIP \
--project=PROJECT_ID
Si deseas conservar el clúster configurado para Cloud Service Mesh, pero quitar la muestra de Online Boutique, haz lo siguiente:
Borra los espacios de nombres de la aplicación:
kubectl delete -f namespace onlineboutique
Resultado esperado:
namespace "onlineboutique" deleted
Borra las entradas de servicio:
kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/istio-manifests/frontend.yaml -n onlineboutique kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/istio-manifests/frontend-gateway.yaml -n onlineboutique
Resultado esperado:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
¿Qué sigue?
- Para obtener una guía general sobre cómo configurar las políticas de
PeerAuthentication
, consulta Configura la seguridad de transporte.