Amazon EKS で 504 HTTP エラーを解決する方法を教えてください。
最終更新日: 2021 年 12 月 3 日
Amazon Elastic Kubernetes Service (Amazon EKS) クラスターで実行されている Kubernetes Service に接続すると、HTTP 504 (ゲートウェイタイムアウト) エラーが発生します。
簡単な説明
ロードバランサー用に設定された Amazon EKS クラスターにある Kubernetes Service ポッドに接続すると、HTTP 504 エラーが発生します。
HTTP 503 エラーを解決するには、「How do I resolve HTTP 503 (Service unavailable) errors when I access a Kubernetes Service in an Amazon EKS cluster?」を参照してください。
HTTP 504 エラーを解決するには、次のトラブルシューティング手順を実行します。
解決方法
ロードバランサーのアイドル状態のタイムアウト時間が適切に設定されていることを確認します。
ロードバランサーは接続を確立していますが、アイドル状態のタイムアウト時間以内にターゲットが応答しませんでした。Classic Load Balancer と Application Load Balancer では、アイドル状態のデフォルトのタイムアウト時間は、60 秒です。
1. Classic Load Balancer もしくは Application Load Balancer 用の、Amazon CloudWatch メトリクスを確認します。
注意: レイテンシーのデータポイントがロードバランサーで設定されているタイムアウト時間の値と等しく、HTTPCode_ELB_5XX メトリクスにデータポイントが存在する場合には、少なくとも 1 つのリクエストでタイムアウトが発生しています。
2. HTTP リクエストの処理がアイドル状態のタイムアウト時間以内に完了できるよう、ロードバランサーのタイムアウト時間を修正します。あるいは、アプリケーションの設定を、応答が早くなるように変更します。
Classic Load Balancer のアイドル状態のタイムアウトを変更するには、service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout アノテーションを含むようにサービスの定義を更新します。
Application Load Balancer のアイドル状態のタイムアウトを変更するには、alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds アノテーションを含むようにイングレスの定義を更新します。
バックエンドインスタンスで、バックエンド接続エラーが起きていないことを確認する
ロードバランサーがアイドル状態のタイムアウトに達する以前に、バックエンドインスタンスにより TCP 接続が終了された場合、ロードバランサーはリクエストに対応できません。
1. Classic Load Balancer については CloudWatch BackendConnectionErrors メトリクスを確認し、Application Load Balancer についてはターゲットグループの TargetConnectionErrorCount を確認します。
2. バックエンドのワーカーノードもしくはポッドで、keep-alive 設定を有効化します。さらに、keep-alive タイムアウト値を、ロードバランサーのアイドル状態アイムアウトより大きな値に設定します。
keep-alive タイムアウトがアイドル状態のタイムアウトより小さいかどうかは、ポッドもしくはワーカーノードで、keep-alive 値を見ることで確認できます。ポッドとノードに関する例を、次に示します。
ポッドでの例:
$ kubectl exec your-pod-name -- sysctl \
出力:
net.ipv4.tcp_keepalive_time \
net.ipv4.tcp_keepalive_intvl \
net.ipv4.tcp_keepalive_probes
ノードでの例:
$ sysctl \
出力:
net.ipv4.tcp_keepalive_time \
net.ipv4.tcp_keepalive_intvl \
net.ipv4.tcp_keepalive_probes
ロードバランサーからのトラフィックを、一時ポート範囲でバックエンドターゲットが受信できることを確認します。
一時ポート (1024-65535) での、ターゲットからロードバランサーノードへのトラフィックが、サブネット用のネットワークアクセスコントロールリスト (ACL) で許可されていません。
ロードバランサーとバックエンドターゲットの間でデータが移動できるように、セキュリティグループとネットワーク ACL を設定する必要があります。例えば、ロードバランサーのタイプに応じて、これらのターゲットは IP アドレスやインスタンスになります。
一時ポートアクセスのためのセキュリティグループを設定するには、そのセキュリティグループ内のノードおよびポッド用のエグレスルールを、ロードバランサーのセキュリティグループに接続する必要があります。詳細については、「VPC のセキュリティグループ」および「ルールの追加と削除」を参照してください。