ネットワーク・ロード・バランサー (NLB) サービスを介してアプリを接続できないのはなぜですか?
NLB(ネットワーク負荷分散)サービス経由でアプリケーションにアクセスできない場合の、ネットワーク負荷分散(NLB)の接続に関する問題のトラブルシューティングを行います。
クラシック・インフラストラクチャー
クラシック・クラスター内に NLB サービスを作成して、アプリを公開しました。
NLB のパブリック IP アドレスを使用してアプリに接続しようとしたところ、接続が失敗したか、タイムアウトになりました。
次のいずれかの理由で、NLB サービスが正しく機能していない可能性があります。
- クラスターがまだ完全にデプロイされていません。
- NLB サービスの構成スクリプトにエラーが含まれています。
標準クラスターをセットアップしたこと、クラスターが完全にデプロイされていること、また、NLB サービスの高可用性を確保するためにクラスターに 2 つ以上のワーカー・ノードがあることを確認します。
-
ワーカー・ノードをリストします。 CLI 出力で、ワーカー・ノードの Status に Ready と表示され、Machine Type に free 以外のフレーバーが表示されていることを確認します。
ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID -
バージョン 2.0 NLB の場合: NLB 2.0 の前提条件を満たしていることを確認します。
-
NLB サービスの構成ファイルが正しいことを確認します。
- バージョン 2.0 NLB
apiVersion: v1 kind: Service metadata: name: myservice annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs" spec: type: LoadBalancer selector: <selector_key>:<selector_value> ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. externalTrafficPolicy: Local ``` 1. サービスのタイプとして **LoadBalancer** を定義したことを確認します。 2. `service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"` アノテーションを指定したことを確認します。 3. LoadBalancer サービスの `spec.selector` セクションで、`<selector_key>` および `<selector_value>` が、デプロイメント YAML の `spec.template.metadata.labels` セクションで使用したキー/値のペアと同じであることを確認してください。 ラベルが一致しない場合、LoadBalancer サービスの **エンドポイント** セクションに `<none>` と表示され、インターネットからアプリにアクセスできません。 4. アプリで listen している **port** を使用していることを確認します。 5. `externalTrafficPolicy` を `Local` に設定していることを確認します。 * バージョン 1.0 NLB ```yaml {: screen} apiVersion: v1 kind: Service metadata: name: myservice spec: type: LoadBalancer selector: <selector_key>:<selector_value> ports: - protocol: TCP port: 8080 targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise. ``` 1. サービスのタイプとして **LoadBalancer** を定義したことを確認します。 2. LoadBalancer サービスの `spec.selector` セクションで、`<selector_key>` および `<selector_value>` が、デプロイメント YAML の `spec.template.metadata.labels` セクションで使用したキー/値のペアと同じであることを確認してください。 ラベルが一致しない場合、LoadBalancer サービスの**「エンドポイント」**セクションに**「なし」**と表示され、インターネットからアプリにアクセスできません。 3. アプリで listen している **port** を使用していることを確認します。 -
NLB サービスを確認し、Events セクションを参照して、エラーがないか探します。
kubectl describe service <myservice>以下のエラー・メッセージを探してください。
- 1 つのノードを持つクラスターは、NodePort タイプのサービスを使用する必要があります。
- NLB サービスを使用するには、少なくとも 2 つのワーカー・ノードを持つ標準クラスターが必要です。
- NLB サービス要求を満たすために使用可能なクラウド・プロバイダー IP がありません。 ポータブル・サブネットをクラスターに追加して、再試行してください。
- このエラーメッセージは、NLB サービスに割り当て可能なポータブルなパブリック IP アドレスが残っていないことを示しています。 クラスター用にポータブル・パブリック IP アドレスを要求する方法については、クラスターへのサブネットの追加を参照してください。 クラスターにポータブル・パブリック IP アドレスを使用できるようになると、NLB サービスが自動的に作成されます。
- 要求されたクラウド・プロバイダー IP
<cloud-provider-ip>は使用できません。 以下のクラウド・プロバイダー IP が使用可能です。<available-cloud-provider-ips> loadBalancerIPセクションを使用してロード・バランサー YAML のポータブル・パブリック IP アドレスを定義しましたが、このポータブル・パブリック IP アドレスはポータブル・パブリック・サブネットでは使用できません。 設定スクリプトの「loadBalancerIP」セクションで、既存のIPアドレスを削除し、利用可能なポータブルパブリックIPアドレスのいずれかを追加してください。 また、使用可能なポータブル・パブリック IP アドレスを自動的に割り振ることができるように、スクリプトからloadBalancerIPセクションを削除することもできます。- NLB サービスに使用可能なノードがありません
- NLB サービスをデプロイするための十分なワーカー・ノードがありません。 複数のワーカー・ノードを持つ標準クラスターをデプロイしましたが、ワーカー・ノードのプロビジョンが失敗した可能性があります。
kubectl get nodesを実行して、使用可能なワーカー・ノードをリストします。- 使用可能なワーカー・ノードが少なくとも 2 つ見つかった場合は、
ibmcloud ks worker get --cluster <cluster_name_or_ID> --worker <worker_ID>を実行してワーカー・ノードの詳細をリストします。 kubectl get nodesコマンドとibmcloud ks worker getコマンドによって返されたワーカー・ノードのパブリック VLAN ID とプライベート VLAN ID が一致していることを確認します。
- カスタム・ドメインを使用して NLB サービスに接続している場合は、カスタム・ドメインが NLB サービスのパブリック IP アドレスにマップされていることを確認します。
- NLB サービスのパブリック IP アドレスを見つけます。
kubectl describe service <service_name> | grep "LoadBalancer Ingress" ``` 2. カスタム・ドメインが、ポインター・レコード (PTR) で NLB サービスのポータブル・パブリック IP アドレスにマップされていることを確認します。