Todos los productos
Search
Centro de documentos

Microservices Engine:Advanced usage of MSE Ingress

Última actualización: Oct 09, 2026

MSE Ingress ofrece balanceo de carga de capa 7 para gestionar el acceso externo a los servicios de un clúster de Kubernetes. Configure funciones basadas en anotaciones sobre los recursos Ingress, desde versiones canary y limitación de velocidad hasta TLS y duplicación de tráfico.

Todos los ejemplos incluyen configuraciones tanto para Kubernetes v1.19 o superior (networking.k8s.io/v1) como para versiones anteriores (networking.k8s.io/v1beta1).

Referencia rápida de anotaciones

Todas las anotaciones de este documento utilizan el prefijo nginx.ingress.kubernetes.io/ o mse.ingress.kubernetes.io/. La siguiente tabla muestra cada anotación con sus valores aceptados, valor predeterminado y alcance.

Annotation

Accepted values

Default

Scope

nginx.ingress.kubernetes.io/canary

"true"

—

Route

nginx.ingress.kubernetes.io/canary-by-header

string

—

Route

nginx.ingress.kubernetes.io/canary-by-header-value

string

—

Route

nginx.ingress.kubernetes.io/canary-by-cookie

string

—

Route

nginx.ingress.kubernetes.io/canary-weight

integer (0–100 or 0–total)

—

Route

nginx.ingress.kubernetes.io/canary-weight-total

integer

100

Route

mse.ingress.kubernetes.io/canary-by-query

string

—

Route

mse.ingress.kubernetes.io/canary-by-query-value

string

—

Route

mse.ingress.kubernetes.io/service-subset

string

—

Route

mse.ingress.kubernetes.io/subset-labels

key value

—

Route

nginx.ingress.kubernetes.io/enable-cors

"true" / "false"

false

Route

nginx.ingress.kubernetes.io/cors-allow-origin

comma-separated origins or *

*

Route

nginx.ingress.kubernetes.io/cors-allow-methods

comma-separated HTTP methods or *

GET,PUT,POST,DELETE,PATCH,OPTIONS

Route

nginx.ingress.kubernetes.io/cors-allow-headers

comma-separated headers or *

DNT,X-CustomHeader,...

Route

nginx.ingress.kubernetes.io/cors-expose-headers

comma-separated headers

—

Route

nginx.ingress.kubernetes.io/cors-allow-credentials

"true" / "false"

true

Route

nginx.ingress.kubernetes.io/cors-max-age

integer (seconds)

1728000

Route

nginx.ingress.kubernetes.io/use-regex

"true" / "false"

—

Route

nginx.ingress.kubernetes.io/rewrite-target

path string

—

Route

nginx.ingress.kubernetes.io/upstream-vhost

hostname

—

Route

nginx.ingress.kubernetes.io/ssl-redirect

"true" / "false"

false

Route

nginx.ingress.kubernetes.io/force-ssl-redirect

"true" / "false"

false

Route

nginx.ingress.kubernetes.io/permanent-redirect

URL (with scheme)

—

Route

nginx.ingress.kubernetes.io/permanent-redirect-code

HTTP status code

301

Route

nginx.ingress.kubernetes.io/temporal-redirect

URL (with scheme)

—

Route

mse.ingress.kubernetes.io/request-header-control-add

key value or YAML block

—

Route

mse.ingress.kubernetes.io/request-header-control-update

key value or YAML block

—

Route

mse.ingress.kubernetes.io/request-header-control-remove

comma-separated header names

—

Route

mse.ingress.kubernetes.io/response-header-control-add

key value or YAML block

—

Route

mse.ingress.kubernetes.io/response-header-control-update

key value or YAML block

—

Route

mse.ingress.kubernetes.io/response-header-control-remove

comma-separated header names

—

Route

nginx.ingress.kubernetes.io/proxy-next-upstream-tries

integer

3

Route

nginx.ingress.kubernetes.io/proxy-next-upstream-timeout

integer (seconds)

no timeout

Route

nginx.ingress.kubernetes.io/proxy-next-upstream

comma-separated conditions

error,timeout

Route

nginx.ingress.kubernetes.io/whitelist-source-range

comma-separated IPs or CIDRs

—

Route

mse.ingress.kubernetes.io/blacklist-source-range

comma-separated IPs or CIDRs

—

Route

mse.ingress.kubernetes.io/domain-whitelist-source-range

comma-separated IPs or CIDRs

—

Domain

mse.ingress.kubernetes.io/domain-blacklist-source-range

comma-separated IPs or CIDRs

—

Domain

mse.ingress.kubernetes.io/route-limit-rpm

integer

—

Route

mse.ingress.kubernetes.io/route-limit-rps

integer

—

Route

mse.ingress.kubernetes.io/route-limit-burst-multiplier

integer

5

Route

mse.ingress.kubernetes.io/rate-limit

integer (RPS)

—

Route

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code

HTTP status code

429

Route

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type

text / json

text

Route

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body

string

sentinel rate limited

Route

mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url

URL

—

Route

mse.ingress.kubernetes.io/concurrency-limit

integer

—

Route

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code

HTTP status code

429

Route

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type

text / json

text

Route

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body

string

sentinel rate limited

Route

mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url

URL

—

Route

mse.ingress.kubernetes.io/mirror-target-service

namespace/name:port

—

Route

mse.ingress.kubernetes.io/mirror-percentage

integer (0–100)

100

Route

nginx.ingress.kubernetes.io/backend-protocol

HTTPS / GRPC

—

Route

nginx.ingress.kubernetes.io/load-balance

round_robin / least_conn / random

round_robin

Route

nginx.ingress.kubernetes.io/upstream-hash-by

NGINX variable or expression

—

Route

mse.ingress.kubernetes.io/warmup

integer (seconds)

disabled

Route

nginx.ingress.kubernetes.io/affinity

cookie

—

