為何無法透過網路負載平衡器 (NLB) 服務來連接我的應用程式?
當無法透過網路負載平衡器 (NLB) 服務存取您的應用程式時,請排除網路負載平衡器 (NLB) 的連線問題。
經典基礎架構
您透過在傳統叢集中建立一個 NLB 服務,將您的應用程式對外公開。
當您嘗試使用 NLB 的公用 IP 位址連接至應用程式時,連線失敗或逾時。
NLB 服務可能因下列其中一個原因而未正常運作:
- 尚未完整部署叢集。
- NLB 服務的配置 Script 包含錯誤。
確認您所設定的標準叢集已完整部署並且至少有兩個工作者節點,以確保 NLB 服務的高可用性。
-
列出工作者節點。 在 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. 確認您已使用應用程式所接聽的**埠**。 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. 確認您已使用應用程式所接聽的**埠**。 -
檢閱 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 服務。 其中一個原因可能是您所部署的標準叢集有多個工作者節點,但佈建工作者節點失敗。
- 執行
kubectl get nodes,以列出可用的工作者節點。 - 如果至少找到兩個可用的工作者節點,請執行
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 位址。