Comment puis-je résoudre les erreurs HTTP 504 dans Amazon EKS ?

Date de la dernière mise à jour : 17/02/2020

Je reçois des erreurs HTTP 504 lorsque je me connecte à mon service Kubernetes via un Classic Load Balancer ou un équilibreur de charge d'application dans Amazon Elastic Kubernetes Service (Amazon EKS).

Brève description

Les causes de vos erreurs HTTP 504 peuvent être les suivantes :

  • L'équilibreur de charge a établi une connexion avec la cible, mais la cible n'a pas répondu avant l'expiration du délai d'inactivité. Le délai d'inactivité par défaut pour le Classic Load Balancer et l'équilibreur de charge d'application est de 60 secondes.
  • L'équilibreur de charge n'a pas pu établir une connexion à la cible du serveur principal avant l'expiration du délai de connexion (10 secondes).
  • La liste de contrôle d'accès (ACL) réseau pour le sous-réseau n'autorise pas le trafic depuis les cibles vers les nœuds de l'équilibreur de charge sur les ports éphémères (1024-65535).

Résolution

Vérifier que le délai d'inactivité de votre équilibreur de charge est défini correctement

1.    Passez en revue les métriques Amazon CloudWatch pour votre Classic Load Balancer ou votre équilibreur de charge d'application.

Si les points de données de latence sont égaux à la valeur de délai d'inactivité de votre équilibreur de charge actuellement configuré et qu'il existe des points de données dans la métrique HTTPCode_ELB_5XX, c'est qu'une demande au moins a expiré.

2.    Modifiez le délai d'inactivité de votre équilibreur de charge afin que la demande HTTP puisse être terminée pendant le délai d'inactivité, ou configurez votre application pour qu'elle réponde plus rapidement.

Pour modifier le délai d'inactivité de votre Classic Load Balancer, mettez à jour la définition du service notamment en y incluant l'annotation service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout. Pour obtenir un exemple, consultez Autres annotations ELB.

Pour modifier le délai d'inactivité de votre équilibreur de charge d'application, mettez à jour la définition d'entrée pour inclure l'annotation alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds. Pour obtenir un exemple, consultez Annotations d'entrée.

Vérifiez que vos instances de backend n'ont pas d'erreurs de connexion au backend

Si une instance backend arrête une connexion TCP à l'équilibreur de charge avant que l'équilibreur de charge n'ait atteint sa valeur de délai d'inactivité, l'équilibreur de charge peut ne pas répondre à la demande.

1.    Passez en revue les métriques CloudWatch BackendConnectionErrors pour votre Classic Load Balancer et le paramètre TargetConnectionErrorCount du groupe cible pour votre équilibreur de charge d'application.

2.    Activez les paramètres keep-alive sur vos nœuds de travail backend et définissez le délai d'expiration keep-alive sur une valeur supérieure au délai d'inactivité de l'équilibreur de charge.

Pour voir si le délai d'inactivité keep-alive est inférieur au délai d'inactivité, vérifiez la valeur keep-alive dans vos pods ou nœud de travail. Consultez l'exemple suivant pour les pods et les nœuds :

Pour les pods :

$ kubectl exec your-pod-name -- sysctl \
    net.ipv4.tcp_keepalive_time \
    net.ipv4.tcp_keepalive_intvl \
    net.ipv4.tcp_keepalive_probes

Pour les nœuds :

$ sysctl \
    net.ipv4.tcp_keepalive_time \
    net.ipv4.tcp_keepalive_intvl \
    net.ipv4.tcp_keepalive_probes

Vérifiez que vos cibles backend peuvent recevoir le trafic de l'équilibreur de charge sur la plage de ports éphémères.

Vous devez configurer des groupes de sécurité et des listes ACL réseau pour permettre aux données de se déplacer entre l'équilibreur de charge et les cibles principales. Par exemple, ces cibles peuvent être des adresses IP ou des instances en fonction du type d'équilibreur de charge.

Pour configurer les groupes de sécurité pour l'accès aux ports éphémères, vous devez connecter la règle de sortie du groupe de sécurité de vos nœuds et pods au groupe de sécurité de votre équilibreur de charge. Pour plus d'informations, consultez Utilisation des groupes de sécurité et Ajout et suppression de règles.