Saltar al contenido

¿Cómo configuro y soluciono los problemas de Ingress NGINX Controller en Amazon EKS?

9 minutos de lectura
0

Quiero configurar Ingress NGINX Controller para Kubernetes en un clúster de Amazon Elastic Kubernetes Service (Amazon EKS). También quiero solucionar problemas.

Descripción corta

Ingress NGINX Controller despliega, configura y administra los pods que contienen instancias de NGINX, un servidor HTTP y proxy inverso de código abierto. Estos pods están expuestos a través del recurso de servicio del controlador. El recurso de servicio recibe el tráfico de las aplicaciones relevantes que representan los recursos de ingreso y servicio de Kubernetes. Para obtener más información, consulta Ingress NGINX Controller en el sitio web de GitHub y NGINX en el sitio web de NGINX.

Resolución

Opcional: instala Helm. Para obtener más información, consulta Installing Helm (Instalación de Helm) en el sitio web de Helm. Helm no es necesario cuando usas un manifiesto de YAML para instalar Ingress NGINX Controller.

Opcional: instala AWS Load Balancer Controller. Este controlador es necesario para configurar el tipo de objetivo del grupo objetivo del equilibrador de carga de red en el tipo de objetivo de IP. El tipo de objetivo de IP registra las IP del pod de Ingress NGINX Controller en el grupo objetivo. El tipo de objetivo de la instancia usa el servicio Ingress NGINX Controller en NodePort para registrar la instancia.

Instalación de Ingress NGINX Controller

Utiliza uno de los métodos siguientes para instalar Ingress NGINX Controller en un clúster de Kubernetes:

Usa el archivo de manifiesto YAML que define todos los diferentes componentes. Usa kubectl para crear los recursos del manifiesto.

Alternativa:

Usa Helm para desplegar Ingress NGINX Controller a través del gráfico de repositorios del proyecto.

Puedes exponer Ingress NGINX Controller de forma externa mediante un equilibrador de carga clásico de AWS o un equilibrador de carga de red de AWS. De forma predeterminada, ambos métodos exponen el controlador a través de un equilibrador de carga clásico con conexión a Internet.

Uso de Helm para desplegar Ingress NGINX Controller

Usa el comando correspondiente para configurar y exponer el controlador:

Equilibrador de carga clásico con conexión a Internet

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
ingress-nginx

Equilibrador de carga clásico interno

Debes agregar la siguiente anotación en el servicio Kubernetes que expone Ingress NGINX Controller:

service.beta.kubernetes.io/aws-load-balancer-internal: true

Ejemplo:

Equilibrador de carga de red con conexión a Internet

Para cambiar el equilibrador de carga de clásico a red, agrega la siguiente anotación:

service.beta.kubernetes.io/aws-load-balancer-type: nlb

Ejemplo:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \
ingress-nginx

Equilibrador de carga de red interno

Para aprovisionar un equilibrador de carga de red interno, agrega las siguientes anotaciones:

service.beta.kubernetes.io/aws-load-balancer-type: nlb

service.beta.kubernetes.io/aws-load-balancer-internal: true

Ejemplo:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-internal"="true" \
ingress-nginx

Equilibrador de carga de red en modo IP a través de AWS Load Balancer Controller

El clúster debe tener instalado AWS Load Balancer Controller. Para obtener más información, consulta AWS Load Balancer Controller en el sitio web de GitHub.

Utiliza la siguiente anotación para asegurarte de que AWS Load Balancer Controller se haga cargo del aprovisionamiento del equilibrador de carga de red:

service.beta.kubernetes.io/aws-load-balancer-type: external

De forma predeterminada, el sistema crea un equilibrador de carga de red interno. Sin embargo, puedes agregar la siguiente anotación para crear un equilibrador de carga de red con conexión a Internet con el tipo de objetivo del grupo objetivo de IP:

service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing

Ejemplo:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="external" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-scheme"="internet-facing" \
ingress-nginx

Uso de archivos de manifiesto YAML y kubectl

Descarga el archivo de manifiesto YAML. El siguiente comando descarga la versión 1.11.2 de Ingress NGINX Controller:

curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

Nota: Puedes sustituir el valor por otras versiones del controlador. Para obtener más información, consulta Tags (Etiquetas) en el sitio web de GitHub. En algunos casos, debes hacer anotaciones en el servicio de equilibrador de carga de Kubernetes ingress-nginx-controller para cambiar el tipo y las propiedades del equilibrador de carga que el sistema aprovisiona.

Ejemplo:

curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

Equilibrador de carga clásico con conexión a Internet

Puedes aplicar el manifiesto al clúster sin ninguna modificación. Ejecuta el siguiente comando:

kubectl apply -f ingress-nginx.yaml

Equilibrador de carga clásico interno

Sigue estos pasos:

  1. Modifica el manifiesto de YAML para agregar una sección de anotaciones que especifique la siguiente anotación:
    service.beta.kubernetes.io/aws-load-balancer-internal: true
    Ejemplo:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: true
      ...
    type: LoadBalancer
    ...
  2. Ejecuta el siguiente comando para aplicar el manifiesto a tu clúster:

    kubectl apply -f ingress-nginx.yaml

Equilibrador de carga de red con conexión a Internet

  1. Usa la siguiente anotación para crear un equilibrador de carga de red:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    Ejemplo:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
      ...
    type: LoadBalancer
    ...
  2. Ejecuta el siguiente comando para aplicar el manifiesto a tu clúster:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    Ejemplo:

    kubectl apply -f ingress-nginx.yaml

