Pourquoi l'état de mon composant master est-il « défectueux » lorsque j'utilise le contrôleur d'entrée NGINX avec Amazon EKS ?

Date de la dernière mise à jour : 13/12/2021

J'utilise le contrôleur d'entrée NGINX pour exposer la ressource d'entrée, mais mes composants master Amazon Elastic Kubernetes Service (Amazon EKS) n'utilisent pas Network Load Balancer.

Brève description

Le contrôleur d'entrée NGINX définit l'option Spec.ExternalTrafficPolicy sur Local pour conserver l'adresse IP du client. De plus, les demandes ne sont pas acheminées vers des composants master défectueux. Le dépannage suivant implique que vous n'avez pas besoin de conserver l'adresse IP du cluster ou de sauvegarder l'adresse IP du client.

Résolution

Vérifiez l'état de votre composant master :

Remarque : les exemples suivants sont basés sur le contrôleur d'entrée NGINX v1.0.2.

1.    Créez les ressources obligatoires pour le contrôleur d'entrée NGINX (à partir du site web de Kubernetes) dans votre cluster :

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.2/deploy/static/provider/aws/deploy.yaml

Par défaut, le contrôleur d'entrée NGINX crée le contrôleur d'entrée du service Kubernetes avec l'option .spec.ExternalTrafficPolicy définie sur Local (à partir du site web de GitHub).

2.    Vérifiez si la politique de trafic externe (à partir du site web de Kubernetes) est définie sur Local :

$ kubectl -n ingress-nginx describe svc ingress-nginx-controller

Sortie :

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>

Remarque : le paramètre Local supprime les paquets envoyés aux nœuds Kubernetes qui ne sont pas des instances en cours d’exécution du contrôleur d'entrée NGINX. Attribuez des pods NGINX (à partir du site web de Kubernetes) aux nœuds sur lesquels vous souhaitez planifier le contrôleur d'entrée NGINX.

3.    Vérifiez la commande iptables qui configure les règles DROP sur les nœuds qui ne sont pas des instances en cours d'exécution du contrôleur d'entrée 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

Définissez l'option de politique

Mettez à jour l'option PEC.ExternalTrafficPolicy sur Cluster :

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

Remarque : les services NodePort effectuent la traduction de l'adresse source (à partir du site web de Kubernetes) par défaut. Pour le contrôleur d'entrée NGINX, cela signifie que l'adresse IP source d'une demande HTTP est toujours l'adresse IP du nœud Kubernetes qui a reçu la demande. Si vous définissez un NodePort sur la valeur du champ ExternalTrafficPolicy dans la spécification de service ingress-nginx sur Cluster, vous ne pouvez pas conserver l'adresse IP source.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?