Route

nginx.ingress.kubernetes.io/affinity-mode

balanced

balanced

Route

nginx.ingress.kubernetes.io/session-cookie-name

string

INGRESSCOOKIE

Route

nginx.ingress.kubernetes.io/session-cookie-path

path string

/

Route

nginx.ingress.kubernetes.io/session-cookie-max-age

integer (seconds)

session-scoped

Route

nginx.ingress.kubernetes.io/session-cookie-expires

integer (seconds)

session-scoped

Route

mse.ingress.kubernetes.io/connection-policy-tcp-max-connection

integer

—

Route

mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint

integer

—

Route

mse.ingress.kubernetes.io/connection-policy-http-max-request-per-connection

integer

—

Route

mse.ingress.kubernetes.io/tls-min-protocol-version

TLSv1.0 / TLSv1.1 / TLSv1.2 / TLSv1.3

TLSv1.0

Domain

mse.ingress.kubernetes.io/tls-max-protocol-version

TLSv1.0 / TLSv1.1 / TLSv1.2 / TLSv1.3

TLSv1.3

Domain

nginx.ingress.kubernetes.io/ssl-cipher

comma-separated cipher suites

see defaults

Domain

nginx.ingress.kubernetes.io/proxy-ssl-secret

namespace/secretName

—

Route

nginx.ingress.kubernetes.io/proxy-ssl-name

hostname

—

Route

nginx.ingress.kubernetes.io/proxy-ssl-server-name

"on" / "off"

—

Route

Versión canary

MSE Ingress admite cuatro estrategias de versión canary. Habilite esta función en cualquier recurso Ingress al agregar la anotación nginx.ingress.kubernetes.io/canary: "true". Después, aplique una o más de las anotaciones específicas que se describen a continuación.

MSE Ingress admite más de dos versiones de servicio en una sola versión canary, sin límite máximo. NGINX Ingress y ALB Ingress admiten un máximo de dos versiones.

Cuando se configuran varias estrategias de forma simultánea, MSE Ingress las aplica con el siguiente orden de prioridad:

  1. Basada en encabezados o en parámetros de consulta (prioridad más alta)

  2. Basada en cookies

  3. Basada en peso (prioridad más baja)

Versión canary basada en encabezados

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/canary-by-header

Dirige las solicitudes a la versión canary cuando el encabezado especificado está presente y tiene el valor always.

—

Sí (para canary basado en encabezados)

nginx.ingress.kubernetes.io/canary-by-header-value

Dirige las solicitudes a la versión canary solo cuando el encabezado coincide tanto con la clave (definida en canary-by-header) como con este valor.

—

No

Ejemplo 1: Enrutamiento según la presencia de un encabezado

Si el encabezado de solicitud mse tiene el valor always, las solicitudes se dirigen a demo-service-canary. El resto de las solicitudes se envía a demo-service.

Kubernetes v1.19 o superior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "mse"
  name: demo-canary
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "mse"
  name: demo-canary
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Ejemplo 2: Enrutamiento de varias versiones canary mediante un valor exacto de encabezado

Cuando está presente el encabezado mse: v1, las solicitudes se dirigen a demo-service-canary-v1. Si aparece mse: v2, se envían a demo-service-canary-v2. Todas las demás solicitudes van a demo-service.

Kubernetes v1.19 o superior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "mse"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
  name: demo-canary-v1
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v1
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "mse"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
  name: demo-canary-v2
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v2
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "mse"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
  name: demo-canary-v1
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v1
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "mse"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v2"
  name: demo-canary-v2
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v2
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Versión canary basada en parámetros de consulta

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/canary-by-query

Dirige las solicitudes a la versión canary cuando el parámetro de consulta especificado está presente y tiene el valor always.

—

Sí (para canary basado en consultas)

mse.ingress.kubernetes.io/canary-by-query-value

Dirige las solicitudes a la versión canary solo cuando el parámetro de consulta coincide tanto con la clave como con este valor.

—

No

Las condiciones basadas en encabezados y en parámetros de consulta se pueden combinar. Las solicitudes se envían a la versión canary únicamente cuando ambas condiciones coinciden de manera simultánea.

Ejemplo 1: Enrutamiento según el valor de un parámetro de consulta

Si la URL contiene canary=gray, las solicitudes se dirigen a demo-service-canary. El resto de las solicitudes se envía a demo-service.

Kubernetes v1.19 o superior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    mse.ingress.kubernetes.io/canary-by-query: "canary"
    mse.ingress.kubernetes.io/canary-by-query-value: "gray"
  name: demo-canary
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    mse.ingress.kubernetes.io/canary-by-query: "canary"
    mse.ingress.kubernetes.io/canary-by-query-value: "gray"
  name: demo-canary
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Ejemplo 2: Combinación de un parámetro de consulta con condiciones de encabezado

Cuando la URL contiene canary=gray Y el encabezado de solicitud incluye x-user-id: test, las solicitudes se dirigen a demo-service-canary. Ambas condiciones deben cumplirse.

Kubernetes v1.19 o superior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    mse.ingress.kubernetes.io/canary-by-query: "canary"
    mse.ingress.kubernetes.io/canary-by-query-value: "gray"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
  name: demo-canary
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    mse.ingress.kubernetes.io/canary-by-query: "canary"
    mse.ingress.kubernetes.io/canary-by-query-value: "gray"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
  name: demo-canary
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Versión canary basada en cookies

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/canary-by-cookie

Dirige las solicitudes a la versión canary cuando la cookie especificada tiene el valor always. No se admiten valores personalizados para la cookie; debe ser always.

—

Sí (para canary basado en cookies)

Example: Si la cookie de solicitud demo=always está presente, las solicitudes se dirigen a demo-service-canary. El resto de las solicitudes se envía a demo-service.

Kubernetes v1.19 o superior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
  name: demo-canary
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-cookie: "demo"
  name: demo-canary
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Versión canary basada en peso

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/canary-weight

