¿Por qué el estado de mi nodo de trabajo es «Incorrecto» cuando uso el controlador de entrada de NGINX con Amazon EKS?

Última actualización: 2021-12-13

Utilizo el controlador de entrada de NGINX para exponer el recurso de entrada, pero mis nodos de trabajo de Amazon Elastic Kubernetes Service (Amazon EKS) no pueden utilizar el balanceador de carga de red.

Descripción breve

El controlador de entrada de NGINX establece la opción spec.externalTrafficPolicy en Local a fin de preservar la IP de cliente. Además, las solicitudes no se dirigen a los nodos de trabajo incorrectos. La siguiente solución de problemas implica que no necesitará mantener la dirección IP del clúster ni conservar la dirección IP de cliente.

Resolución

Verifique el estado de su nodo de trabajo

Nota: Los siguientes ejemplos usan el controlador de entrada de NGINX v1.0.2.

1.    Cree los recursos obligatorios para el controlador de entrada de NGINX (desde el sitio web de Kubernetes) en su clúster:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.2/deploy/static/provider/aws/deploy.yaml

El controlador de entrada de NGINX creará de forma predeterminada el controlador ingress-nginx-controller de Kubernetes Service con la opción .spec.externalTrafficPolicy establecida en Local (desde el sitio web de GitHub).

2.    Verifique que la política de tráfico externa (del sitio web de Kubernetes) esté establecida en Local:

$ kubectl -n ingress-nginx describe svc ingress-nginx-controller

Salida:

Name:                     ingress-nginx-controller
Namespace:                ingress-nginx
Labels:                   app.kubernetes.io/component=controller
                          app.kubernetes.io/instance=ingress-nginx
                          app.kubernetes.io/managed-by=Helm
                          app.kubernetes.io/name=ingress-nginx
                          app.kubernetes.io/version=1.0.2
                          helm.sh/chart=ingress-nginx-4.0.3
Annotations:              service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
                          service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: true
                          service.beta.kubernetes.io/aws-load-balancer-type: nlb
Selector:                 app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
Type:                     LoadBalancer
IP Families:              <none>
IP:                       10.100.115.226
IPs:                      10.100.115.226
LoadBalancer Ingress:     a02245e77404f4707a725d0b977425aa-5b97f717658e49b9.elb.eu-west-1.amazonaws.com
Port:                     http  80/TCP
TargetPort:               http/TCP
NodePort:                 http  31748/TCP
Endpoints:                192.168.43.203:80
Port:                     https  443/TCP
TargetPort:               https/TCP
NodePort:                 https  30045/TCP
Endpoints:                192.168.43.203:443
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     30424
Events:                   <none>

Nota: La configuración local descarta los paquetes que se envían a los nodos de Kubernetes que no sean instancias de ejecución del controlador de entrada de NGINX. Asigne pods de NGINX (desde el sitio web de Kubernetes) a los nodos en los que desea programar el controlador de entrada de NGINX.

3.    Verifique el comando de iptables que configura las reglas de ELIMINACIÓN en los nodos que no sean instancias de ejecución del controlador de entrada de NGINX:

$ sudo iptables-save | grep -i "no local endpoints"
-A KUBE-XLB-CG5I4G2RS3ZVWGLK -m comment --comment "ingress-nginx/ingress-nginx-controller:http has no local endpoints
        " -j KUBE-MARK-DROP
-A KUBE-XLB-EDNDUDH2C75GIR6O -m comment --comment "ingress-nginx/ingress-nginx-controller:https has no local endpoints " -j KUBE-MARK-DROP

Establezca la opción de política

Actualice la opción pec.externalTrafficPolicy a Clúster:

$ kubectl -n ingress-nginx patch service ingress-nginx-controller -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'
service/ingress-nginx-controller patched

Nota: Los servicios de NodePort realizan la traducción de direcciones de origen de forma predeterminada (desde el sitio web de Kubernetes). Para NGINX, esto implica que la IP de origen de una solicitud HTTP siempre será la dirección IP del nodo de Kubernetes que recibió la solicitud. Si establece un NodePort en el valor del campo externalTrafficPolicy en la especificación del servicio ingress-nginx en Clúster, no podrá mantener la dirección IP de origen.


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?