¿Cómo configuro y soluciono los problemas de Ingress NGINX Controller en Amazon EKS?
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:
-
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 ... -
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
-
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 ... -
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:
-
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 ... -
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
-
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 -
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 -
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:
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.kubectl logs ingress-nginx-controller-pod-name -n ingress-nginx-namespace
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)
- Temas
- Containers
- Etiquetas
- Amazon Elastic Kubernetes Service
- Idioma
- Español

Contenido relevante
- preguntada hace 10 días
- preguntada hace 9 días
- preguntada hace 2 meses
- preguntada hace 10 meses