Porcentaje de solicitudes enviadas a la versión canary. Número entero entre 0 y 100 (o entre 0 y canary-weight-total).

—

Sí (para canary basado en peso)

nginx.ingress.kubernetes.io/canary-weight-total

Peso total que se usa como denominador al calcular la distribución de solicitudes.

100

No

Example: Distribuya el tráfico entre tres versiones: 30 % a demo-service-canary-v1, 20 % a demo-service-canary-v2 y 50 % a demo-service.

Kubernetes v1.19 o superior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "30"
  name: demo-canary-v1
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v1
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "20"
  name: demo-canary-v2
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v2
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "30"
  name: demo-canary-v1
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v1
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "20"
  name: demo-canary-v2
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v2
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Subconjunto de servicio

Un subconjunto de servicio permite dirigir solicitudes a un grupo específico de pods dentro de un mismo servicio de Kubernetes. Esto resulta útil cuando varios despliegues con distintas versiones respaldan un único servicio. MSE Ingress ofrece dos métodos para definir estos subconjuntos.

Uso de etiquetas de pod en MseIngressConfig

Utilice la anotación mse.ingress.kubernetes.io/service-subset para seleccionar pods según sus etiquetas canary de OpenSergo:

  • "" o base: dirige el tráfico a los pods sin el prefijo de etiqueta opensergo.io/canary o con opensergo.io/canary: "".

  • Cualquier otro valor (por ejemplo, gray): dirige el tráfico a los pods etiquetados con opensergo.io/canary-{value}: {value}, como opensergo.io/canary-gray: gray.

Example: Un servicio llamado go-httpbin cuenta con dos despliegues de respaldo. Los pods base no tienen etiqueta canary de OpenSergo, mientras que los pods gray incluyen la etiqueta opensergo.io/canary-gray: gray.

Manifiestos del servicio y del despliegue:

# go-httpbin Service
apiVersion: v1
kind: Service
metadata:
  name: go-httpbin
  namespace: default
spec:
  ports:
    - port: 8080
      protocol: TCP
  selector:
    app: go-httpbin
---
# Base Deployment — no OpenSergo canary label
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-base
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
          args:
            - "--version=base"
          imagePullPolicy: Always
          name: go-httpbin
---
# Gray Deployment — has the OpenSergo canary label
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-gray
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
        opensergo.io/canary-gray: gray
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
          args:
            - "--version=gray"
          imagePullPolicy: Always
          name: go-httpbin

Configuración de Ingress: las solicitudes con x-user-id: test se dirigen a go-httpbin-gray y todas las demás a go-httpbin-base.

Kubernetes v1.19 o superior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # Forward to Pods labeled opensergo.io/canary-gray: gray
    mse.ingress.kubernetes.io/service-subset: gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # Forward to Pods without the opensergo.io/canary label prefix
    mse.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # Forward to Pods labeled opensergo.io/canary-gray: gray
    mse.ingress.kubernetes.io/service-subset: gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    # Forward to Pods without the opensergo.io/canary label prefix
    mse.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080

Uso de etiquetas personalizadas

Combine mse.ingress.kubernetes.io/service-subset con mse.ingress.kubernetes.io/subset-labels para definir el subconjunto mediante cualquier etiqueta de pod, en lugar de usar el prefijo opensergo.io/canary.

Cuando se establece subset-labels , el subconjunto deja de asociarse con las etiquetas que tienen el prefijo opensergo.io/canary .

Example: El despliegue gray utiliza version: gray en lugar de una etiqueta de OpenSergo.

Manifiestos del servicio y del despliegue:

# go-httpbin Service
apiVersion: v1
kind: Service
metadata:
  name: go-httpbin
  namespace: default
spec:
  ports:
    - port: 8080
      protocol: TCP
  selector:
    app: go-httpbin
---
# Base Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-base
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
          args:
            - "--version=base"
          imagePullPolicy: Always
          name: go-httpbin
---
# Gray Deployment — uses a custom label instead of opensergo.io/canary
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-gray
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: go-httpbin
  template:
    metadata:
      labels:
        app: go-httpbin
        version: gray
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/mse/go-httpbin
          args:
            - "--version=gray"
          imagePullPolicy: Always
          name: go-httpbin

Configuración de Ingress: las solicitudes con x-user-id: test se dirigen a go-httpbin-gray y todas las demás a go-httpbin-base.

Kubernetes v1.19 o superior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # Forward to Pods labeled version: gray
    mse.ingress.kubernetes.io/service-subset: gray
    mse.ingress.kubernetes.io/subset-labels: version gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 8080
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "x-user-id"
    nginx.ingress.kubernetes.io/canary-by-header-value: "test"
    # Forward to Pods labeled version: gray
    mse.ingress.kubernetes.io/service-subset: gray
    mse.ingress.kubernetes.io/subset-labels: version gray
  name: demo-canary
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/service-subset: ""
  name: demo
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /test
            backend:
              serviceName: go-httpbin
              servicePort: 8080

CORS

El uso compartido de recursos de origen cruzado (CORS) permite que las aplicaciones web accedan a recursos de un origen distinto. Para consultar la especificación de CORS, consulte Cross-Origin Resource Sharing (CORS).

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/enable-cors

Habilita CORS en este Ingress.

false

Sí (para habilitar CORS)

nginx.ingress.kubernetes.io/cors-allow-origin

Orígenes de terceros permitidos. Acepta valores separados por comas y comodines (*).

*

No

nginx.ingress.kubernetes.io/cors-allow-methods

Métodos HTTP permitidos. Acepta valores separados por comas y comodines (*).

GET,PUT,POST,DELETE,PATCH,OPTIONS

No

nginx.ingress.kubernetes.io/cors-allow-headers

Encabezados de solicitud permitidos. Acepta valores separados por comas y comodines (*).

DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization

No

nginx.ingress.kubernetes.io/cors-expose-headers

Encabezados de respuesta expuestos al navegador. Acepta valores separados por comas.

—

No

nginx.ingress.kubernetes.io/cors-allow-credentials

Indica si se pueden incluir credenciales en las solicitudes CORS.

true

No

nginx.ingress.kubernetes.io/cors-max-age

Duración de la caché para los resultados de preflight, en segundos.

1728000

No

Example: Permita example.com como origen, restrinja los métodos a GET y POST, habilite el encabezado de solicitud X-Foo-Bar y deshabilite el envío de credenciales.

Kubernetes v1.19 o superior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: "example.com"
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
    nginx.ingress.kubernetes.io/cors-allow-headers: "X-Foo-Bar"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: "example.com"
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
    nginx.ingress.kubernetes.io/cors-allow-headers: "X-Foo-Bar"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Coincidencia con expresiones regulares

Además de la coincidencia exacta y por prefijo, MSE Ingress admite coincidencias mediante expresiones regulares. Establezca nginx.ingress.kubernetes.io/use-regex: "true" para que la ruta definida en la especificación del Ingress se interprete como una expresión regular.

Example: Reenvíe al servicio demo las solicitudes dirigidas a example.com cuya ruta comience con /app o /test.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/use-regex: 'true'
  name: regex-match
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo
                port:
                  number: 8080
            path: /(app|test)/(.*)
            pathType: Prefix

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/use-regex: 'true'
  name: regex-match
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /(app|test)/(.*)
            backend:
              serviceName: demo
              servicePort: 8080

Reescritura de rutas y hosts

Las operaciones de reescritura modifican la ruta o el host de una solicitud antes de que llegue al servicio de backend.

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/rewrite-target

Ruta de destino. Admite grupos de captura del patrón de ruta del Ingress.

—

Sí (para reescritura de rutas)

nginx.ingress.kubernetes.io/upstream-vhost

Host de destino.

—

Sí (para reescritura de hosts)

Reescritura de rutas

Example 1: Cambie example.com/test por example.com/dev antes de reenviar la solicitud al backend.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/dev"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/dev"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /test
            pathType: Exact
            backend:
              serviceName: demo-service
              servicePort: 80

Example 2: Elimine el prefijo /v1. Es decir, reescriba example.com/v1/xxx como example.com/xxx.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/$1"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /v1/(.*)
            pathType: Prefix

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/$1"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /v1/(.*)
            pathType: Prefix
            backend:
              serviceName: demo-service
              servicePort: 80

Example 3: Sustituya el prefijo /v1 por /v2. De este modo, example.com/v1/xxx se reescribe como example.com/v2/xxx.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /v1/(.*)
            pathType: Prefix

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/v2/$1"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /v1/(.*)
            pathType: Prefix
            backend:
              serviceName: demo-service
              servicePort: 80

Reescritura de hosts

Example: Cambie el host de example.com a test.com antes de reenviar example.com/test al backend.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Redirección

Redirección de HTTP a HTTPS

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/ssl-redirect

Obliga a redirigir las solicitudes HTTP hacia HTTPS.

false

Sí (para habilitar la redirección)

nginx.ingress.kubernetes.io/force-ssl-redirect

Obliga a redirigir las solicitudes HTTP hacia HTTPS.

false

Sí (alternativa a ssl-redirect)

MSE Ingress procesa ssl-redirect y force-ssl-redirect de la misma manera. Ambas anotaciones fuerzan la redirección de HTTP a HTTPS.

Example: Redirija http://example.com/test hacia https://example.com/test.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Redirección permanente

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/permanent-redirect

