為何無法透過網路負載平衡器 (NLB) 服務來連接我的應用程式?

當無法透過網路負載平衡器 (NLB) 服務存取您的應用程式時,請排除網路負載平衡器 (NLB) 的連線問題。

經典基礎架構

您透過在傳統叢集中建立一個 NLB 服務,將您的應用程式對外公開。

當您嘗試使用 NLB 的公用 IP 位址連接至應用程式時,連線失敗或逾時。

NLB 服務可能因下列其中一個原因而未正常運作:

  • 尚未完整部署叢集。
  • NLB 服務的配置 Script 包含錯誤。

確認您所設定的標準叢集已完整部署並且至少有兩個工作者節點,以確保 NLB 服務的高可用性。

  1. 列出工作者節點。 在 CLI 輸出中,確定工作者節點的 Status 顯示 Ready,而且 Machine Type 顯示 free 以外的規格。

    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. 確認您已使用應用程式所接聽的**埠**。
        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. 確認您已使用應用程式所接聽的**埠**。
    
    
  4. 檢閱 NLB 服務,並檢閱 Events 區段來尋找可能的錯誤。

    kubectl describe service <myservice>
    

    請留意以下錯誤訊息。

僅含一個節點的叢集必須使用類型為 NodePort
若要使用 NLB 服務,您必須擁有一個至少包含兩個工作節點的標準叢集。
沒有雲端提供者 IP 可用來滿足 NLB 服務要求。 請將可攜式子網路新增至叢集,然後再試一次。
此錯誤訊息表示,已無可分配給您的 NLB 服務的可攜式公網 IP 位址。 請參閱將子網路新增至叢集,以尋找如何要求叢集之可攜式公用 IP 位址的相關資訊。 叢集可以使用可攜式公用 IP 位址之後,即會自動建立 NLB 服務。
所要求的雲端提供者 IP <cloud-provider-ip> 無法使用。 以下雲端服務供應商的 IP 位址可供使用:<available-cloud-provider-ips>
您已透過 loadBalancerIP 區段,為負載平衡器的 YAML 檔案定義了一個可攜式公網 IP 位址,但此可攜式公網 IP 位址在您的可攜式公網子網中並不可用。 在您的設定腳本中的 loadBalancerIP 區段中,刪除現有的 IP 位址,並新增一個可用的可攜式公共 IP 位址。 您也可以從腳本中移除 loadBalancerIP 區段,以便系統能自動分配一個可用的可攜式公共 IP 位址。
NLB 服務沒有可用的節點
您沒有足夠的工作節點來部署 NLB 服務。 其中一個原因可能是您所部署的標準叢集有多個工作者節點,但佈建工作者節點失敗。
  1. 執行 kubectl get nodes,以列出可用的工作者節點。
  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 位址。