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.