Passer au contenu

Comment configurer et résoudre les problèmes liés à Ingress NGINX Controller dans Amazon EKS ?

Lecture de 8 minute(s)
0

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 :

  1. 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
    ...
  2. Exécutez la commande suivante pour appliquer le manifeste à votre cluster :

    kubectl apply -f ingress-nginx.yaml

Network Load Balancer connecté à Internet

  1. 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
    ...
  2. 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 :

  1. 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
    ...
  2. 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

  1. 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
  2. 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
  3. 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 :
    kubectl logs ingress-nginx-controller-pod-name -n ingress-nginx-namespace
    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.

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

AWS OFFICIELA mis à jour il y a 2 mois