Este tema describe cómo migrar un Nginx Ingress autogestionado a MSE Ingress mediante la herramienta de migración visual disponible en la consola de MSE.
Requisitos previos
Se desplegó un Nginx Ingress Controller en su clúster de Container Service.
Debe contar con una instancia de Cloud Native Gateway disponible. Si no tiene una, consulte Create an MSE Cloud Native Gateway.
Notas de uso
El proceso de migración no copia sus configuraciones de Ingress. En su lugar, permite que MSE Ingress reutilice dichas configuraciones al observar y analizar los cambios de sus recursos de Ingress existentes en tiempo real.
Durante la migración, tanto el Nginx Ingress Controller como MSE Ingress reflejan cualquier cambio que usted aplique a las configuraciones de Ingress.
Una vez finalizada la migración, no elimine ninguna configuración de Ingress que esté en uso. La migración solo habilita a MSE Ingress para observar y analizar las configuraciones de Ingress actuales y futuras.
Después de la migración, debe mantener las configuraciones de Ingress existentes y futuras asociadas con la IngressClass original. Por ejemplo, si un recurso de Ingress especificaba previamente
ingressClassName: nginxen su spec, debe continuar haciéndolo tras la migración.
Métodos de migración
Details
Flujo de trabajo de migración
Cloud Native Gateway proporciona una herramienta de migración a la nube que lo guía paso a paso para migrar sus configuraciones de enrutamiento y trasladar el tráfico.
Paso 1: Migrar las reglas de enrutamiento
Inicie sesión en la consola de MSE. En la barra de navegación superior, seleccione una región.
En el panel de navegación izquierdo, elija Cloud Native Gateway > Migration to Cloud.
En la página Migration to Cloud, haga clic en Add Task.
-
En el panel Create Migration Configuration, configure los parámetros.
Cloud Native Gateway observa todos los recursos de Ingress del clúster de contenedores seleccionado que estén asociados con la IngressClass de origen. A continuación, aplica sus configuraciones de nombre de dominio y de enrutamiento.
ImportanteLa migración no se permite si la instancia de Cloud Native Gateway de destino ya está asociada con este clúster de contenedores mediante una IngressClass diferente. Asegúrese de que la IngressClass especificada aquí coincida con la que ya está configurada para el clúster.
Parámetro
Descripción
Cloud-native Gateway
Seleccione la instancia de Cloud Native Gateway de destino para la migración. La versión de la puerta de enlace debe ser 1.2.22 o posterior.
Container Service ACK/ACK Serverless cluster
Seleccione el clúster de Container Service que contiene el Nginx Ingress que desea migrar. Asegúrese de que Cloud Native Gateway y el clúster de contenedores se encuentren en la misma VPC.
Source Ingress Class
Especifique la IngressClass asociada con los recursos de Ingress que desea migrar.
NotaSolo puede especificar una IngressClass.
Si deja este parámetro vacío, se ignora la IngressClass y la puerta de enlace observa todos los recursos de Ingress del clúster.
Description
Introduzca una descripción de hasta 64 caracteres.
-
Haga clic en Next.
A partir de este momento, Cloud Native Gateway observa automáticamente los cambios en todos los recursos de Ingress que se encuentran en el clúster de contenedores seleccionado y están asociados con la IngressClass de origen. Después, aplica las configuraciones de nombre de dominio y de enrutamiento de dichos recursos.
Suponga que tiene un Ingress llamado httpbin en el clúster de contenedores de origen.
-
En la consola de Cloud Native Gateway, verá que el Ingress del clúster de origen se sincroniza automáticamente con la puerta de enlace de destino, lo que crea las configuraciones de dominio y de enrutamiento correspondientes. La página de detalles de Routing Settings se muestra de la siguiente manera:
-
Asistente de configuración:
-
Agregar origen de servicio
Puede usar K8s, Nacos, Zookeeper, SAE, EDAS y Function Compute (FC) como orígenes de servicio. Es posible agregar un recurso existente de su VPC actual y luego seleccionar un servicio registrado a partir de él.
Botón: Add service source
-
Asociar servicio de backend
Distribuye las solicitudes hacia un servicio de backend. Este servicio se puede descubrir dinámicamente desde un origen de servicio o especificarse mediante una dirección o un nombre de dominio estático.
Botón: Associate backend service
-
Vincular nombre de dominio
Proporciona gestión multidominio. Al vincular un nombre de dominio, puede asociar protocolos, certificados y configuraciones de enrutamiento con distintos dominios.
Botón: Bind domain name
-
Crear ruta
Una ruta contiene reglas de coincidencia basadas en nombres de dominio, rutas, métodos, parámetros de solicitud y encabezados de solicitud. Cuando un usuario accede a una ruta, la solicitud se reenvía al servicio de backend correspondiente.
Botón: Create route
-
Columnas de la lista: Route name, Status, WAF protection, Source, Route condition, Associated domain name, Destination service type, Destination service y Actions.
-
Paso 2: Comprobar las rutas
Compruebe la compatibilidad de las anotaciones de Ingress observadas:
Si no hay anotaciones de Ingress incompatibles, continúe con el siguiente paso.
-
Si encuentra anotaciones de Ingress incompatibles, puede enviar un ticket para obtener una solución.
ImportantePuede ignorar la anotación
nginx.ingress.kubernetes.io/service-weightsi su valor es"". Esta anotación se agrega de forma predeterminada en versiones anteriores de la consola de Container Service y no tiene ningún efecto.Durante la migración, no elimine las anotaciones incompatibles que estén en uso. Estas anotaciones aún son analizadas por el Nginx Ingress Controller y afectan el tráfico de su negocio. Puede agregar anotaciones extendidas de MSE al recurso de Ingress para lograr la misma funcionalidad en MSE Ingress. Una vez que todo el tráfico haya migrado a MSE Ingress, podrá quitar las anotaciones incompatibles según sea necesario.
Paso 3: Seleccionar el método de traslado
Pruebas antes de trasladar el tráfico
Antes de trasladar el tráfico de producción, ejecute una prueba local. Modifique su archivo hosts local para resolver el nombre de dominio de negocio hacia el SLB de Cloud Native Gateway. Utilice una herramienta como curl o Postman para comprobar que todo el tráfico se comporta según lo esperado.
Seleccionar el método de traslado
Reutilizar el SLB de origen
Principio: el proceso agrega las instancias de nodo de Cloud Native Gateway al grupo de servidores de backend del SLB de origen. Durante la migración, el SLB distribuye el tráfico de negocio hacia Cloud Native Gateway según los pesos configurados. Una vez finalizada la migración, el SLB reenvía todo el tráfico a Cloud Native Gateway.
A continuación se describen los parámetros correspondientes.
Parámetro | Descripción |
ACK Cluster Namespace | Seleccione el namespace donde se ubica el Service de Kubernetes asociado con el SLB de Nginx Ingress. |
ACK Cluster SLB Service | Seleccione el nombre del Service de Kubernetes asociado con el SLB de Nginx Ingress. |
SLB ID | Haga clic en la instancia de SLB para confirmar que es el destino correcto para la migración. |
Ports and Backend Servers | Seleccione el puerto del listener y el protocolo de la puerta de enlace (HTTP/HTTPS) de la instancia de SLB de origen. El grupo de servidores virtuales de destino aparece automáticamente. Nota Asegúrese de seleccionar el puerto y el protocolo correctos para evitar la pérdida de tráfico. |
Resolución de DNS
Acceda al servicio de resolución de dominios de su proveedor de DNS y agregue asignaciones hacia la dirección del SLB de Cloud Native Gateway para todos los dominios involucrados en la migración de rutas. Se recomienda utilizar la resolución ponderada de DNS para trasladar el tráfico de forma gradual.
Paso 4: Trasladar el tráfico
Reutilizar el SLB de origen
Paso 1: Modificar el SLB
Cuando hace clic en Modify SLB, el sistema desvincula automáticamente la instancia de SLB de la administración de Container Service y cambia el algoritmo de programación del listener a Weighted Round Robin.
Este paso desvincula la instancia de SLB de la administración de Container Service. Después de la desvinculación, la instancia de SLB deja de rastrear los cambios de dirección IP de los Pods en el Nginx Ingress Controller. Continúe rápidamente con el siguiente paso para modificar las anotaciones y volver a asociar el Service de Kubernetes con la instancia de SLB.
Paso 2: Sobrescribir las anotaciones del servicio
Una vez completado el paso 1, vaya a la consola de Container Service. Elimine manualmente todas las anotaciones existentes del Service de Kubernetes que seleccionó en el paso Switch Traffic. Luego, copie las anotaciones generadas automáticamente en la página Traffic Switchover y agréguelas al Service de Kubernetes de destino. Este paso reconfigura el Service de Kubernetes original para que reutilice la instancia de SLB. Después de la modificación, haga clic en Precheck. Si la comprobación es exitosa, podrá continuar con el siguiente paso.
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: lb-bp1lc0huzf0o1ks333yo1
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: '100'
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: 'rsp-bp1uybv6iy50i:80,rsp-bp10s0ndrfvdt:443'
creationTimestamp: '2023-11-29T07:14:40Z'
finalizers:
- service.k8s.alibaba/resources
labels:
app: nginx-ingress-lb
service.beta.kubernetes.io/hash: 39a51bd97b88f6eaf232da33434ce2fe44ae094b7b4d2b9bb9126eb7
service.k8s.alibaba/loadbalancer-id: lb-bp1lc0huzf0o1ks333yo1
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
'f:metadata':
'f:annotations':
.: {}
'f:kubectl.kubernetes.io/last-applied-configuration': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id': {}
'f:labels':
.: {}
'f:app': {}
Si los pods de la aplicación dentro del mismo clúster de contenedores acceden a la puerta de enlace de Nginx Ingress, también debe agregar la anotación service.beta.kubernetes.io/alibaba-cloud-loadbalancer-hostname: mse-ingress-migration al Service. Antes de agregarla, asegúrese de que el control de acceso por IP esté deshabilitado para la instancia de SLB asociada con el Service. Esta anotación obliga a los pods de la aplicación a acceder a la puerta de enlace de Nginx Ingress a través del SLB. De esta manera, evita que Kube Proxy optimice el tráfico para omitir el SLB y acceder directamente al pod de Nginx Ingress.
Paso 3: Traslado ponderado del tráfico
Establezca el peso de tráfico para la instancia de Cloud Native Gateway. Defina un valor de 1 a 100 según las necesidades de su negocio. Se recomienda un valor inicial entre 1 y 10.
Este valor representa la suma de los pesos de todos los nodos de Cloud Native Gateway. La instancia de SLB distribuye el tráfico según la proporción de peso entre los nodos de Cloud Native Gateway y los nodos de Nginx Ingress dentro del grupo de servidores virtuales. El peso total de los nodos de Nginx Ingress es 100 de forma predeterminada. Por lo tanto, si establece el peso de Cloud Native Gateway en 100, recibirá la mitad del tráfico. Del mismo modo, si define el peso en 50, recibirá un tercio del tráfico.
-
Durante la migración, puede monitorear las métricas de la puerta de enlace en el panel de monitoreo de Cloud Native Gateway. Así comprobará el estado de la puerta de enlace y se asegurará de que las métricas del negocio permanezcan estables.
Si los resultados son los esperados, aumente el peso gradualmente. Espere como mínimo 3 minutos entre cada cambio de peso, ya que el backend aplica la configuración de forma asíncrona.
Si los resultados no son los esperados, establezca el peso en 0 para detener la migración.
En la consola de Container Service, puede reducir el valor de la anotación
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weightdel Service de Kubernetes seleccionado para reusing the original cluster's SLB. Con esto aumentará indirectamente el peso de Cloud Native Gateway. En concreto, cuando el valor de esta anotación es 0, todo el tráfico se dirige a Cloud Native Gateway.Dado que SLB es un load balancer de capa 4, controla el tráfico a nivel de conexión. El valor de peso no permite controlar con precisión la proporción de distribución a nivel de solicitud.
Si la tasa de éxito disminuye después de trasladar el tráfico, puede ejecutar un fast rollback al establecer este peso en 0.
Si necesita permanecer en estado de migración durante un periodo prolongado y ajustar los pesos de tráfico entre Nginx Ingress y MSE Ingress en cualquier momento, manténgase en este paso. Una vez que compruebe que el tráfico se comporta según lo esperado y ya no requiera revertir todo el tráfico hacia Nginx Ingress, haga clic en Complete Traffic Verification para continuar.
Después de hacer clic en Complete Traffic Verification, ya no podrá modificar los pesos.
Paso 4: Completar el cambio de tráfico
En la consola de Container Service, establezca en 0 el valor de la anotación service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight para el Service de K8s que seleccionó en Step 3: Select a traffic shifting method, o bien elimine el recurso de Service. A continuación, los nodos del Nginx Ingress Controller se quitan automáticamente del SLB y todo el tráfico del SLB se redirige a Cloud Native Gateway. Haga clic en Complete Migration para finalizar la tarea de migración.
Resolución de DNS
Acceda al servicio de resolución de dominios de su proveedor de DNS y agregue asignaciones hacia la dirección del SLB de Cloud Native Gateway para todos los dominios involucrados en la migración de rutas. Se recomienda utilizar la resolución ponderada de DNS para trasladar el tráfico de forma gradual.
Rollback rápido
Si surgen problemas inesperados durante la migración del tráfico, utilice los siguientes métodos para ejecutar un rollback rápido y restaurar el tráfico hacia el Nginx Ingress Controller.
Reutilizar el SLB del clúster de origen: establezca el peso en 0. Esto detiene la migración.
Usar DNS para resolver hacia el SLB de Cloud Native Gateway: en su proveedor de DNS, quite la dirección del SLB de Cloud Native Gateway para todos los dominios de negocio.
Paso 5: Finalizar la migración
Reutilizar el SLB de origen
Si utilizó el método de traslado de tráfico por SLB, asegúrese de que el tráfico se haya trasladado por completo en todas las instancias de SLB correspondientes. Una vez finalizado el traslado para todas las instancias, podrá eliminar el Service de Kubernetes y el Nginx Ingress Controller según sea necesario.
Resolución de DNS
Si utilizó el método de traslado de tráfico por DNS y las direcciones IP de todos sus dominios de negocio ahora resuelven hacia la lista de direcciones del SLB de la puerta de enlace de MSE, podrá eliminar el Service de Kubernetes y el Nginx Ingress Controller según sea necesario.
Solución de problemas
Bad request: mse.backend.gw.MIGRATE_INGRESS_CLASS_CONFLICT
Este error indica que su puerta de enlace ya está asociada con el clúster de Container Service y tiene habilitada la observación de Ingress, pero la IngressClass especificada para esta migración no coincide con la configuración de observación original. Asegúrese de que las configuraciones de IngressClass sean consistentes.
Si necesita modificar la IngressClass configurada previamente, elija uno de los siguientes métodos según su entorno:
Si gestiona MSE Ingress mediante un MseIngressConfig, consulte Access Container Service and Container Compute Service by using MSE Ingress para modificarlo.
Si no gestiona MSE Ingress mediante un MseIngressConfig, vaya a la consola de la puerta de enlace, busque el origen de servicio y modifique las opciones de observación de Ingress para el clúster de contenedores correspondiente.
Bad request: mse.backend.gw.MIGRATE_SERVICE_ANNOTATION_NOT_MATCH [annotation is not expected]
Este error indica que las anotaciones de su Service de Kubernetes no se han actualizado a los valores obligatorios.
Bad request: mse.backend.gw.MIGRATE_SERVICE_NOT_MATCH [weight hasn't been 0 or service hasn't been deleted]
Esto indica que el valor de la anotación service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight del Service de K8s no se ha establecido en 0, o que el Service de K8s no se ha eliminado. En la consola de Container Service, establezca en 0 el valor de la anotación service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight o elimine el Service de K8s.

