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

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

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

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

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

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

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

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

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

    ibmcloud ks 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 セクションを参照して、エラーがないか探します。

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