Comment configurer et résoudre les problèmes liés à Ingress NGINX Controller dans Amazon EKS ?
Je souhaite configurer Ingress NGINX Controller pour Kubernetes sur un cluster Amazon Elastic Kubernetes Service (Amazon EKS). Je souhaite également résoudre les problèmes.
Brève description
Ingress NGINX Controller déploie, configure et gère des pods contenant des instances de NGINX, un serveur HTTP open source et un serveur proxy inverse. Ces pods sont exposés via la ressource de service du contrôleur. La ressource de service reçoit le trafic pour les applications pertinentes que représentent les ressources d’entrée et de service Kubernetes. Pour plus d'informations, consultez la page Ingress NGINX Controller sur le site Web de GitHub et la page NGINX sur le site Web de NGINX.
Résolution
Facultatif : Installez Helm. Pour plus d'informations, consultez la section Installation de Helm sur le site Web de Helm. Helm n'est pas nécessaire lorsque vous utilisez un manifeste YAML pour installer Ingress NGINX Controller.
Facultatif : Déployez le contrôleur AWS Load Balancer Controller. Ce contrôleur est nécessaire pour configurer le type de cible du groupe cible du Network Load Balancer sur le type de cible IP. Le type de cible IP enregistre les adresses IP du pod Ingress NGINX Controller dans le groupe cible. Le type de cible d'instance utilise le service Ingress NGINX Controller sur NodePort pour enregistrer l'instance.
Installer Ingress INGINX Controller
Utilisez l'une des méthodes suivantes pour installer Ingress NGINX Controller dans un cluster Kubernetes :
Utilisez le fichier manifeste YAML qui définit tous les différents composants. Utilisez kubectl pour créer les ressources dans le manifeste.
-ou-
Utilisez Helm pour déployer Ingress NGINX Controller via le graphique de référentiel du projet.
Vous pouvez exposer Ingress NGINX Controller en externe via un AWS Classic Load Balancer ou un AWS Network Load Balancer. Par défaut, les deux méthodes exposent le contrôleur via un Classic Load Balancer connecté à Internet.
Utiliser Helm pour déployer Ingress NGINX Controller
Utilisez la commande appropriée pour configurer et exposer le contrôleur :
Classic Load Balancer connecté à Internet
helm upgrade --install ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ ingress-nginx
Classic Load Balancer interne
Vous devez ajouter l'annotation suivante sur le service Kubernetes qui expose le contrôleur Ingress NGINX Controller :
service.beta.kubernetes.io/aws-load-balancer-internal : vrai
Exemple :
Network Load Balancer connecté à Internet
Pour modifier l'équilibreur de charge du type Classique à Réseau, ajoutez l'annotation suivante :
service.beta.kubernetes.io/aws-load-balancer-type : nlb
Exemple :
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 interne
Pour configurer un Network Load Balancer interne, ajoutez les annotations suivantes :
service.beta.kubernetes.io/aws-load-balancer-type : nlb
service.beta.kubernetes.io/aws-load-balancer-internal : vrai
Exemple :
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 en mode IP via AWS Load Balancer Controller
AWS Load Balancer Controller doit être installé sur le cluster. Pour en savoir plus, consultez la page AWS Load Balancer Controller sur le site Web de GitHub.
Utilisez l'annotation suivante pour vous assurer qu’AWS Load Balancer Controller prend en charge le provisionnement du Network Load Balancer :
service.beta.kubernetes.io/aws-load-balancer-type : externe
Par défaut, le système crée un Network Load Balancer interne. Toutefois, vous pouvez ajouter l'annotation suivante pour créer un Network Load Balancer connecté à Internet avec le type de cible du groupe cible IP :
service.beta.kubernetes.io/aws-load-balancer-scheme : connecté à Internet
Exemple :
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
Utiliser les fichiers manifestes kubectl et YAML
Téléchargez le fichier manifeste YAML. La commande suivante télécharge la version 1.11.2 d'Ingress NGINX Controller :
curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml
Remarque : Vous pouvez remplacer la valeur par d'autres versions de contrôleur. Pour en savoir plus, consultez la page Identifications sur le site Web de GitHub. Dans certains cas, vous devez annoter le service Load Balancer de Kubernetes ingress-nginx-controller pour modifier le type et les propriétés de l'équilibreur de charge provisionné par le système.
Exemple :
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 connecté à Internet
Vous pouvez appliquer le manifeste au cluster sans aucune modification. Exécutez la commande suivante :
kubectl apply -f ingress-nginx.yaml
Classic Load Balancer interne
Procédez comme suit :
-
Modifiez le manifeste YAML pour ajouter une section d'annotations qui spécifie l'annotation suivante :
service.beta.kubernetes.io/aws-load-balancer-internal : vrai
Exemple :... apiVersion: v1 kind: Service metadata: ... name: ingress-nginx-controller namespace: ingress-nginx annotations: service.beta.kubernetes.io/aws-load-balancer-internal: true ... type: LoadBalancer ... -
Exécutez la commande suivante pour appliquer le manifeste à votre cluster :
kubectl apply -f ingress-nginx.yaml
Network Load Balancer connecté à Internet
-
Utilisez l'annotation suivante pour créer un Network Load Balancer :
service.beta.kubernetes.io/aws-load-balancer-type : nlb
Exemple :... apiVersion: v1 kind: Service metadata: ... name: ingress-nginx-controller namespace: ingress-nginx annotations: service.beta.kubernetes.io/aws-load-balancer-type: nlb ... type: LoadBalancer ... -
Exécutez la commande suivante pour appliquer le manifeste à votre cluster :
service.beta.kubernetes.io/aws-load-balancer-type : nlb
Exemple :kubectl apply -f ingress-nginx.yaml
Network Load Balancer interne :
-
Utilisez les annotations suivantes conjointement pour créer un Network Load Balancer interne :
service.beta.kubernetes.io/aws-load-balancer-type : nlb
service.beta.kubernetes.io/aws-load-balancer-internal : vrai
Exemple :... 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 ... -
Exécutez la commande suivante pour appliquer le manifeste à votre cluster :
kubectl apply -f ingress-nginx.yaml
Network Load Balancer en mode IP via AWS Load Balancer Controller
-
Installez le contrôleur AWS Load Balancer Controller dans le cluster. Pour en savoir plus, consultez la page AWS Load Balancer Controller sur le site Web de GitHub. Utilisez l'annotation suivante pour qu’AWS Load Balancer Controller provisionne un Network Load Balancer :
service.beta.kubernetes.io/aws-load-balancer-type: external -
Par défaut, le système crée un Network Load Balancer interne. Pour créer un Network Load Balancer connecté à Internet avec le type de cible du groupe cible comme IP, ajoutez l'annotation suivante :
service.beta.kubernetes.io/aws-load-balancer-scheme : connecté à Internet
Exemple :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 -
Exécutez la commande suivante pour appliquer le manifeste à votre cluster :
kubectl apply -f ingress-nginx.yaml
Résoudre les problèmes
Pour plus d'informations, consultez la page Résolution de problèmes sur le site Web de GitHub.
Erreur de sous-réseau
Si le Network Load Balancer ne parvient pas à détecter automatiquement le sous-réseau, le message d'erreur suivant peut s'afficher :
« Reconciler error","controller":"ingress",...,"error":"couldn't auto-discover subnets: unable to resolve at least one subnet »
AWS Load Balancer Controller utilise des identifications de sous-réseau pour rechercher automatiquement les sous-réseaux à utiliser pour les équilibreurs de charge. Pour les AWS Load Balancers, le contrôleur nécessite au moins deux sous-réseaux dans des zones de disponibilité différentes. Pour les Network Load Balancers, le contrôleur nécessite au moins un sous-réseau. Pour la détection automatique, vous devez identifier les sous-réseaux :
- Identifiez les sous-réseaux publics avec la clé kubernetes.io/role/elb. Définissez la valeur sur 1.
- Identifiez les sous-réseaux privés avec la clé kubernetes.io/role/internal-elb. Définissez la valeur sur 1.
- Si vous utilisez AWS Load Balancer Controller version 2.1.1 et antérieures, identifiez les sous-réseaux publics et privés avec la clé kubernetes.io/cluster/your-cluster-name. Définissez la valeur sur détenu ou partagé.
Le champ d'adresse n'affiche pas kubectl get ni describe ingress
Lorsque vous exécutez la commande kubectl get ingress your-ingress-name, le champ d'adresse est peut-être vide. Ou bien, kubectl describe ingress peut ne pas afficher d'adresse attribuée. Dans l'un ou l'autre de ces scénarios, procédez comme suit :
- Décrivez la ressource Ingress pour vérifier si elle utilise l'annotation ingressClassName ou kubernetes.io/ingress.class correcte. Le nom IngressClass du contrôleur Ingress NGINX Controller doit correspondre à la valeur du champ ingressClassName ou kubernetes.io/ingress.class annotation. Si elle ne correspond pas, configurez la ressource IngressClass de NGINX Controller comme unique IngressClass par défaut pour le cluster. Pour plus d'informations, consultez la page IngressClass par défaut sur le site Web de Kubernetes.
- Décrivez la ressource Ingress pour voir si des erreurs ont été ajoutées aux événements par Ingress NGINX Controller. En l’absence d'événements, cela signifie que les événements ont atteint leur limite de durée de vie. Ou bien, Ingress NGINX Controller ne peut pas détecter les entrées sur lesquelles il doit intervenir.
- Exécutez la commande suivante pour vérifier les journaux des pods Ingress NGINX Controller pour détecter le contrôle d'accès basé sur des rôles (RBAC) ou d'autres erreurs associées :
Remarque : Remplacez ingress-nginx-controller-pod-name par le nom du pod de votre contrôleur Ingress NGINX Controller. Remplacez ingress-nginx-namespace par le nom de votre espace de noms Ingress NGINX.kubectl logs ingress-nginx-controller-pod-name -n ingress-nginx-namespace
Journaux d'accès et de requêtes
Consultez le format de journal par défaut du contrôleur Ingress NGINX Controller pour trouver des informations sur des requêtes et des réponses spécifiques. Pour ce faire, reportez-vous à la page Format de journal sur le site Web de GitHub. Dans l'exemple suivant, le format de journal par défaut correspond à l'exemple de journal suivant. Il indique que l'adresse IP et le port de la cible dorsale sont 192.168.114.102.80 et que la réponse HTTP de la cible dorsale est 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
Informations connexes
Exposition des applications Kubernetes, partie 3 : Ingress-Nginx Controller
- Sujets
- Containers
- Langue
- Français

Contenus pertinents
- demandé il y a 3 ans