¿Por qué el estado de mi nodo de trabajo es “Unhealthy” (Incorrecto) cuando uso el controlador de entrada de NGINX con Amazon EKS?

3 minutos de lectura
0

Utilizo el controlador de entrada de NGINX para exponer el recurso de entrada. Sin embargo, mis nodos de trabajo de Amazon Elastic Kubernetes Service (Amazon EKS) no utilizan el equilibrador de carga de red.

Descripción breve

Para preservar la IP del cliente, el controlador de entrada de NGINX establece la opción spec.externalTrafficPolicy en Local. Además, enruta las solicitudes únicamente a nodos de trabajo con estado correcto.

Para solucionar problemas de estado de los nodos de trabajo y actualizar la política de tráfico, siga los siguientes pasos.

Nota: No es necesario mantener la dirección IP del clúster ni conservar la dirección IP del cliente.

Resolución

Verificar el estado de sus nodos de trabajo

Nota: Los siguientes ejemplos usan el controlador de entrada de NGINX v1.5.1. ejecutándose en un clúster de EKS v1.23.

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.5.1/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

Obtendrá un resultado similar al siguiente:

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 y no necesita ejecutar instancias del controlador de entrada de NGINX. Asigne pods de NGINX (desde el sitio web de Kubernetes) a los nodos para 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

Establecer la opción de política

Actualice la opción spec.externalTrafficPolicy a Cluster (Clúster):

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

De manera predeterminada, 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 dirección IP de origen de una solicitud HTTP siempre será la dirección IP del nodo de Kubernetes que recibió la solicitud. Si configura externalTrafficPolicy (.spec.ExternalTrafficPolicy) como Cluster (Clúster) en la especificación del servicio ingress-nginx, el tráfico entrante no conserva la dirección IP de origen. Para obtener más información, consulte Preserving the client source IP address (Conservar la dirección IP de origen del cliente) en el sitio web de Kubernetes.


OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año