Integración de Ingress NGINX con Sensedia Service Mesh

La instalación estándar de Sensedia Service Mesh utiliza Istio Ingress Gateway para exponer externamente los servicios presentes en el cluster. Para utilizar otro ingress (en el caso de que ya haya otro instalado en el cluster, por ejemplo), se requieren ajustes adicionales de instalación para que se respeten todas las reglas de seguridad y control de tráfico.

Esta página muestra cómo integrar Ingress NGINX con la instalación de Sensedia Service Mesh.

Integración del sidecar de Istio con Ingress NGINX

En primer lugar, es necesario añadir el sidecar de Istio a los pods del controller de Ingress NGINX, de forma que todas las peticiones de éste a los servicios del cluster pasen primero por el sidecar de Istio, que a su vez conoce y aplica las reglas configuradas.

Para esto, añada la label istio-injection: enabled al namespace donde está instalado Ingress NGINX, como en el siguiente ejemplo:

apiVersion: v1
kind: Namespace
metadata:
  name: ingress-nginx
  labels:
    istio-injection: enabled

Además de esta label, también debe añadirse la anotación sidecar.istio.io/inject: "true" a los pods del controller de Ingress NGINX. Si utiliza helm para la instalación/actualización, realice los siguientes cambios en el archivo helm-values.yaml:

controller:
  podAnnotations:
    sidecar.istio.io/inject: "true"
    traffic.sidecar.istio.io/includeInboundPorts: ""

  admissionWebhooks:
    patch:
      podAnnotations:
        sidecar.istio.io/inject: "false"

defaultBackend:
  podAnnotations:
    sidecar.istio.io/inject: "true"

Además de la anotación que permite inyectar el sidecar en los pods, la anotación traffic.sidecar.istio.io/includeInboundPorts: "" también es esencial para el funcionamiento. Por defecto, el sidecar intercepta tanto las peticiones entrantes como las salientes. Este comportamiento provocaría un conflicto con el container de Ingress NGINX. Por consiguiente, esta anotación desactiva la supervisión del tráfico entrante y sólo supervisa el saliente.

Exposición externa de un servicio

Es necesario realizar algunas modificaciones en los objetos Ingress de Kubernetes para que los servicios se expongan correctamente a través de Ingress NGINX y se integren al Sensedia Service Mesh. A continuación se muestra un ejemplo de un objeto Ingress con la configuración apropiada:

apiVersion:  networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-name
  namespace: ingress-namespace
  annotations:
    # Esta especificación garantiza que nginx utilizará la IP del servicio para el enrutamiento en lugar de la IP de los pods
    nginx.ingress.kubernetes.io/service-upstream: "true"
spec:
  ingressClassName: nginx
  rules:
  - host: "*.pod-info.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: pod-info
            port:
              number: 80

Como se indica en el ejemplo anterior, la anotación nginx.ingress.kubernetes.io/service-upstream: "true" es necesaria para indicar a NGINX que, en el enrutamiento de las peticiones, la IP que se debe utilizar es la del servicio, no la del pod. Esto es necesario para trabajar con estrategias avanzadas de despliegue en las que varios despliegues de diferentes versiones pueden compartir el mismo servicio, siendo Sensedia Service Mesh el encargado de gestionar el tráfico.

Una vez aplicado el objeto Ingress, los últimos ajustes deben realizarse directamente en la interfaz de Sensedia Service Mesh.

  1. En la pantalla de edición de malla, añada el host(s) de la aplicación, como en el ejemplo de la figura siguiente. Puede insertar varios hosts separados por comas.

    Los hosts insertados en este paso deben ser los mismos que los configurados en el objeto Ingress aplicado anteriormente.
    nginx hosts
    Registro de host(s) de la aplicación
  2. Por último, en la pantalla de configuración del servicio deseado, cree una regla de Traffic Routing de tipo "External".

    Al configurar la regla, el campo Bind to default ingress debe estar desmarcado, indicando que el ingress a utilizar no es el predeterminado (Istio Ingress Gateway), sino el Ingress NGINX:

    nginx traffic routing
    Creación de una regla de Traffic Routing con el campo "Bind to default ingress" desactivado
Thanks for your feedback!
EDIT

Share your suggestions with us!
Click here and then [+ Submit idea]