URL de destino de la redirección permanente. Debe incluir el esquema (http:// o https://).

—

Sí (para redirecciones permanentes)

nginx.ingress.kubernetes.io/permanent-redirect-code

Código de estado HTTP de la redirección.

301

No

Example: Redirija de forma permanente http://example.com/test hacia http://example.com/app.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/permanent-redirect: "http://example.com/app"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Redirección temporal

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/temporal-redirect

URL de destino de la redirección temporal. Debe incluir el esquema (http:// o https://).

—

Sí (para redirecciones temporales)

Example: Redirija de forma temporal http://example.com/test hacia http://example.com/app.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/temporal-redirect: "http://example.com/app"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Control de encabezados

El control de encabezados permite agregar, modificar o quitar encabezados de solicitud antes de que MSE Ingress la reenvíe al servicio de backend. También posibilita ajustar los encabezados de respuesta antes de devolverla al cliente.

Control de encabezados de solicitud

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/request-header-control-add

Agrega un encabezado a la solicitud. Si ya existe, el nuevo valor se anexa al original. Para un solo encabezado, utilice un par clave-valor. Para varios encabezados, use un escalar de bloque YAML (`

`) con un par clave-valor por línea.

—

No

mse.ingress.kubernetes.io/request-header-control-update

Modifica un encabezado existente en la solicitud. Si el encabezado ya existe, el nuevo valor sobrescribe al original. Utiliza la misma sintaxis que request-header-control-add.

—

No

mse.ingress.kubernetes.io/request-header-control-remove

Quita un encabezado de la solicitud. Para eliminar varios encabezados, sepárelos con comas (,).

—

No

Example 1: Agregue foo: bar y test: true a todas las solicitudes enviadas a example.com/test.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/request-header-control-add: |
      foo bar
      test true
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/request-header-control-add: |
      foo bar
      test true
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Example 2: Combine el control de encabezados con versiones canary. Cuando el encabezado de solicitud sea mse: v1, la solicitud se enviará a demo-service-canary-v1 con el encabezado stage: gray agregado. El resto de las solicitudes se dirigirá a demo-service con stage: production incluido.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "mse"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
    mse.ingress.kubernetes.io/request-header-control-add: "stage gray"
  name: demo-canary-v1
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service-canary-v1
                port:
                  number: 80
            path: /hello
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/request-header-control-add: "stage production"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /hello
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "mse"
    nginx.ingress.kubernetes.io/canary-by-header-value: "v1"
    mse.ingress.kubernetes.io/request-header-control-add: "stage gray"
  name: demo-canary-v1
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service-canary-v1
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/request-header-control-add: "stage production"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: demo-service
              servicePort: 80

Control de encabezados de respuesta

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/response-header-control-add

Agrega un encabezado a la respuesta del backend antes de reenviarla al cliente. Si ya existe, el nuevo valor se anexa. Utiliza la misma sintaxis que el control de encabezados de solicitud.

—

No

mse.ingress.kubernetes.io/response-header-control-update

Modifica un encabezado de respuesta existente. Si el encabezado ya existe, el nuevo valor sobrescribe al original. Utiliza la misma sintaxis que el control de encabezados de solicitud.

—

No

mse.ingress.kubernetes.io/response-header-control-remove

Quita un encabezado de respuesta antes de reenviarla al cliente. Para eliminar varios encabezados, sepárelos con comas (,).

—

No

Example: Quite el encabezado req-cost-time de las respuestas enviadas a example.com/test.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/response-header-control-remove: "req-cost-time"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Reintentos

MSE Ingress ofrece reintentos automáticos a nivel de ruta para las solicitudes con errores. Configure las condiciones, los límites y los tiempos de espera de reintento con las anotaciones a continuación.

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/proxy-next-upstream-tries

Número máximo de reintentos.

3

No

nginx.ingress.kubernetes.io/proxy-next-upstream-timeout

Tiempo de espera total para todos los intentos de reintento, en segundos.

Sin tiempo de espera

No

nginx.ingress.kubernetes.io/proxy-next-upstream

Condiciones de reintento separadas por comas. Valores válidos: error (falla de conexión o error 5xx), timeout (tiempo de espera de conexión agotado o error 5xx), invalid_header (error de solicitud o error 5xx), http_xxx (código de estado específico, por ejemplo, http_502), non_idempotent (habilita reintentos para POST y PATCH) y off (deshabilita los reintentos).

error,timeout

No

De forma predeterminada, MSE Ingress no reintenta las solicitudes no idempotentes (POST y PATCH), incluso si se cumplen otras condiciones de reintento. Agregue non_idempotent a proxy-next-upstream para habilitar los reintentos en estos métodos.

Example: Para example.com/test, establezca un máximo de 2 reintentos con un tiempo de espera de 5 segundos. Active los reintentos únicamente ante un error HTTP 502 y habilítelos para las solicitudes no idempotentes.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "2"
    nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "5"
    nginx.ingress.kubernetes.io/proxy-next-upstream: "http_502,non_idempotent"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "2"
    nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "5"
    nginx.ingress.kubernetes.io/proxy-next-upstream: "http_502,non_idempotent"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Listas de permitidos y listas de bloqueo de direcciones IP

MSE Ingress admite listas de permitidos (listas blancas) y listas de bloqueo (listas negras) de direcciones IP, tanto a nivel de ruta como de dominio. Las reglas a nivel de ruta tienen prioridad sobre las de nivel de dominio.

Control de IP a nivel de ruta

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/whitelist-source-range

Direcciones IP o bloques CIDR permitidos para esta ruta, separados por comas.

—

No

mse.ingress.kubernetes.io/blacklist-source-range

Direcciones IP o bloques CIDR bloqueados para esta ruta, separados por comas.

—

No

Example 1: Permita el acceso a example.com/test únicamente desde 1.1.X.X.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 1.1.X.X
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Example 2: Bloquee el acceso a example.com/test desde 2.2.2.2.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/blacklist-source-range: 2.2.2.2
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Control de IP a nivel de dominio

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/domain-whitelist-source-range

Direcciones IP o bloques CIDR permitidos para todas las rutas de un dominio, separados por comas. Las listas de permitidos a nivel de ruta tienen prioridad.

—

No

mse.ingress.kubernetes.io/domain-blacklist-source-range

Direcciones IP o bloques CIDR bloqueados para todas las rutas de un dominio, separados por comas. Las listas de bloqueo a nivel de ruta tienen prioridad.

—

No

Example 1: Permita el acceso a todas las rutas de example.com desde 1.1.X.X y 2.2.2.2.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact
          - backend:
              service:
                name: app-service
                port:
                  number: 80
            path: /app
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80
          - path: /app
            backend:
              serviceName: app-service
              servicePort: 80

Example 2: Permita el acceso a todas las rutas de example.com desde 1.1.X.X y 2.2.2.2, pero restrinja /order únicamente a 3.3.X.X. La lista de permitidos a nivel de ruta configurada en /order anula la lista de permitidos a nivel de dominio para esa ruta específica.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
  name: demo-domain
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact
          - backend:
              service:
                name: app-service
                port:
                  number: 80
            path: /app
            pathType: Exact
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X
  name: demo-route
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /order
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/domain-whitelist-source-range: 1.1.X.X,2.2.2.2
  name: demo-domain
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80
          - path: /app
            backend:
              serviceName: app-service
              servicePort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 3.3.X.X
  name: demo-route
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /order
            backend:
              serviceName: demo-service
              servicePort: 80

Limitación de velocidad por gateway individual

La limitación de velocidad por gateway individual restringe la tasa de solicitudes de una ruta en cada réplica del gateway. Utilícela cuando necesite controlar la velocidad por instancia. Para gestionar el límite en todo el clúster, consulte Control global de limitación de velocidad.

MSE Ingress emplea un modelo de bucket de tokens para controlar los picos de tráfico. La anotación route-limit-rpm o route-limit-rps define la tasa sostenida, es decir, la velocidad a la que se recarga el bucket de tokens. Por su parte, la anotación route-limit-burst-multiplier establece la capacidad de ráfaga como un múltiplo de dicha tasa: límite de ráfaga = tasa × multiplicador. Las solicitudes que superen esta capacidad se rechazan e incluyen local_rate_limited en el cuerpo de la respuesta.

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/route-limit-rpm

Máximo de solicitudes por minuto (RPM) para cada réplica del gateway. Límite de ráfaga = RPM × route-limit-burst-multiplier. Código de respuesta al aplicar el límite: 503 (gateway < v1.2.23) o 429 (gateway >= v1.2.23).

—

No

mse.ingress.kubernetes.io/route-limit-rps

Máximo de solicitudes por segundo (RPS) para cada réplica del gateway. Límite de ráfaga = RPS × route-limit-burst-multiplier. Los códigos de respuesta son los mismos que en RPM.

—

No

mse.ingress.kubernetes.io/route-limit-burst-multiplier

Multiplicador de capacidad de ráfaga que se aplica al límite de RPM o RPS configurado.

5

No

Example 1: Limite example.com/test a 100 RPM con un límite de ráfaga de 200 (multiplicador = 2).

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/route-limit-rpm: "100"
    mse.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/route-limit-rpm: "100"
    mse.ingress.kubernetes.io/route-limit-burst-multiplier: "2"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Example 2: Limite example.com/test a 10 RPS con el límite de ráfaga predeterminado de 50 (multiplicador = 5).

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/route-limit-rps: "10"
    # Default burst multiplier is 5, giving a burst limit of 50 RPS
    # mse.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/route-limit-rps: "10"
    # Default burst multiplier is 5, giving a burst limit of 50 RPS
    # mse.ingress.kubernetes.io/route-limit-burst-multiplier: "5"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Control global de limitación de velocidad

MSE Ingress se integra con Sentinel para aplicar un límite global de RPS en todas las réplicas de un clúster de gateways a nivel de ruta. Cuando se activa la limitación, el código de respuesta predeterminado es 429 y el cuerpo de la respuesta es sentinel rate limited.

Importante

El control global de limitación de velocidad requiere la versión 1.2.25 o posterior del gateway de MSE Ingress.

Configure el límite de velocidad para todo el clúster mediante mse.ingress.kubernetes.io/rate-limit. Para personalizar la respuesta cuando se aplica el límite, elija uno de estos dos enfoques: respuesta personalizada o redirección. Solo puede haber un enfoque activo a la vez.

Respuesta personalizada

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/rate-limit

Máximo de RPS para esta ruta en todo el clúster de gateways.

—

Sí

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code

Código de respuesta HTTP que se devuelve al activarse la limitación.

429

No

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body-type

Tipo de contenido del cuerpo de la respuesta. text establece Content-Type: text/plain; charset=UTF-8. json establece Content-Type: application/json; charset=UTF-8.

text

No

mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body

Contenido del cuerpo de la respuesta cuando se activa la limitación.

sentinel rate limited

No

Example 1: Limite example.com/test a 100 RPS en todo el clúster y mantenga la respuesta predeterminada (HTTP 429, sentinel rate limited).

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/rate-limit: "100"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/rate-limit: "100"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Example 2: Limite example.com/test a 100 RPS en todo el clúster. Cuando se aplique la limitación, devuelva un error HTTP 503 con el cuerpo server is overloaded.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/rate-limit: "100"
    mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: 503
    mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overloaded"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/rate-limit: "100"
    mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-code: 503
    mse.ingress.kubernetes.io/rate-limit-fallback-custom-response-body: "server is overloaded"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Redirección

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url

URL a la que se redirige al cliente cuando se activa la limitación de velocidad.

—

No

Example: Limite example.com/test a 100 RPS en todo el clúster. Cuando se aplique la limitación, redirija a example.com/fallback.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/rate-limit: "100"
    mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/rate-limit: "100"
    mse.ingress.kubernetes.io/rate-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Control de concurrencia global

MSE Ingress se integra con Sentinel para limitar la cantidad de solicitudes en curso en una ruta dentro de todo el clúster de la puerta de enlace. Si se supera este límite, el código de respuesta predeterminado es 429 y el cuerpo de la respuesta es sentinel rate limited.

Importante

El control de concurrencia global requiere la versión 1.2.25 o posterior de la puerta de enlace de MSE Ingress.

Configure el límite de concurrencia de todo el clúster con mse.ingress.kubernetes.io/concurrency-limit. Para personalizar la respuesta cuando se excede el límite, utilice una respuesta personalizada o una redirección. Solo un enfoque puede estar activo a la vez.

Respuesta personalizada

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/concurrency-limit

Número máximo de solicitudes en curso para esta ruta en todo el clúster de la puerta de enlace.

—

Sí

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code

Código de respuesta HTTP cuando se activa el control de concurrencia.

429

No

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body-type

Tipo de contenido del cuerpo de la respuesta. text establece Content-Type: text/plain; charset=UTF-8. json establece Content-Type: application/json; charset=UTF-8.

text

No

mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body

Contenido del cuerpo de la respuesta cuando se activa el control de concurrencia.

sentinel rate limited

No

Example 1: Limite las solicitudes concurrentes en curso hacia example.com/test a 1,000 en todo el clúster, con la respuesta predeterminada.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/concurrency-limit: "1000"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/concurrency-limit: "1000"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Example 2: Limite las solicitudes concurrentes en curso hacia example.com/test a 1,000 en todo el clúster. Cuando se supere el límite, devuelva el código HTTP 503 con el cuerpo server is overloaded.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/concurrency-limit: "1000"
    mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: 503
    mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overloaded"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/concurrency-limit: "1000"
    mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-code: 503
    mse.ingress.kubernetes.io/concurrency-limit-fallback-custom-response-body: "server is overloaded"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Redirección

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url

URL a la que se redirige al cliente cuando se activa el control de concurrencia.

—

No

Example: Limite las solicitudes concurrentes en curso hacia example.com/test a 1,000 en todo el clúster. Cuando se supere el límite, redirija a example.com/fallback.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/concurrency-limit: "1000"
    mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/concurrency-limit: "1000"
    mse.ingress.kubernetes.io/concurrency-limit-fallback-redirect-url: "example.com/fallback"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Duplicación de tráfico

La duplicación de tráfico copia las solicitudes en vivo hacia un servicio secundario sin afectar la respuesta original. Utilícela para auditar, probar o depurar el tráfico frente a un entorno espejo.

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/mirror-target-service

Servicio de destino para el tráfico duplicado. Formato: namespace/name:port. Si se omite namespace, toma como valor predeterminado el namespace de la puerta de enlace. Si se omite port, toma el primer puerto del Service.

—

Sí (para habilitar la duplicación)

mse.ingress.kubernetes.io/mirror-percentage

Porcentaje de tráfico que se va a duplicar. Rango válido: 0–100.

100

No

Cuando el tráfico duplicado se reenvía al servicio de destino, se agrega automáticamente el sufijo -shadow al encabezado Host . Por ejemplo, example.com se convierte en example.com-shadow .

Example 1: Duplique el 100 % de las solicitudes dirigidas a example.com/test hacia test/app:8080.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Example 2: Duplique el 10 % de las solicitudes dirigidas a example.com/test hacia test/app:8080.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
    mse.ingress.kubernetes.io/mirror-percentage: 10
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/mirror-target-service: test/app:8080
    mse.ingress.kubernetes.io/mirror-percentage: 10
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Protocolos del servicio de backend: HTTPS y gRPC

De forma predeterminada, MSE Ingress usa HTTP para reenviar las solicitudes a los contenedores del backend. Utilice nginx.ingress.kubernetes.io/backend-protocol para cambiar a HTTPS o gRPC.

Si el recurso Service de Kubernetes de su backend tiene un puerto llamado grpc o http2 , MSE Ingress utiliza automáticamente el protocolo correspondiente sin requerir la anotación backend-protocol . Este comportamiento difiere del funcionamiento estándar de NGINX Ingress.

Example 1: Reenvíe las solicitudes a un backend mediante HTTPS.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Example 2: Reenvíe las solicitudes a un backend gRPC. Existen dos métodos disponibles.

Método 1: use la anotación backend-protocol:

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Método 2: asigne el nombre grpc al puerto del Service para que MSE Ingress detecte el protocolo automáticamente:

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /order
            pathType: Exact
---
apiVersion: v1
kind: Service
metadata:
  name: demo-service
spec:
  ports:
    - name: grpc
      port: 80
      protocol: TCP
  selector:
    app: demo-service

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: demo-service
spec:
  ports:
    - name: grpc
      port: 80
      protocol: TCP
  selector:
    app: demo-service

Algoritmos de balanceo de carga

MSE Ingress admite varios algoritmos de balanceo de carga para distribuir las solicitudes entre los Pods del backend. Elija uno según sus requisitos de distribución de tráfico y de sesión:

Algorithm

Annotation value

Description

Use when

Round robin

round_robin

Distribuye las solicitudes de manera uniforme entre los Pods mediante rotación.

Predeterminado; adecuado para backends sin estado y con rendimiento uniforme.

Menor cantidad de conexiones

least_conn

Envía cada solicitud al Pod con menos conexiones activas.

Backends con duraciones de solicitud variables.

Aleatorio

random

Dirige las solicitudes a un Pod seleccionado al azar.

Distribución uniforme sencilla sin estado.

Hash consistente

Consulte a continuación

Envía las solicitudes con la misma clave de hash al mismo Pod.

Afinidad de sesión por IP, encabezado o parámetro de consulta.

Importante

El algoritmo de media móvil ponderada exponencialmente (EWMA) no es compatible. Si lo configura, el sistema volverá a usar round robin.

Algoritmos comunes de balanceo de carga

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/load-balance

Algoritmo de balanceo de carga. Valores válidos: round_robin, least_conn, random.

round_robin

No

Example: Use el método de menor cantidad de conexiones para demo-service.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/load-balance: "least_conn"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /order
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/load-balance: "least_conn"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Hash consistente

El hash consistente dirige las solicitudes con la misma clave de hash al mismo Pod del backend. MSE Ingress admite el cálculo de hash mediante variables de NGINX, encabezados de solicitud o parámetros de consulta.

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/upstream-hash-by

Expresión de la clave de hash. Valores admitidos: variables de NGINX (por ejemplo, $remote_addr, $host, $request_uri), encabezados de solicitud ($http_<header-name>) y parámetros de consulta ($arg_<param-name>).

—

Sí (para el hash consistente)

Example 1: Calcule el hash por IP del cliente. Las solicitudes provenientes de la misma IP siempre llegarán al mismo Pod.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Example 2: Calcule el hash por el encabezado de solicitud X-Stage. Las solicitudes con el mismo valor de X-Stage siempre llegarán al mismo Pod.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x-stage"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Example 3: Calcule el hash por el parámetro de consulta x-stage. Las solicitudes con el mismo valor de x-stage siempre llegarán al mismo Pod.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_x-stage"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Calentamiento (inicio gradual)

La función de calentamiento aumenta gradualmente el tráfico hacia un Pod recién iniciado durante un periodo de tiempo especificado. Esto evita que un Pod frío reciba toda la carga de inmediato. Solo los algoritmos round robin y de menor cantidad de conexiones admiten el calentamiento.

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/warmup

Duración de la ventana de calentamiento en segundos. Cuando se inicia un nuevo Pod, el tráfico aumenta de forma gradual durante este periodo.

Calentamiento deshabilitado

No

Example: Habilite una ventana de calentamiento de 30 segundos para demo-service.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/warmup: "30"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/warmup: "30"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Afinidad por cookie (persistencia de sesión)

La afinidad por cookie fija un cliente al mismo Pod del backend en todas sus solicitudes mediante una cookie generada por la puerta de enlace. En la primera solicitud, MSE Ingress establece una cookie en la respuesta. Las solicitudes posteriores del mismo cliente incluyen esa cookie y se enrutan al mismo Pod.

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/affinity

Habilita la afinidad por cookie. El único valor válido es cookie.

—

Sí (para habilitar la afinidad por cookie)

nginx.ingress.kubernetes.io/affinity-mode

Modo de afinidad. El único valor válido es balanced.

balanced

No

nginx.ingress.kubernetes.io/session-cookie-name

Nombre de la cookie que se usa como clave de hash.

INGRESSCOOKIE

No

nginx.ingress.kubernetes.io/session-cookie-path

Atributo de ruta de la cookie generada.

/

No

nginx.ingress.kubernetes.io/session-cookie-max-age

Tiempo de expiración de la cookie generada, en segundos.

Limitado a la sesión

No

nginx.ingress.kubernetes.io/session-cookie-expires

Tiempo de expiración de la cookie generada, en segundos.

Limitado a la sesión

No

Example 1: Habilite la afinidad por cookie con los valores predeterminados: nombre de cookie INGRESSCOOKIE, ruta / y duración limitada a la sesión.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Example 2: Habilite la afinidad por cookie con una cookie personalizada llamada test, la ruta / y una expiración de 10 segundos.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "test"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "10"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "test"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "10"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Pool de conexiones entre una puerta de enlace y un servicio de backend

Configure un pool de conexiones para controlar la cantidad de conexiones entre la puerta de enlace y un servicio de backend. Esto evita que el backend se sobrecargue durante los picos de tráfico.

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/connection-policy-tcp-max-connection

Número máximo total de conexiones TCP entre la puerta de enlace y el servicio de backend.

—

No

mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint

Número máximo de conexiones TCP entre la puerta de enlace y un solo Pod del servicio de backend.

—

No

mse.ingress.kubernetes.io/connection-policy-http-max-request-per-connection

Número máximo de solicitudes HTTP por conexión entre la puerta de enlace y el servicio de backend.

—

No

Example: Para demo-service, establezca un máximo de 10 conexiones totales y 2 conexiones por Pod.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/connection-policy-tcp-max-connection: 10
    mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: 2
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/connection-policy-tcp-max-connection: 10
    mse.ingress.kubernetes.io/connection-policy-tcp-max-connection-per-endpoint: 2
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

Versiones de TLS y conjuntos de cifrado

El rango de versiones de TLS predeterminado para MSE Ingress abarca desde TLSv1.0 (la más antigua) hasta TLSv1.3 (la más reciente). Los conjuntos de cifrado predeterminados son los siguientes:

  • ECDHE-ECDSA-AES128-GCM-SHA256

  • ECDHE-RSA-AES128-GCM-SHA256

  • ECDHE-ECDSA-AES128-SHA

  • ECDHE-RSA-AES128-SHA

  • AES128-GCM-SHA256

  • AES128-SHA

  • ECDHE-ECDSA-AES256-GCM-SHA384

  • ECDHE-RSA-AES256-GCM-SHA384

  • ECDHE-ECDSA-AES256-SHA

  • ECDHE-RSA-AES256-SHA

  • AES256-GCM-SHA384

  • AES256-SHA

Utilice las siguientes anotaciones para configurar los ajustes de TLS por nombre de dominio.

Annotation

Description

Default

Required

mse.ingress.kubernetes.io/tls-min-protocol-version

Versión mínima de TLS aceptada. Valores válidos: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3.

TLSv1.0

No

mse.ingress.kubernetes.io/tls-max-protocol-version

Versión máxima de TLS aceptada.

TLSv1.3

No

nginx.ingress.kubernetes.io/ssl-cipher

Conjuntos de cifrado TLS separados por comas. Solo surte efecto para las versiones de TLS 1.0 a 1.2.

Consulte la lista predeterminada anterior

No

Example: Restrinja example.com únicamente a TLSv1.2.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
    mse.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    mse.ingress.kubernetes.io/tls-min-protocol-version: "TLSv1.2"
    mse.ingress.kubernetes.io/tls-max-protocol-version: "TLSv1.2"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80

TLS mutuo (mTLS) entre una puerta de enlace y un servicio de backend

De forma predeterminada, MSE Ingress usa HTTP para reenviar las solicitudes a los contenedores del backend. Cuando se establece nginx.ingress.kubernetes.io/backend-protocol: "HTTPS", MSE Ingress emplea TLS unidireccional: autentica el certificado del backend, el cual debe estar emitido por una autoridad certificadora (CA) reconocida.

Con el TLS mutuo (mTLS), tanto la puerta de enlace como el servicio de backend autentican mutuamente sus certificados.

Annotation

Description

Default

Required

nginx.ingress.kubernetes.io/proxy-ssl-secret

Certificado de cliente que usa la puerta de enlace para autenticarse ante el backend. Formato: secretNamespace/secretName.

—

Sí (para mTLS)

nginx.ingress.kubernetes.io/proxy-ssl-name

Server Name Indication (SNI) utilizado durante el handshake de TLS.

—

No

nginx.ingress.kubernetes.io/proxy-ssl-server-name

Habilita o deshabilita SNI durante el handshake de TLS.

—

No

Example: Configure mTLS entre la puerta de enlace y demo-service mediante gateway-cert en el namespace default.

Kubernetes v1.19 o posterior:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              service:
                name: demo-service
                port:
                  number: 80
            path: /test
            pathType: Exact

Versiones de Kubernetes anteriores a la v1.19:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-ssl-secret: "default/gateway-cert"
  name: demo
spec:
  ingressClassName: mse
  rules:
    - host: example.com
      http:
        paths:
          - path: /test
            backend:
              serviceName: demo-service
              servicePort: 80