Perché lo stato del mio nodo worker "non è integro" quando utilizzo il controller di ingresso NGINX con Amazon EKS?

Ultimo aggiornamento: 13/12/2021

Uso il controller di ingresso NGINX per esporre la risorsa in ingresso, ma i miei nodi worker Amazon Elastic Kubernetes Service (Amazon EKS) non riescono a utilizzare Network Load Balancer.

Breve descrizione

Il controller di ingresso NGINX imposta l'opzione spec.externalTrafficPolicy su Local per preservare l'IP del client. Inoltre, le richieste non vengono instradate a nodi worker non integri. La seguente risoluzione dei problemi implica che non è necessario mantenere l'indirizzo IP del cluster o conservare l'indirizzo IP del client.

Risoluzione

Controlla lo stato di integrità del tuo nodo worker

Nota: i seguenti esempi utilizzano il controller di ingresso NGINX v1.0.2.

1.    Crea le risorse obbligatorie il controller di ingresso NGINX (dal sito Web Kubernetes) nel tuo cluster:

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

Di default, il controller di ingresso NGINX crea il Kubernetes Service ingress-nginx-controller con l'opzione.spec.externalTrafficPolicy impostata su Local (dal sito Web GitHub).

2.    Controlla se la policy sul traffico esterno (dal sito Web di Kubernetes) è impostata su Locale:

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

Output:

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: l'impostazione Locale elimina i pacchetti che vengono inviati ai nodi Kubernetes che non eseguono istanze del controller di ingresso NGINX. Assegna i pod NGINX (dal sito Web Kubernetes) ai nodi su cui desideri pianificare il controller di ingresso NGINX.

3.    Controlla il comando iptables che imposta le regole DROP sui nodi che non eseguono istanze del controller di ingresso 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

Imposta l'opzione della policy

Aggiorna l'opzione pec.externalTrafficPolicy su Cluster:

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

Nota: di default, i servizi NodePort eseguono la traduzione dell'indirizzo di origine (dal sito Web Kubernetes). Per NGINX, ciò significa che l'IP di origine di una richiesta HTTP è sempre l'indirizzo IP del nodo Kubernetes che ha ricevuto la richiesta. Se imposti un NodePort sul valore del campo externalTrafficPolicy nella specifica del servizio ingress-nginx su Cluster, non puoi mantenere l'indirizzo IP di origine.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?