ポッドが Amazon EKS の他のポッドに接続されないのはなぜですか?

最終更新日: 2020 年 2 月 21 日

ポッドが Amazon Elastic Kubernetes Service (Amazon EKS) の他のポッドに接続されません。

簡単な説明

ポッドが他のポッドに接続できない場合、次のエラーを受け取ることがあります (アプリケーションによって異なります)。

ワーカーノードのセキュリティグループがワーカー間通信を許可していない場合:

curl: (7) Failed to connect to XXX.XXX.XX.XXX port XX: Connection timed out

DNS が機能しない場合:

Error: RequestError: send request failed caused by: Post  dial tcp: i/o timeout

DNS は機能しているが、ポッドの接続に問題がある場合:

Error: RequestError: send request failed caused by: Post  dial tcp 1.2.3.4.5:443: i/o timeout

ポッドがサービスを通じて公開されていない場合に、ポッドの DNS を解決しようとした場合:

kubectl exec -it busybox -- nslookup nginx 
Server:	  10.100.0.10
Address:  10.100.0.10:53
** server can't find nginx.default.svc.cluster.local: NXDOMAIN
*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer
*** Can't find nginx.ap-southeast-2.compute.internal: No answer
*** Can't find nginx.default.svc.cluster.local: No answer
*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer
*** Can't find nginx.ap-southeast-2.compute.internal: No answer

これらのエラーを解決するには、以下を確認して、環境が正しくセットアップされているかどうかをチェックします。

  • Kubernetes のネットワーク要件を満たしている (意図的な NetworkPolicy を除く)
  • ポッドは DNS を正しく使用して相互に通信している
  • セキュリティグループが Amazon EKS ガイドラインを満たしている
  • ネットワークアクセスコントロールリスト (ACL) は接続を拒否していない
  • サブネットに、Amazon Virtual Private Cloud (Amazon VPC) 内で通信するためのローカルルートがある
  • サブネットで使用できる十分な IP アドレスがある
  • ポッドがスケジュールされ、実行中状態になっている
  • Kubernetes 用の Amazon VPC CNI プラグインの推奨バージョンがある

解決方法

Kubernetes のネットワーク要件を満たしている (意図的な NetworkPolicy を除く)

Kubernetes のネットワーク要件を満たしていることを確認します。

デフォルトでは、ポッドは分離されていません。ポッドは、あらゆるソースからのトラフィックを受け入れます。ポッドは、そのポッドを選択する NetworkPolicy を持つことで分離されます。

注: NetworkPolicy の設定については、「Amazon EKS への Calico のインストール」を参照してください。

ポッドは DNS を正しく使用して相互に通信している

まず、サービスを通じてポッドを公開する必要があります。そうしないと、ポッドは DNS 名を取得せず、特定の IP アドレスでのみアクセスできます。

次の例を参照してください。

$ kubectl run nginx --image=nginx --replicas=5 -n web
deployment.apps/nginx created

$ kubectl expose deployment nginx --port=80 -n web
service/nginx exposed

$ kubectl get svc -n web
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   10.100.94.70   <none>        80/TCP    2s

# kubectl exec -ti busybox -n web -- nslookup nginx
Server:    10.100.0.10
Address 1: 10.100.0.10 ip-10-100-0-10.ap-southeast-2.compute.internal
Name:      nginx
Address 1: 10.100.94.70 ip-10-100-94-70.ap-southeast-2.compute.internal

出力は、nginx サービスの DNS 名を解決するときに ClusterIP 10.100.94.70 が返されたことを示しています。

それでもポッドで DNS の解決に失敗する場合は、「Amazon EKS で DNS エラーをトラブルシューティングする方法を教えてください」を参照してください。

注: 詳細については、PodsServiceHeadless Services を参照してください。

セキュリティグループが Amazon EKS ガイドラインを満たしている

ワーカーノードのセキュリティグループで許可されるトラフィックを制限する場合は、ワーカーノードがワーカー間通信に使用するプロトコルまたはポートのインバウンドルールを作成します。

すべてのトラフィックを有効にすることをお勧めします。新しいポートを持つ新しいポッドが作成されるたびにセキュリティグループルールを変更する必要はありません。

詳細については、「Amazon EKS セキュリティグループの考慮事項」を参照してください。

ネットワーク ACL が接続を拒否していない

1.    Amazon EKS クラスターと VPC CIDR 間のトラフィックが network ACL で自由に流れることを確認します。

2.    (オプション) VPC にセキュリティレイヤーを追加するには、セキュリティグループと同様のルールでネットワーク ACL を設定することを検討してください。

サブネットに VPC 内で通信するためのローカルルートがある

サブネットに VPC 内の通信用のデフォルトルートがあることを確認します。

サブネットで使用できる十分な IP アドレスがある

指定したサブネットに、クロスアカウントの Elastic Network Interface とポッドに十分な IP アドレスがあることを確認します。

詳細については、「VPC IP アドレス指定」を参照してください。

使用可能な IP アドレスを確認するには、次の AWS コマンドラインインターフェイス (AWS CLI) コマンドを実行します。

$ aws ec2 describe-subnets --subnet-id YOUR-SUBNET-ID --query 'Subnets[0].AvailableIpAddressCount'

ポッドがスケジュールされ、実行中状態になっている

ポッドがスケジュールされ、実行中状態になっていることを確認します。

ポッドステータスのトラブルシューティングについては、「Amazon EKS でポッドのステータスをトラブルシューティングする方法を教えてください」を参照してください。

Kubernetes 用の Amazon VPC CNI プラグインの推奨バージョンがある

Kubernetes 用の Amazon VPC CNI プラグイン推奨バージョンを実行していない場合は、最新バージョンへのアップグレードをご検討ください。

推奨バージョンがあるのに問題が発生している場合は、「Amazon EKS での CNI プラグインの問題のトラブルシューティング方法を教えてください」を参照してください。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合