Equilibrador de carga de red interno:

  1. Usa las siguientes anotaciones juntas para crear un equilibrador de carga de red interno:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    service.beta.kubernetes.io/aws-load-balancer-internal: true
    Ejemplo:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
        service.beta.kubernetes.io/aws-load-balancer-internal: true
      ...
    type: LoadBalancer
    ...
  2. Ejecuta el siguiente comando para aplicar el manifiesto a tu clúster:

    kubectl apply -f ingress-nginx.yaml

Equilibrador de carga de red en modo IP a través de AWS Load Balancer Controller

  1. Instala AWS Load Balancer Controller en el clúster. Para obtener más información, consulta AWS Load Balancer Controller en el sitio web de GitHub. Utiliza la siguiente anotación para hacer que AWS Load Balancer Controller aprovisione un equilibrador de carga de red:

    service.beta.kubernetes.io/aws-load-balancer-type: external
  2. De forma predeterminada, el sistema crea un equilibrador de carga de red interno. Para crear un equilibrador de carga de red con conexión a Internet con el tipo de objetivo del grupo objetivo como IP, agrega la siguiente anotación:
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    Ejemplo:

    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: external
        service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
      ...
    type: LoadBalancer
  3. Ejecuta el siguiente comando para aplicar el manifiesto a tu clúster:

    kubectl apply -f ingress-nginx.yaml

Solución de problemas

Para obtener más información, consulta Troubleshooting (Solución de problemas) en el sitio web de GitHub.

Error de subred

Si el equilibrador de carga de red no puede detectar automáticamente la subred, es posible que recibas el siguiente mensaje de error:

«"Reconciler error","controller":"ingress",...,"error":"couldn't auto-discover subnets: unable to resolve at least one subnet»

AWS Load Balancer Controller usa etiquetas de subred para buscar automáticamente las subredes que se usarán en los equilibradores de carga. En el caso de los equilibradores de carga de AWS, el controlador necesita al menos dos subredes en diferentes zonas de disponibilidad. En el caso de los equilibradores de carga de red, el controlador necesita al menos una subred. Para la detección automática, debes etiquetar las subredes:

  • Etiqueta las subredes públicas con la clave kubernetes.io/role/elb. Establece el valor en 1.
  • Etiqueta las subredes privadas con la clave kubernetes.io/role/internal-elb. Establece el valor en 1.
  • Si usas la versión 2.1.1 y anteriores de AWS Load Balancer Controller, etiqueta las subredes públicas y privadas con la clave kubernetes.io/cluster/your-cluster-name. Establece el valor como propio o compartido.

El campo de dirección no muestra que kubectl obtenga o describa el ingreso

Al ejecutar el comando kubectl get ingress your-ingress-name, es posible que el campo de dirección esté vacío. O bien, es posible que kubectl describe ingress no muestre una dirección asignada. En cualquiera de estos escenarios, lleva a cabo las siguientes acciones:

  • Describe el recurso de ingreso para verificar si usa la anotación ingressClassName o kubernetes.io/ingress.class correcta. El nombre de IngressClass de Ingress NGINX Controller debe coincidir con el valor del campo ingressClassName o kubernetes.io/ingress.class annotation. Si no coincide, configura el recurso IngressClass de Ingress NGINX Controller como el único IngressClass predeterminado del clúster. Para obtener más información, consulta Default IngressClass (IngressClass predeterminado) en el sitio web de Kubernetes.
  • Describe el recurso Ingress para ver si Ingress NGINX Controller ha agregado errores a los eventos. Si no hay eventos, significa que los eventos han alcanzado su límite de tiempo de vida. O bien, Ingress NGINX Controller no puede detectar los ingresos sobre los que debe tomar medidas.
  • Ejecuta el siguiente comando para comprobar los registros de los pods de Ingress NGINX Controller para el control de acceso basado en roles (RBAC) u otros errores relacionados:
    kubectl logs ingress-nginx-controller-pod-name -n ingress-nginx-namespace
    Nota: Sustituye ingress-nginx-controller-pod-name por el nombre de tu pod de Ingress NGINX Controller. Sustituye ingress-nginx-namespace por el nombre de tu espacio de nombres de Ingress NGINX.

Registros de acceso y solicitud

Revisa el formato de registro predeterminado de Ingress NGINX Controller para encontrar información sobre solicitudes y respuestas específicas. Para ello, consulta Log format (Formato de registro) en el sitio web de GitHub. En el ejemplo siguiente, el formato de registro predeterminado coincide con el siguiente registro de ejemplo. Muestra que la dirección IP y el puerto del objetivo del backend es 192.168.114.102.80 y que la respuesta HTTP del objetivo del backend es 200.

192.168.116.133 - - \[24/Sep/2024:22:14:59 +0000\] "GET / HTTP/1.1" 200 45 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_15\_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36" 524 0.003 \[default-apache-service-80\] \[\] 192.168.114.102:80 45 0.003 200 ffe584bdeb28959241e8d8408cfc06e5

Información relacionada

Exposing Kubernetes Applications, Part 3: Ingress-Nginx Controller (Parte 3 de la exposición de las aplicaciones de Kubernetes: Ingress-Nginx Controller)

OFICIAL DE AWSActualizada hace 2 meses