Durante las actualizaciones de servicios, utilice versiones canary para mantener la estabilidad del sistema. ALB Ingress admite anotaciones canary por encabezado, cookie o peso (prioridad: encabezado > cookie > peso). Dirija una parte del tráfico a la nueva versión del Service en producción, valídela y, cuando esté lista, promuévala.
Requisitos previos
Complete a continuación los siguientes pasos:
Dos vSwitches en distintas zonas de disponibilidad dentro de la misma VPC que el clúster de ACK. Consulte Crear y gestionar un vSwitch.
-
El controlador de ALB Ingress instalado en el clúster. Consulte Manage the ALB Ingress controller.
En los clústeres dedicados de ACK, otorgue permisos al clúster para acceder a ALB Ingress. Consulte Autorizar a un clúster dedicado de ACK el acceso al controlador de ALB Ingress .
Un AlbConfig creado. Consulte Crear un AlbConfig.
kubectl conectado al clúster de ACK. Consulte Obtener el archivo kubeconfig de un clúster y usar kubectl para conectarse al clúster.
Anotaciones canary
Todo Ingress canary requiere la anotación alb.ingress.kubernetes.io/canary: "true". Sin ella, el Ingress canary entra en conflicto con el entorno de producción en lugar de enrutar junto a él.
Las siguientes anotaciones controlan la división del tráfico:
|
Anotación |
Descripción |
|
|
Marca el Ingress como canary. Establezca el valor en |
|
|
Clave del encabezado de solicitud que debe coincidir. Las solicitudes coincidentes se dirigen al Service canary. |
|
|
Valor del encabezado que debe coincidir. Requiere |
|
|
Porcentaje de tráfico (0–100) destinado al Service canary cuando ninguna regla de encabezado o cookie coincide. El valor |
|
|
Orden de evaluación de la regla de enrutamiento. Valores válidos: 1–1000. Valor predeterminado: |
Prioridad de las reglas: basadas en encabezado > basadas en cookie > basadas en peso.
Notas de uso
Las reglas basadas en encabezado o cookie no pueden compartir un Ingress con las reglas basadas en peso. Utilice Ingresses independientes o consulte custom routing rules para condiciones complejas.
El host del Ingress canary debe coincidir exactamente con el host del Ingress de producción.
Cuando varios Ingresses canary comparten un mismo host, establezca la prioridad de manera explícita con
alb.ingress.kubernetes.io/orderen lugar de depender del orden lexicográfico.
Paso 1: Desplegar el Service de producción
Despliegue el Deployment, el Service y el Ingress de producción.
-
Cree el archivo
tea-deploy.yamly aplíquelo:apiVersion: apps/v1 kind: Deployment metadata: name: tea spec: replicas: 1 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest ports: - containerPort: 80kubectl apply -f tea-deploy.yaml -
Cree el archivo
tea-svc.yamly aplíquelo:apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: tea type: NodePortkubectl apply -f tea-svc.yaml -
Cree el archivo
tea-ingress.yamly aplíquelo:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tea-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Replace with your domain name, resolved to the load balancer IP. http: paths: - path: / pathType: Prefix backend: service: name: tea-svc port: number: 80kubectl apply -f tea-ingress.yaml
Paso 2: Desplegar el Service canary y las reglas de enrutamiento
Despliegue el Service canary con dos Ingresses canary: uno enruta por encabezado y el otro divide el tráfico restante por peso.
Antes de aplicar los Ingresses canary, tenga en cuenta lo siguiente:
Establezca
alb.ingress.kubernetes.io/canary: "true"en cada Ingress canary. Sin esta anotación, el Ingress canary entra en conflicto con el entorno de producción.El campo
hostdebe coincidir exactamente con el host del Ingress de producción (demo.domain.ingress.topen este ejemplo).Las reglas basadas en encabezado y las basadas en peso deben configurarse en Ingresses distintos.
-
Cree el archivo
canary-deploy.yamly aplíquelo:apiVersion: apps/v1 kind: Deployment metadata: name: canary spec: replicas: 1 selector: matchLabels: app: canary template: metadata: labels: app: canary spec: containers: - name: canary image: registry.cn-hangzhou.aliyuncs.com/acs-sample/new-nginx:latest ports: - containerPort: 80kubectl apply -f canary-deploy.yaml -
Cree el archivo
canary-svc.yamly aplíquelo:apiVersion: v1 kind: Service metadata: name: canary-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: canary type: NodePortkubectl apply -f canary-svc.yaml -
Cree un Ingress canary basado en encabezado. Las solicitudes con
location: hzse dirigen acanary-svc; otros encabezados pasan a la siguiente regla. Cree el archivocanary-header-ingress.yamly aplíquelo:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-by-header: "location" alb.ingress.kubernetes.io/canary-by-header-value: "hz" name: canary-header-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Must match the production Ingress host exactly. http: paths: - backend: service: name: canary-svc port: number: 80 path: / pathType: Prefixkubectl apply -f canary-header-ingress.yaml -
Cree un Ingress canary basado en peso. Las solicitudes sin coincidencia se dividen en partes iguales entre los Services de producción y canary. Cree el archivo
canary-weight-ingress.yamly aplíquelo:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-weight: "50" name: canary-weight-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.domain.ingress.top # Must match the production Ingress host exactly. http: paths: - backend: service: name: canary-svc port: number: 80 path: / pathType: Prefixkubectl apply -f canary-weight-ingress.yaml
Comprobar la versión canary
-
Obtenga la dirección de la instancia de ALB:
kubectl get ingResultado esperado:
NAME CLASS HOSTS ADDRESS PORTS AGE canary-header-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 8m23s canary-weight-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 8m16s tea-ingress alb demo.domain.ingress.top alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com 80 7m5s -
Compruebe que las solicitudes con el encabezado
location: hzsiempre lleguen a la versión canary:for i in $(seq 1 10); do curl -s -H "Host:demo.domain.ingress.top" -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com; doneLas 10 respuestas devuelven
new. La regla de encabezado tiene la prioridad más alta y dirige todas las solicitudes coincidentes a la versión canary. -
Compruebe que las solicitudes sin un encabezado coincidente se dividan aproximadamente en proporción 50/50:
for i in $(seq 1 10); do curl -s -H "Host:demo.domain.ingress.top" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com; doneLas respuestas alternan entre
new(canary) yold(producción), con una proporción cercana a la mitad para cada una. Los encabezados sin coincidencia (por ejemplo,location: bj) siguen la misma división basada en peso.
Paso 3: Promover la nueva versión
Una vez que la versión canary se estabilice, redirija todo el tráfico de producción al nuevo Service y elimine los Ingresses canary.
-
Actualice
tea-ingress.yamlpara que apunte acanary-svc:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tea-ingress spec: ingressClassName: alb rules: - host: demo.domain.ingress.top http: paths: - path: / pathType: Prefix backend: service: name: canary-svc # Changed from tea-svc. port: number: 80kubectl apply -f tea-ingress.yaml -
Elimine los Ingresses canary:
kubectl delete ing canary-weight-ingress canary-header-ingress -
Compruebe que todo el tráfico llegue a la nueva versión:
for i in $(seq 1 10); do curl -s -H "Host:demo.domain.ingress.top" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com; doneLas 10 respuestas devuelven
new. La versión anterior del Service queda completamente obsoleta.
Siguientes pasos
Consulte Advanced ALB Ingress configurations para conocer las redirecciones de HTTP a HTTPS, las reglas de enrutamiento personalizadas y más información.
Consulte Ingress FAQ para solucionar problemas.