¿Por qué el estado de mi nodo de trabajo es “Unhealthy” (Incorrecto) cuando uso el controlador de entrada de NGINX con Amazon EKS?
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.
Contenido relevante
- OFICIAL DE AWSActualizada hace 8 meses
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 7 meses
- OFICIAL DE AWSActualizada hace 7 meses