Come posso configurare e risolvere i problemi di Ingress NGINX Controller in Amazon EKS?
Desidero configurare Ingress NGINX Controller per Kubernetes in un cluster Amazon Elastic Kubernetes Service (Amazon EKS). Desidero anche risolvere i relativi problemi.
Breve descrizione
Ingress NGINX Controller implementa, configura e gestisce i pod che contengono istanze NGINX, un server HTTP e proxy inverso open source. Questi pod sono esposti tramite la risorsa servizio del controller. La risorsa servizio riceve il traffico per le applicazioni pertinenti rappresentate dalle risorse ingress e servizio di Kubernetes. Per ulteriori informazioni, consulta Ingress NGINX Controller sul sito web GitHub e NGINX sul sito web NGINX.
Risoluzione
Facoltativo: installa Helm. Per ulteriori informazioni, consulta Installing Helm (Installazione di Helm) sul sito web Helm. Helm non è richiesto quando si utilizza un manifesto YAML per installare Ingress NGINX Controller.
Facoltativo: installa AWS Load Balancer Controller. Questo controller è necessario per configurare il tipo di destinazione IP per il gruppo di destinazione del Network Load Balancer. Il tipo di destinazione IP registra gli IP dei pod di Ingress NGINX Controller nel gruppo di destinazione. Il tipo di destinazione dell'istanza utilizza il servizio Ingress NGINX Controller su NodePort per registrare l'istanza.
Installa Ingress INGINX Controller
Utilizza uno dei seguenti metodi per installare Ingress NGINX Controller in un cluster Kubernetes:
Utilizza il file manifesto YAML che definisce tutti i diversi componenti. Utilizza kubectl per creare le risorse nel manifesto.
-oppure-
Utilizza Helm per distribuire Ingress NGINX Controller tramite il grafico del repository del progetto.
Puoi esporre Ingress NGINX Controller esternamente tramite AWS Classic Load Balancer o AWS Network Load Balancer. Per impostazione predefinita, entrambi i metodi espongono il controller tramite un Classic Load Balancer connesso a Internet.
Utilizza Helm per distribuire Ingress NGINX Controller
Utilizza il comando applicabile per configurare ed esporre il controller:
Classic Load Balancer con accesso a Internet
helm upgrade --install ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ ingress-nginx
Classic Load Balancer interno
Devi aggiungere la seguente annotazione sul servizio Kubernetes che espone Ingress NGINX Controller:
service.beta.kubernetes.io/aws-load-balancer-internal: true
Esempio:
Network Load Balancer con accesso a Internet
Per cambiare il Load Balancer da Classic a Network, aggiungi la seguente annotazione:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
Esempio:
helm upgrade --install ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \ ingress-nginx
Network Load Balancer interno
Per eseguire il provisioning di un Network Load Balancer interno, aggiungi le seguenti annotazioni:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
service.beta.kubernetes.io/aws-load-balancer-internal: true
Esempio:
helm upgrade --install ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \ --set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-internal"="true" \ ingress-nginx
Network Load Balancer in modalità IP tramite AWS Load Balancer Controller
Nel cluster deve essere installato AWS Load Balancer Controller. Per altre informazioni, consulta AWS Load Balancer Controller sul sito web GitHub.
Utilizza la seguente annotazione per assicurarti che AWS Load Balancer Controller si occupi del provisioning del Network Load Balancer:
service.beta.kubernetes.io/aws-load-balancer-type: external
Per impostazione predefinita, il sistema crea un Network Load Balancer interno. Tuttavia, puoi aggiungere la seguente annotazione per creare un Network Load Balancer con accesso a Internet e tipo di destinazione IP per il gruppo di destinazione:
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
Esempio:
helm upgrade --install ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="external" \ --set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-scheme"="internet-facing" \ ingress-nginx
Utilizza i file manifesto kubectl e YAML
Scarica il file manifesto YAML. Il seguente comando scarica Ingress NGINX Controller versione 1.11.2:
curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml
Nota: puoi sostituire il valore con altre versioni del controller. Per ulteriori informazioni, consulta Tags (Tag) sul sito web GitHub. In alcuni casi, devi annotare il servizio del bilanciatore del carico Kubernetes ingress-nginx-controller per modificare il tipo e le proprietà del bilanciatore del carico fornito dal sistema.
Esempio:
curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml
Classic Load Balancer con accesso a Internet
Puoi applicare il manifesto al cluster senza alcuna modifica. Esegui questo comando:
kubectl apply -f ingress-nginx.yaml
Classic Load Balancer interno
Completa i seguenti passaggi:
-
Modifica il manifesto YAML per aggiungere una sezione di annotazioni che specifichi la seguente annotazione:
service.beta.kubernetes.io/aws-load-balancer-internal: true
Esempio:... apiVersion: v1 kind: Service metadata: ... name: ingress-nginx-controller namespace: ingress-nginx annotations: service.beta.kubernetes.io/aws-load-balancer-internal: true ... type: LoadBalancer ... -
Esegui questo comando per applicare il manifesto al cluster:
kubectl apply -f ingress-nginx.yaml
Network Load Balancer con accesso a Internet
-
Utilizza la seguente annotazione per creare un Network Load Balancer:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
Esempio:... apiVersion: v1 kind: Service metadata: ... name: ingress-nginx-controller namespace: ingress-nginx annotations: service.beta.kubernetes.io/aws-load-balancer-type: nlb ... type: LoadBalancer ... -
Esegui questo comando per applicare il manifesto al cluster:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
Esempio:kubectl apply -f ingress-nginx.yaml
Network Load Balancer interno:
-
Utilizza le seguenti annotazioni insieme per creare un Network Load Balancer interno:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
service.beta.kubernetes.io/aws-load-balancer-internal: true
Esempio:... apiVersion: v1 kind: Service metadata: ... name: ingress-nginx-controller namespace: ingress-nginx annotations: service.beta.kubernetes.io/aws-load-balancer-type: nlb service.beta.kubernetes.io/aws-load-balancer-internal: true ... type: LoadBalancer ... -
Esegui questo comando per applicare il manifesto al cluster:
kubectl apply -f ingress-nginx.yaml
Network Load Balancer in modalità IP tramite AWS Load Balancer Controller
-
Installa AWS Load Balancer Controller nel cluster. Per altre informazioni, consulta AWS Load Balancer Controller sul sito web GitHub. Utilizza la seguente annotazione per fare in modo che AWS Load Balancer Controller esegua il provisioning di un Network Load Balancer:
service.beta.kubernetes.io/aws-load-balancer-type: external -
Per impostazione predefinita, il sistema crea un Network Load Balancer interno. Per creare un Network Load Balancer con accesso a Internet e tipo di destinazione IP per il gruppo di destinazione, aggiungi la seguente annotazione:
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
Esempio:apiVersion: v1 kind: Service metadata: ... name: ingress-nginx-controller namespace: ingress-nginx annotations: service.beta.kubernetes.io/aws-load-balancer-type: external service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing ... type: LoadBalancer -
Esegui questo comando per applicare il manifesto al cluster:
kubectl apply -f ingress-nginx.yaml
Risolvi i problemi
Per ulteriori informazioni, consulta Troubleshooting (Risoluzione dei problemi) sul sito web GitHub.
Errore di sottorete
Se il Network Load Balancer non è in grado di rilevare automaticamente la sottorete, potresti ricevere il seguente messaggio di errore:
"Reconciler error","controller":"ingress",...,"error":"couldn't auto-discover subnets: unable to resolve at least one subnet"
AWS Load Balancer Controller utilizza i tag di sottorete per individuare automaticamente le sottoreti da utilizzare per i bilanciatori del carico. Per un AWS Load Balancer, il controller necessita di almeno due sottoreti in diverse zone di disponibilità. Per un Network Load Balancer, il controller necessita di almeno una sottorete. Per il rilevamento automatico, devi contrassegnare le sottoreti:
- Contrassegna le sottoreti pubbliche con la chiave kubernetes.io/role/elb. Imposta il valore su 1.
- Contrassegna le sottoreti private con la chiave kubernetes.io/role/internal-elb. Imposta il valore su 1.
- Se utilizzi AWS Load Balancer Controller versione 2.1.1 e precedenti, contrassegna le sottoreti pubbliche e private con la chiave kubernetes.io/cluster/your-cluster-name. Imposta il valore su owned (di proprietà) o shared (condivisa).
Il campo dell'indirizzo non mostra kubectl get or describe ingress
Quando esegui il comando kubectl get ingress your-ingress-name, il campo dell'indirizzo potrebbe essere vuoto. Oppure kubectl describe ingress potrebbe non mostrare un indirizzo assegnato. In uno di questi scenari, intraprendi le seguenti azioni:
- Descrivi la risorsa ingress per verificare se utilizza l'annotazione ingressClassName o kubernetes.io/ingress.class corretta. Il nome IngressClass di Ingress NGINX Controller deve corrispondere al valore del campo ingressClassName o dell'annotazione kubernetes.io/ingress.class. Se non corrisponde, configura la risorsa IngressClass di Ingress NGINX Controller come unica IngressClass predefinita del cluster. Per ulteriori informazioni, consulta Default IngressClass (IngressClass predefinita) sul sito web Kubernetes.
- Descrivi la risorsa Ingress per vedere se sono presenti errori aggiunti agli eventi da Ingress NGINX Controller. Se non sono presenti eventi, significa che gli eventi hanno raggiunto il limite Time To Live (TTL). Oppure Ingress NGINX Controller non è in grado di rilevare gli ingress su cui deve intervenire.
- Esegui questo comando per controllare la presenza di un errore Role-Based Access Control (RBAC) o di altri errori correlati nei log dei pod di Ingress NGINX Controller:
Nota: sostituisci ingress-nginx-controller-pod-name con il nome del pod del tuo Ingress NGINX Controller. Sostituisci ingress-nginx-namespace con il nome del tuo namespace Ingress NGINX.kubectl logs ingress-nginx-controller-pod-name -n ingress-nginx-namespace
Log degli accessi e delle richieste
Rivedi il formato di log predefinito di Ingress NGINX Controller per trovare informazioni su specifiche richieste e risposte. A tal fine, consulta Log format (Formato dei log) sul sito web GitHub. Nel seguente esempio, il formato di log predefinito corrisponde al seguente esempio di log. L'esempio mostra che l'indirizzo IP e porta della destinazione di backend è 192.168.114.102.80 e la risposta HTTP dalla destinazione di backend è 200.
192.168.116.133 - - \[24/Sep/2024:22:14:59 +0000\] "GET / HTTP/1.1" 200 45 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_15\_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36" 524 0.003 \[default-apache-service-80\] \[\] 192.168.114.102:80 45 0.003 200 ffe584bdeb28959241e8d8408cfc06e5
Informazioni correlate
Exposing Kubernetes Applications, Part 3: Ingress-Nginx Controller (Esposizione delle applicazioni Kubernetes, parte 3: Ingress-Nginx Controller)
- Argomenti
- Containers
- Lingua
- Italiano
