私のポッドが Amazon EKS の他のポッドに接続できない理由は何ですか?
私のポッドが 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 のプラグインの問題を解決するにはどうすればよいですか?」を参照してください。
関連するコンテンツ
- 質問済み 4ヶ月前lg...
- 質問済み 1年前lg...
- 質問済み 2ヶ月前lg...
- 質問済み 8ヶ月前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 1年前
- AWS公式更新しました 2年前
- AWS公式更新しました 1年前
- AWS公式更新しました 2年前