Amazon Elastic Kubernetes Service (Amazon EKS) クラスターで実行されている Kubernetes Service に接続すると、HTTP 504 (ゲートウェイタイムアウト) エラーが発生します。
簡単な説明
ロードバランサー用に設定された Amazon EKS クラスターにある Kubernetes Service ポッドに接続すると、HTTP 504 エラーが発生します。
HTTP 503 エラーを解決するには、「Amazon EKS クラスターで Kubernetes Service にアクセスした際に表示される、HTTP 503 (サービス利用不可) エラーを解決するにはどうすればよいですか?」を参照してください。
HTTP 504 エラーを解決するには、次のトラブルシューティング手順を実行します。
解決方法
ロードバランサーのアイドルタイムアウトが適切に設定されていることを確認する
ロードバランサーは接続を確立していますが、アイドルタイムアウト期間内にターゲットが応答しませんでした。Classic Load Balancer と Application Load Balancer では、アイドル状態のデフォルトのタイムアウト時間は、60 秒です。
1. Classic Load Balancer もしくは Application Load Balancer 用の、Amazon CloudWatch メトリクスを確認します。
注: 次の場合、少なくとも 1 つのリクエストがタイムアウトしています。
- レイテンシーデータポイントが、現在設定されているロードバランサーのタイムアウト値と等しい。
- HTTPCode_ELB_5XX メトリクスにデータポイントがある。
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
出力:
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
ロードバランサーからのトラフィックを、一時ポート範囲でバックエンドターゲットが受信できることを確認する
一時ポート (1024-65535) での、ターゲットからロードバランサーノードへのトラフィックが、サブネット用のネットワークアクセスコントロールリスト (ACL) で許可されていません。
ロードバランサーとバックエンドターゲットの間でデータが移動できるように、セキュリティグループとネットワーク ACL を設定する必要があります。例えば、ロードバランサーのタイプに応じて、これらのターゲットは IP アドレスやインスタンスになります。
一時ポートアクセス用のセキュリティグループを設定する必要があります。そのためには、そのセキュリティグループ内のノードおよびポッド用のエグレスルールを、ロードバランサーのセキュリティグループに接続する必要があります。詳細については、「Amazon Virtual Private Cloud (Amazon VPC) のセキュリティグループ」と「ルールの追加と削除」を参照してください。
関連情報
Classic Load Balancing を使用するように設定された EC2 インスタンスで実行されているウェブサーバーに接続すると、HTTP 5xx エラーが発生します。これらのエラーをトラブルシューティングするにはどうすればよいですか?
HTTP 504: Gateway timeout (HTTP 504: ゲートウェイタイムアウト)
Classic Load Balancer のモニタリング
Application Load Balancer の監視
Classic Load Balancer のトラブルシューティング: HTTP エラー