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.