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?