ネットワーク・ロード・バランサー (NLB) サービスを介してアプリを接続できないのはなぜですか?

NLB(ネットワーク負荷分散)サービス経由でアプリケーションにアクセスできない場合の、ネットワーク負荷分散(NLB)の接続に関する問題のトラブルシューティングを行います。

クラシック・インフラストラクチャー

クラシック・クラスター内に NLB サービスを作成して、アプリを公開しました。

NLB のパブリック IP アドレスを使用してアプリに接続しようとしたところ、接続が失敗したか、タイムアウトになりました。

次のいずれかの理由で、NLB サービスが正しく機能していない可能性があります。

  • クラスターがまだ完全にデプロイされていません。
  • NLB サービスの構成スクリプトにエラーが含まれています。

標準クラスターをセットアップしたこと、クラスターが完全にデプロイされていること、また、NLB サービスの高可用性を確保するためにクラスターに 2 つ以上のワーカー・ノードがあることを確認します。

  1. ワーカー・ノードをリストします。 CLI 出力で、ワーカー・ノードの Status に Ready と表示され、Machine Type に free 以外のフレーバーが表示されていることを確認します。

    ibmcloud oc worker ls --cluster CLUSTER_NAME_OR_ID
    
  2. バージョン 2.0 NLB の場合: NLB 2.0 の前提条件を満たしていることを確認します。

  3. 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** を使用していることを確認します。
    
    
  4. NLB サービスを確認し、Events セクションを参照して、エラーがないか探します。

    oc 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 サービスをデプロイするための十分なワーカー・ノードがありません。 複数のワーカー・ノードを持つ標準クラスターをデプロイしましたが、ワーカー・ノードのプロビジョンが失敗した可能性があります。
  1. oc get nodes を実行して、使用可能なワーカー・ノードをリストします。
  2. 使用可能なワーカー・ノードが少なくとも 2 つ見つかった場合は、ibmcloud oc worker get --cluster <cluster_name_or_ID> --worker <worker_ID> を実行してワーカー・ノードの詳細をリストします。
  3. oc get nodes コマンドと ibmcloud oc worker get コマンドによって返されたワーカー・ノードのパブリック VLAN ID とプライベート VLAN ID が一致していることを確認します。
  1. カスタム・ドメインを使用して NLB サービスに接続している場合は、カスタム・ドメインが NLB サービスのパブリック IP アドレスにマップされていることを確認します。
    1. NLB サービスのパブリック IP アドレスを見つけます。
        oc describe service <service_name> | grep "LoadBalancer Ingress"
        ```
    2. カスタム・ドメインが、ポインター・レコード (PTR) で NLB サービスのポータブル・パブリック IP アドレスにマップされていることを確認します。