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

Lecture de 3 minute(s)
0

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

Brève description

Pour conserver l'adresse IP du client, le contrôleur d'entrée NGINX définit l'option spec.externalTrafficPolicy sur Local. En outre, il achemine les demandes uniquement vers des composants master sains.

Pour résoudre les problèmes liés à l'état de vos composants master et mettre à jour votre politique de trafic, procédez comme suit.

Remarque : il n'est pas nécessaire de conserver l'adresse IP du cluster ou celle du client.

Solution

Vérifiez l'état de vos composants master

Remarque : les exemples suivants sont basés sur le contrôleur d'entrée NGINX v1.5.1 exécuté sur un cluster EKS v1.23.

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.5.1/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 (français non garanti) (à partir du site web de Kubernetes) est définie sur Local :

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

Vous recevez un résultat similaire au suivant :

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 et ne nécessite pas d'exécuter des instances du contrôleur d'entrée NGINX. Attribuez des pods NGINX (français non garanti) (à 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 spec.externalTrafficPolicy sur Cluster :

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

Par défaut, les services NodePort effectuent la traduction de l'adresse IP source (français non garanti) (à partir du site web de Kubernetes). Pour NGINX, cela signifie que l'adresse IP source d'une requête HTTP est toujours l'adresse IP du nœud Kubernetes qui a reçu la demande. Si vous définissez externalTrafficPolicy (.spec.externalTrafficPolicy) sur Cluster dans la spécification du service ingress-nginx, le trafic entrant ne conserve pas l'adresse IP source. Pour plus d'informations, consultez la section Conservation de l'adresse IP source du client (français non garanti) sur le site web de Kubernetes.


AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an