Amazon Elastic Kubernetes Service (Amazon EKS) クラスターでホストされているサービスに接続すると、接続がタイムアウトします。
簡単な説明
サービス接続に関する最も一般的な問題は、セキュリティグループまたはネットワークアクセスコントロールリスト (ネットワーク ACL) がポッドエンドポイントからのトラフィックを制限しているために発生します。
これを解決するには、ワーカーノードインスタンスとロードバランサーに関連付けられているセキュリティグループとネットワーク ACL を確認します。Network Load Balancer を使用している場合は、サービスでポッドに正しいラベルが選択されていることを確認してください。
**注:**アクセスできないサービスには、以下の解決策が適用されます。Kubernetes サービスタイプの詳細については、「Amazon EKS クラスターで実行されている Kubernetes サービスを公開するにはどうすればよいですか?」を参照してください。
解決策
セキュリティグループとネットワーク ACL を確認してください
クラスタ IP
クラスター IP サービスタイプは、同じ Amazon EKS クラスターで実行されるマイクロサービス間の通信に使用されます。送信先ポッドのインスタンスのセキュリティグループに、クライアントのポッドインスタンスの通信を許可するインバウンドルールがあることを確認します。
ほとんどの場合、ワーカーノードセキュリティグループのすべてのポートですべての通信を許可するセルフルールがあります。それぞれが独自のセキュリティグループを持つ複数のノードグループを使用する場合は、セキュリティグループ間のすべての通信を許可します。これにより、複数のノードで実行されるマイクロサービスが簡単に通信できるようになります。
詳細については、「Amazon EKS セキュリティグループの要件および考慮事項」を参照してください。
ノードポート
ワーカーノードセキュリティグループは、NodePort サービス定義で指定されたポートでの受信トラフィックを許可する必要があります。サービス定義で指定されていない場合、ポートパラメーターの値は targetPort パラメーターと同じです。ポートは Amazon EKS クラスターのすべてのノードで公開されています。
ワーカーノードサブネットにリンクされているネットワーク ACL を確認します。クライアント IP アドレスが、サービスが使用するポートの許可リストに含まれていることを確認してください。
インターネット経由で Kubernetes Service にアクセスする場合は、ノードにパブリック IP アドレスがあることを確認してください。サービスにアクセスするには、ノードのパブリック IP アドレスとポートの組み合わせを使用する必要があります。
ロードバランサー
次の条件に当てはまることを確認してください。
- ロードバランサーセキュリティグループはインバウンドリスナーポートを許可します。
- ロードバランサーセキュリティグループは、ターゲットトラフィックポートでのアウトバウンドトラフィックを許可します。
- ワーカーノードセキュリティグループは、アプリケーションコンテナが実行されているポートを介したロードバランサーセキュリティグループからの受信トラフィックを許可します。
- クライアント IP 保存を使用するセキュリティグループの関連付けなしで Network Load Balancer を使用する場合、ワーカーノードはクライアントトラフィックを許可します。
- ワーカーノードは、サービスでマップされたポートと異なる場合、targetPort と一致するトラフィックを許可します。
- ネットワーク ACL を使用すると、クライアント IP アドレスがリスナーポートのロードバランサーに到達できます。
- インターネット経由でロードバランサーにアクセスする場合、インターネット向けロードバランサーが作成されたことになります。
サービスがポッドエンドポイントを正しく選択したことを確認します
ポッドがサービスのバックエンドとして登録されていない場合、タイムアウトエラーが発生する可能性があります。これは、ブラウザからサービスにアクセスした場合に発生する可能性があります。あるいは、curl PodIP:podPort コマンドを実行したときに発生することもあります。
ポッドのラベルをチェックし、サービスに適切なラベルセレクターがあることを確認します。詳細については、Kubernetes Web サイトの「ラベルとセレクター」を参照してください。
次のコマンドを実行して、Kubernetes Service が正しく選択され、ポッドが登録されていることを確認します。
コマンド:
kubectl get pods -o wide
出力例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-6799fc88d8-2rtn8 1/1 Running 0 3h4m 172.31.33.214 ip-172-31-33-109.us-west-2.compute.internal none none
コマンド:
kubectl describe svc your_service_name -n your_namespace
注:****_service_name をサービス名に、your_namespace を名前空間に置き換えます。
出力例:
Events: noneSession Affinity: none
Endpoints: 172.31.33.214:80
....
この出力例では、172.31.33.214 は kubectl get pods -o wide コマンドから返されるポッドの IP アドレスです。172.31.33.214 IP アドレスは、Amazon EKS クラスターで実行されるサービスのバックエンドとしても機能します。