Amazon Elastic Kubernetes Service (Amazon EKS) から他のサービスに接続しようとしたときに発生するエラーのトラブルシューティングをしたいと考えています。
簡単な説明
ポッドが他のサービスに接続できない場合、次のエラーが 1 つ以上表示されることがあります。
- RequestError: send request failed\\ncaused by: Post \\\"https://ec2.us-west-2.amazonaws.com/\\\": dial tcp <IP address>: i/o timeout\"\
- Couldn't connect to host, port: imap.mail.<region>.awsapps.com,<port>; timeout -1
- java.net .SocketTimeoutException: connect timed out
- Connection could not be created to jdbc:postgresql://<hostname>.<region>.rds.amazonaws.com:5432/
- <URL>.<region>.rds.amazonaws.com (<IPaddress>:3306): Operation timed out
- Error : java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=<hostname>.<region>.rds.amazonaws.com)(port=3306)(type=master) : Socket fail to connect to host:<hostname>.<region>.rds.amazonaws.com , port:3306. connect timed out***
- o.apache.kafka.clients.NetworkClient -[Producer clientId=producer-1] Connection to node -1 (<hostname>.c3.kafka.<region>.amazonaws.com/<IPaddress>:9092) could not be established.ブローカーが利用できない可能性があります。
これらのエラーは、Amazon Virtual Private Cloud (Amazon VPC) の設定が正しくないためにネットワーク接続の問題が発生したことが原因です。こうした問題を解決するには、以下に関連するセキュリティグループとネットワークアクセスコントロールリスト (ACL) を確認してください。
- ワーカーノードインスタンス
- ポッドが接続しようとしているサービス
解決方法
通常、セキュリティグループのルールまたはネットワーク ACL が必要な権限を明示的に拒否すると、接続タイムアウトエラーが発生します。
これらのエラーを解決するには、以下を確認して、環境が正しくセットアップされているかどうかをチェックします。
- セキュリティグループが Amazon EKS 要件を満たしている。
- ポッドのセキュリティグループがポッドの相互通信を許可している。
- ネットワーク ACL が接続を拒否していない。
- サブネットに Amazon VPC 内で通信するためのローカルルートがある。
- ポッドがスケジュールされ、実行中状態になっている。
- Kubernetes 用の Amazon VPC Container Network Interface (CNI) プラグインの推奨バージョンがある。
- クラスターの VPC サブネットに、ポッドがアクセスする必要がある AWS サービス用の VPC インターフェイスエンドポイントがある。
セキュリティグループが Amazon EKS の要件を満たしている
インバウンドルールとアウトバウンドルールで、ワーカーノードが他のサービスと通信するために使用するプロトコルとポート上のトラフィックが許可されていることを確認してください。クラスターとノード間ですべてのトラフィックが流れるようにし、すべてのアウトバウンドトラフィックをどの宛先にも許可するのがベストプラクティスです。新しいポートを持つ新しいポッドが作成されるたびにセキュリティグループルールを変更する必要はありません。詳細については、Amazon EKS セキュリティグループの要件と考慮事項を参照してください。
ポッドのセキュリティグループがポッドの相互通信を許可している
ポッド用のセキュリティグループまたは カスタムネットワークを使用する場合は、任意のセキュリティグループをポッドに割り当てることができます。このシナリオでは、セキュリティグループがポッド間の通信を許可していることを確認します。
ネットワーク ACL が接続を拒否していない
- Amazon EKS クラスターと VPC CIDR 間のトラフィックがネットワーク ACL で自由に流れることを確認します。
- セキュリティグループと同様のルールを使用してネットワーク ACL を設定することを検討してください。
サブネットに VPC 内で通信するためのローカルルートがある
サブネットに VPC 内の通信用のデフォルトルートがあることを確認します。詳細については、「Amazon EKS VPC とサブネットの要件と考慮事項」を参照してください。
ポッドがスケジュールされ、実行中状態になっている
ポッドがスケジュールされ、実行中状態になっていることを確認します。ポッドステータスのトラブルシューティングについては、「Amazon EKS でポッドのステータスをトラブルシューティングする方法を教えてください」をご参照ください。
Kubernetes 用の Amazon VPC CNI プラグインの最新バージョンがある
Kubernetes 用の Amazon VPC CNI プラグインの最新バージョンを実行していない場合は、最新バージョンへの更新を検討してください
それでも問題が解決しない場合は、「Amazon EKS の kubelet または CNI プラグインの問題を解決する方法を教えてください」を参照してください。
クラスターの VPC サブネットには、ポッドがアクセスする必要のあるサービス用の VPC エンドポイントインターフェイスが必要です
一般的に使用されるサービスとエンドポイントを次の表に示します。
| |
---|
サービス | エンドポイント |
Amazon Elastic Compute Cloud (Amazon EC2) | com.amazonaws.region-code.ec2 |
Amazon Elastic Container Registry (Amazon ECR) | com.amazonaws.region-code.ecr.api com.amazonaws.region-code.ecr.dkr com.amazonaws.region-code.s3 |
Elastic Load Balancing (ELB) | com.amazonaws.region-code.elasticloadbalancing |
AWS X-Ray | com.amazonaws.region-code.xray |
Amazon CloudWatch | com.amazonaws.region-code.logs |
AWS Security Token Service (AWS STS) (サービスアカウントに IAM ロールを使用する場合に必須) | com.amazonaws.region-code.sts |
AWS App Mesh Kubernetes のアプリケーションメッシュコントローラーはサポートされていません。詳細については、GitHub ウェブサイトの「アプリメッシュコントローラー」を参照してください。 クラスターオートスケーラーがサポートされています。クラスタオートスケーラーポッドをデプロイするときは、コマンドラインに--aws-use-static-instance-list=true が含まれていることを確認してください。詳細については、GitHub ウェブサイトの「静的インスタンスリストを使用する」を参照してください。ワーカーノード VPC には、AWS STS VPC エンドポイントと Amazon EC2 Auto Scaling エンドポイントも含める必要があります。 | com.amazonaws.region-code.appmesh-envoy-management |
エンドポイントの詳細なリストについては、「AWS PrivateLink と統合される AWS のサービス」を参照してください。
VPC エンドポイントのセキュリティグループに、ワーカーノードからのトラフィックを許可するインバウンドルールがあることを確認してください。