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

最終更新日: 2021 年 8 月 30 日

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

簡単な説明

注: AWS Command Line Interface (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

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

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

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 アドレスがある
  • ポッドがスケジュールされ、RUNNING 状態になっている
  • Kubernetes 用の Amazon VPC Container Network Interface (CNI) プラグインの推奨バージョンがある

解決方法

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

Kubernetes のネットワーク要件を満たしていることを確認します (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 障害をトラブルシューティングする方法を教えてくださいを参照してください。

注: 詳細については、Kubernetes ウェブサイトの PodsService、および Headless Services を参照してください。

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

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

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

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

ポッドのセキュリティグループがポッドの相互通信を許可している

ポッド用のセキュリティグループまたは CNI カスタムネットワークを使用する場合は、任意のセキュリティグループをポッドに割り当てることができます。このシナリオでは、セキュリティグループがポッド間の通信を正しく許可していることを確認します。

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

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

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

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

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

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

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

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

使用可能な IP アドレスを確認するには、次の AWS CLI コマンドを実行します。

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

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

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

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

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

推奨バージョンがあるのに問題が発生している場合は、Amazon EKS の kubelet または CNI のプラグインの問題が発生します。どうすれば解決できますか? を参照してください。


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


請求に関するサポートまたは技術サポートが必要ですか?