Un canary release estándar valida únicamente el servicio que se despliega, pero no verifica cómo interactúa dicho servicio con sus dependencias anteriores y posteriores. Cuando el servicio A llama al servicio B, y este a su vez llama al servicio C, liberar una versión canary solo de A deja sin probar la ruta completa de la solicitud.
Los canary releases de extremo a extremo resuelven este problema mediante la creación de carriles de tráfico. Un carril de tráfico etiqueta las solicitudes en el ingress y propaga esa etiqueta a través de cada servicio en la cadena de llamadas. Cada servicio comprueba la etiqueta y enruta la solicitud a su versión canary si existe alguna. Si un servicio no tiene desplegada una versión canary, reenvía la solicitud a su versión base, pero conserva la etiqueta para que el siguiente servicio posterior continúe el enrutamiento correcto. El resultado es que el tráfico canary permanece aislado desde el ingress hasta el último servicio posterior, lo que permite validar cambios en varios servicios de forma conjunta antes de promoverlos a producción.
Esta guía integra Kruise Rollouts con Microservices Governance de Microservices Engine (MSE) en un clúster de Container Service for Kubernetes (ACK). Al completar estos pasos, las solicitudes etiquetadas fluirán por las versiones canary de múltiples servicios, mientras que el tráfico de producción permanecerá intacto.

