私のポッドが Amazon EKS の他のポッドに接続できない理由は何ですか?

所要時間3分
0

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

簡単な説明

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

ポッドが他のポッドに接続できない場合、アプリケーションによっては次のエラーが表示されることがあります。

ワーカーノードのセキュリティグループがノード間通信を許可しない場合は、次のエラーが表示されます:

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

DNS が機能していない場合は、次のエラーが表示されます:

curl nginx  
curl: (6) Could not resolve host: nginx

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

上記のエラーを解決するには、環境の設定を次のように修正してください:

  • セキュリティグループが Amazon EKS のガイドラインを満たすようにします。
  • ネットワークアクセスコントロールリスト(network ACL)は当該接続を拒否しません。
  • サブネットに、Amazon Virtual Private Cloud (Amazon VPC) 内で通信するためのローカルルートが設定があります。
  • サブネットに十分な数の IP アドレスが設定されていることを確認します。
  • ポッドが相互に通信できるようにポッドのセキュリティグループを設定します。
  • ワーカーノードで IP 転送をオンにします。
  • Kubernetes のネットワーク要件を満たしていることが必要です。 (意図的な NetworkPolicy を除く)
  • ポッドが相互に通信できるように、ポッドで DNS を正しく使用します。
  • ポッドを実行状態になるようにスケジュールします。
  • Kubernetes 用の Amazon VPC コンテナネットワークインターフェイス (CNI) プラグインの推奨バージョンを使用します。

解決方法

セキュリティグループが Amazon EKS のガイドラインを満たすようにする

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

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

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

この接続が拒否されないようにネットワーク ACL を修正する

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

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

サブネットに、VPC 内で通信するためのローカルルートが設定されていることを確認する

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

サブネットに十分な数の IP アドレスが設定されていることを確認する

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

詳細については、「Amazon EKS VPC とサブネットの要件と考慮事項」を参照してください。

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

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

ポッドが相互に通信できるようにポッドのセキュリティグループを設定する

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

ワーカーノードで IP 転送をオンにする

カスタム AMI を使用する場合は、net.ipv4.ip\ _forward カーネル変数が有効になっていることを確認する必要があります。ワーカーノードでこの設定を確認するには、次のコマンドのいずれかを実行します:

# sysctl net.ipv4.ip_forward

# cat /proc/sys/net/ipv4/ip_forward

出力が 0 の場合は、次のコマンドのいずれかを使用して net.ipv4.ip\ _forward カーネル変数を有効にします。

# sysctl -w net.ipv4.ip_forward=1

# echo 1 > /proc/sys/net/ipv4/ip_forward

包含された ランタイムの Amazon EKS AMI については、設定の有効化について (GitHub にある) install-worker.sh スクリプトの 184~188 行目を参照してください。このステップは、ポッド間のネットワーク接続をトラブルシューティングするのに必須です。containerd が Amazon EKS バージョン 1.24 以降でデフォルトのランタイムだからです。

Kubernetes のネットワーク要件 (除く: 計画的な NetworkPolicy) を満たすようにする

(Kubernetes ウェブサイトに記載されている) Kubernetes ネットワーク要件を満たしていることを確認してください。

デフォルトでは、ポッドは隔離されていないので、あらゆるソースからのトラフィックを受け入れます。ポッドが隔離されるのは、隔離を選択する NetworkPolicy を設定した場合です。

**注:**NetworkPolicy の設定については、「Calico ネットワークポリシーエンジンアドオンのインストール」を参照してください。

ポッドが相互に通信できるように、ポッドで DNS を正しく使用する

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

次の出力例は、nginx サービスの DNS 名を解決しようとする試みを示しています。この場合、ClusterIP 10.100.94.70 が返されています:

$ 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

それでもポッドが DNS を解決できない場合は、「Amazon EKS での DNS 障害をトラブルシューティングする」を参照してください:

**注:**詳細については、Kubernetes ウェブサイトの「ポッド」、「サービス」、「ヘッドレスサービス」を参照してください。

ポッドを実行状態になるようにスケジュールする

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

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

Kubernetes 用 Amazon VPC CNI プラグインの推奨バージョンを使用する

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

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

AWS公式
AWS公式更新しました 1年前