Amazon Elastic Kubernetes Service (Amazon EKS) クラスターでホストされているサービスに接続すると、接続タイムアウトが発生します。
簡単な説明
Amazon EKS クラスターでサービスに接続できない最も一般的な2つの理由は次のとおりです:
- セキュリティグループまたはネットワークアクセスコントロールリスト (ネットワーク ACL) の制限により、トラフィックがポッドエンドポイントに到達できなくなっています。
- ラベルが一致しないため、サービスはポッドエンドポイントを選択しません.
これらの問題を解決するには、ワーカーノードインスタンスとロードバランサーに関連付けられているセキュリティグループとネットワークACLを確認してください。また、サービスのポッドに正しいラベルが選択されていることを確認してください。
**注:**トラブルシューティングはサービスタイプによって異なります。アクセスできないサービスをトラブルシューティングする場合は、次の解決策が適用されます。Kubernetes Serviceタイプの詳細については、「Amazon EKS クラスターで実行されている Kubernetes サービスを公開するにはどうすればよいですか?を参照してください。
解決方法
セキュリティグループとネットワーク ACL を確認します
クラスタ IP
クラスター IP サービスタイプは、同じ Amazon EKS クラスターで実行されるマイクロサービス間の通信に使用されます。送信先ポッドが配置されているインスタンスにアタッチされているセキュリティグループに、クライアントポッドインスタンスからの通信を許可するインバウンドルールがあることを確認します。
ほとんどの場合、ワーカーノードのセキュリティグループのすべてのポートですべての通信を許可する self ルールがあります。それぞれが独自のセキュリティグループを持つ複数のノードグループを使用する場合は、セキュリティグループ間のすべての通信を許可するようにしてください。これにより、複数のノード間で実行されるマイクロサービスが簡単に通信できるようになります.
詳細については、Amazon EKS セキュリティグループの考慮事項を参照してください。
ノードポート
ワーカーノードセキュリティグループはノードポート サービス定義で指定されたポートでの着信トラフィックを許可する必要があります。サービス定義で指定されていない場合、ポートパラメーターの値はターゲットポート パラメーターと同じになります。このポートは Amazon EKS クラスターのすべてのノードで公開されます。
ワーカーノードサブネットにリンクされているネットワーク ACL を確認します。クライアントのIPアドレスが、サービスが使用するポートの許可リストに含まれていることを確認してください。
インターネット経由で Kubernetes サービスにアクセスしている場合は、ノードにパブリックIPアドレスがあることを確認してください。サービスにアクセスするには、ノードのパブリック IP アドレスとポートの組み合わせを使用する必要があります。
ロードバランサー
ロードバランサーセキュリティグループがリスナーポートを許可していることを確認します。また、ワーカーノードのセキュリティグループが、アプリケーションコンテナが実行されているポートを介したロードバランサーセキュリティグループからの着信トラフィックを許可していることを確認します。
サービス定義で指定されているポートがターゲットポート と異なる場合は、ロードバランサーセキュリティグループのワーカーノードセキュリティグループのポートを介した着信トラフィックを許可する必要があります。ポートとターゲットポート は、通常、サービス定義では同じです。
ネットワーク ACL では、クライアント IP アドレスがリスナーポートでロードバランサーに到達することを許可する必要があります。インターネット経由でロードバランサーにアクセスする場合は、パブリックロードバランサーを作成したことを確認します。
サービスがポッドエンドポイントを正しく選択しているか確認します
ポッドがサービスのバックエンドとして登録されていない場合、タイムアウトエラーが発生する可能性があります。これは、ブラウザから本サービスにアクセスした場合、または curl podIP:podPort コマンドを実行した場合に発生することがあります。
ポッドのラベルを確認し、サービスに適切なラベルセレクターがあることを確認します(Kubernetes Webサイトから)。
次のコマンドを実行して、Kubernetes サービスがポッドを正しく選択して登録したかどうかを確認します。
コマンド:
kubectl get pods -o wide
出力例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6799fc88d8-2rtn8 1/1 Running 0 3h4m 172.31.33.214 ip-172-31-33-109.us-west-2.compute.internal none none
コマンド:
kubectl describe svc your_service_name -n your_namespace
注: your_service_nameをサービス名に置き換え,your_namespaceを名前空間に置き換えます。
出力例:
Events: none
Session Affinity: none
Endpoints: 172.31.33.214:80
....
上記の出力例では、 172.31.33.214 は kubectl get pods-o wide コマンドの実行から取得したポッドの IP アドレスです。172.31.33.214 IP アドレスは、Amazon EKS クラスターで実行されているサービスのバックエンドとしても機能します。