Funcionamiento de Kruise Rollouts
Kruise Rollouts es el componente de entrega progresiva de OpenKruise. Permite realizar canary releases, despliegues blue-green y pruebas A/B. A diferencia de otras herramientas que exigen reemplazar los tipos de carga de trabajo, Kruise Rollouts funciona como un componente paralelo: sus Deployments, StatefulSets o CloneSets existentes permanecen sin cambios, y Kruise Rollouts orquesta el proceso canary junto a ellos. El proceso de lanzamiento se puede automatizar por lotes y pausar según las métricas de Managed Service for Prometheus. Solo necesita crear un recurso Rollouts en su clúster ACK para automatizar los lanzamientos y actualizaciones de aplicaciones. Kruise Rollouts admite una integración perfecta con Helm y plataformas PaaS a bajo costo.
Ciclo de vida del canary release
Cuando cambia la imagen de un Deployment, Kruise Rollouts sigue esta secuencia:
Pausa la actualización continua nativa del Deployment.
Crea pods canary con la nueva versión de la imagen.
Configura el enrutamiento de tráfico para que las solicitudes coincidentes lleguen a los pods canary.
Espera la aprobación manual (o comprobaciones automáticas de métricas).
Tras la aprobación, promueve la versión canary a todos los pods mediante una actualización continua.
Elimina los pods canary y restaura el enrutamiento de tráfico nativo.

Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un clúster ACK que ejecute Kubernetes 1.19 o posterior. Para más información, consulte Create an ACK managed cluster
kubectl-kruise instalado. Para más información, consulte kubectl-kruise
Microservices Governance activado. Para más información, consulte Activate Microservices Governance
Paso 1: Instalación de componentes obligatorios
Instalación de ack-kruise
Inicie sesión en la ACK console. En el panel de navegación izquierdo, haga clic en Clusters.
En la página Clusters, localice su clúster objetivo y haga clic en su nombre. En el panel de navegación izquierdo, elija Operations > Add-ons.
En la página Manage Components, haga clic en la pestaña Manage Applications.
Localice la tarjeta ack-kruise y haga clic en Install.
En el cuadro de diálogo de confirmación, haga clic en OK.
Instalación del MSE Ingress Controller
Cree un recurso MseIngressConfig y un recurso IngressClass para habilitar el ingress basado en MSE en su clúster. Para obtener instrucciones detalladas, consulte Use MSE Ingresses to access applications in ACK clusters.
Habilitación de Microservices Governance
Habilite Microservices Governance para sus aplicaciones objetivo. Para obtener instrucciones detalladas, consulte Enable Microservices Governance for microservice applications in an ACK cluster.
Paso 2: Despliegue de las aplicaciones de demostración
Esta demostración utiliza tres aplicaciones Spring Cloud (A, B y C) que forman una cadena de llamadas: A llama a B, y B llama a C. Un servidor Nacos gestiona el descubrimiento de servicios y una instancia MySQL proporciona el almacenamiento de datos.
Creación de los recursos de la aplicación
-
Cree un archivo llamado
mse-demo.yamlcon el siguiente contenido: -
Despliegue las aplicaciones:
kubectl apply -f mse-demo.yaml
Creación del recurso Ingress
-
Cree un archivo llamado
mse-ingress.yamlcon el siguiente contenido: -
Aplique la configuración del Ingress:
kubectl apply -f mse-ingress.yaml
Verificación del despliegue
-
Obtenga la dirección IP externa del Ingress: Salida esperada:
kubectl get ingressNAME CLASS HOSTS ADDRESS PORTS AGE spring-cloud-a <none> * EXTERNAL_IP 80 12m -
Envíe una solicitud de prueba. Reemplace
<EXTERNAL_IP>con la dirección IP obtenida en la salida anterior: Salida esperada: Esta salida confirma que la cadena de llamadas A -> B -> C funciona correctamente y que los tres servicios ejecutan la versión base.curl http://<EXTERNAL_IP>/aA[192.168.42.115][config=base] -> B[192.168.42.118] -> C[192.168.42.101]
Paso 3: Configuración de canary releases de extremo a extremo
Definición de los recursos Rollout y TrafficRouting
En esta demostración, el canary release se realiza en tres lotes:
Se realizan pruebas A/B. Las solicitudes que contienen
header[User-Agent]=xiaomingse reenvían a la versión canary. Las demás solicitudes se dirigen a la versión base.La mitad de los pods ejecutan la versión canary y la mitad de las solicitudes se reenvían a dicha versión.
Todos los pods ejecutan la versión canary y todas las solicitudes se reenvían a dicha versión.
Cree y aplique los recursos Rollout de la siguiente manera:
-
Cree un archivo llamado
rollout.yamlcon el siguiente contenido:Qué ocurre al aplicar esta configuración:
Cada recurso Rollout monitorea un Deployment. Cuando cambia la imagen del Deployment, Kruise Rollouts realiza lo siguiente:
Pausa la actualización continua nativa.
Crea un pod canary (
replicas: 1) con la nueva versión de la imagen.-
Aplica las etiquetas
patchPodTemplateMetadataal pod canary:alicloud.service.tag: gray: indica a Microservices Governance de MSE que reconozca este pod como parte del grupo canary (gray).opensergo.io/canary-gray: gray: habilita el enrutamiento de carriles de tráfico compatible con OpenSergo a lo largo de la cadena de llamadas.
Pausa el proceso y espera la aprobación manual antes de promover la versión.
El recurso TrafficRouting define las reglas de división de tráfico:
Las solicitudes con el encabezado
User-Agent: xiaomingcoinciden con la regla canary.El modificador
requestHeaderModifierinyecta un encabezadox-mse-tag: grayen las solicitudes coincidentes. MSE propaga este encabezado por toda la cadena de llamadas, lo que permite el enrutamiento canary de extremo a extremo. Cada servicio de la cadena comprueba este encabezado y enruta la solicitud a su pod canary si existe alguno.
-
Despliegue los recursos Rollout:
kubectl apply -f rollout.yaml -
Compruebe el estado del Rollout: Si la salida muestra
STATUS=Healthy, los recursos Rollout están listos.kubectl get rollout
Activación de un canary release
Kruise Rollouts requiere una configuración única. Una vez desplegados los recursos Rollout, active un canary release actualizando la imagen de su Deployment; no se necesita configuración adicional de Rollout. Además de kubectl, puede usar Helm o Vela para desplegar los deployments en su clúster.
-
En
mse-demo.yaml, actualice las versiones de imagen para spring-cloud-a y spring-cloud-c demse-2.0.0amse-2.0.1: La aplicación B permanece enmse-2.0.0. Dado que B no tiene versión canary, las solicitudes enrutadas al carril canary pasan por la versión base de B, pero continúan hacia la versión canary de C. Esto demuestra el funcionamiento del carril de tráfico de extremo a extremo: incluso cuando un servicio intermedio en la cadena carece de despliegue canary, la etiqueta canary se conserva y los servicios posteriores siguen enrutando correctamente.# In the spring-cloud-a Deployment image: registry.cn-hangzhou.aliyuncs.com/mse-demo-hz/spring-cloud-a:mse-2.0.1 # In the spring-cloud-c Deployment image: registry.cn-hangzhou.aliyuncs.com/mse-demo-hz/spring-cloud-c:mse-2.0.1 -
Aplique los Deployments actualizados:
kubectl apply -f mse-demo.yaml -
Revise el progreso del Rollout: Salida esperada:
Campo
Valor
Significado
STATUSProgressingEl canary release está en curso
CANARY_STATEStepPausedEl lote canary está desplegado y el rollout espera aprobación manual
kubectl get rollouts rollout-a -n default kubectl get rollouts rollout-c -n defaultNAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE rollout-a Progressing 1 StepPaused Rollout is in step(1/1), and you need manually confirm to enter the next step 41m rollout-c Progressing 1 StepPaused Rollout is in step(1/1), and you need manually confirm to enter the next step 41m
Verificación y promoción de la versión canary
-
Envíe una solicitud de prueba canary incluyendo el encabezado
User-Agent: xiaoming: El tráfico canary fluye a través de las versiones canary de A y C, mientras que B utiliza su versión base. Compruebe el comportamiento mediante los registros de la aplicación y las métricas de monitoreo.curl http://<EXTERNAL_IP>/a -H "User-Agent: xiaoming" -
Tras confirmar que la versión canary funciona según lo esperado, apruebe el rollout para promoverla a producción. Ejecute el siguiente comando para cada Rollout que tenga una versión canary desplegada (en esta demostración,
rollout-ayrollout-c). Reemplace<rollouts-demo>con el nombre del recurso Rollouts:rollout.rollouts.kruise.io/<rollouts-demo> approved
Reversión de un canary release
Si la versión canary no cumple con las expectativas, revierta las versiones de imagen en mse-demo.yaml a sus valores originales y vuelva a aplicarlas:
kubectl apply -f mse-demo.yaml
No es necesario modificar los recursos Rollout. Kruise Rollouts detecta el cambio en el Deployment y gestiona la reversión automáticamente.
La función de canary release de extremo a extremo de Microservices Governance proporciona carriles que facilitan enormemente la verificación durante las pruebas y los lanzamientos. Puede utilizar Microservices Governance junto con Kruise Rollouts para mejorar significativamente la estabilidad de las aplicaciones en línea dentro de un proceso DevOps.