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

3 minuti di lettura
0

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

Breve descrizione

Per preservare l'IP del client, il controller di ingresso NGINX imposta l'opzione spec.externalTrafficPolicy su Local. Inoltre, indirizza le richieste solo ai nodi worker integri.

Per risolvere i problemi relativi allo stato dei nodi worker e aggiornare la policy del traffico, consulta i seguenti passaggi.

Nota: non è necessario mantenere l'indirizzo IP del cluster o preservare l'indirizzo IP del client.

Risoluzione

Controlla lo stato di integrità dei tuoi nodi worker

Nota: i seguenti esempi utilizzano il controller di ingresso NGINX v1.5.1 in esecuzione su EKS Cluster v1.23.

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

Riceverai un output simile al seguente:

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 devono eseguire istanze del controller di ingresso NGINX. Assegna i pod NGINX (dal sito Web Kubernetes) ai nodi per 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 spec.externalTrafficPolicy su Cluster:

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

Di default, i servizi NodePort eseguono la traduzione dell'indirizzo IP di origine (dal sito Web Kubernetes). Per NGINX, ciò significa che l'indirizzo IP di origine di una richiesta HTTP è sempre l'indirizzo IP del nodo Kubernetes che ha ricevuto la richiesta. Se imposti externalTrafficPolicy (.spec.ExternalTrafficPolicy) su Cluster nella specifica del servizio ingress-nginx, il traffico in entrata non conserva l'indirizzo IP di origine. Per ulteriori informazioni, consulta Conservazione dell'indirizzo IP di origine del client (sul sito Web di Kubernetes).


AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa