为什么我的应用程序无法通过网络负载均衡器 (NLB) 服务进行连接?

当无法通过 NLB 服务访问您的应用时,请排查网络负载均衡器 (NLB) 的连接问题。

经典基础设施

您通过在经典集群中创建一个 NLB 服务,将您的应用程序对外公开。

但尝试使用 NLB 的公共 IP 地址连接到应用程序时,连接失败或超时。

由于下列其中一个原因,NLB 服务可能未正常运行:

  • 集群尚未完全部署。
  • NLB 服务的配置脚本包含错误。

检查是否设置了完全部署的标准集群,以及该集群是否至少有两个工作程序节点,以确保 NLB 服务具有高可用性。

  1. 列出工作程序节点。 在 CLI 输出中,确保工作程序节点的 Status 显示 Ready,并且 Machine Type 显示除了 free 之外的类型模板。

    ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID
    
  2. 对于 V2.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 服务,您必须拥有一个包含至少两个工作节点的标准集群。
没有可用于实现 NLB 服务请求的云提供者 IP。 向集群添加可移植子网,然后重试。
此错误消息表明,已无可分配给您的 NLB 服务的可移植公共 IP 地址。 请参阅向集群添加子网,以了解有关如何为集群请求可移植公共 IP 地址的信息。 有可移植的公共 IP 地址可供集群使用后,将自动创建 NLB 服务。
请求的云提供者 IP <cloud-provider-ip> 不可用。 提供以下云服务商的 IP 地址:<available-cloud-provider-ips>
您已通过 loadBalancerIP 部分为负载均衡器的YAML配置文件定义了一个可移植的公共IP地址,但该可移植的公共IP地址在您的可移植公共子网中不可用。 在配置脚本的 loadBalancerIP 部分,删除现有的 IP 地址,并添加一个可用的便携式公共 IP 地址。 您还可以从脚本中删除 loadBalancerIP 部分,以便系统能自动分配一个可用的便携式公共IP地址。
NLB 服务没有可用节点
您没有足够的 worker 节点来部署 NLB 服务。 一个原因可能是您已部署了包含多个工作程序节点的标准集群,但供应这些工作程序节点失败。
  1. 通过运行 kubectl get nodes 列出可用工作程序节点。
  2. 如果至少找到两个可用的工作程序节点,请通过运行 ibmcloud ks worker get --cluster <cluster_name_or_ID> --worker <worker_ID> 来列出工作程序节点详细信息。
  3. 请确保通过 kubectl get nodesibmcloud ks worker get 命令返回的 worker 节点的公共 VLAN ID 和私有 VLAN ID 相互匹配。
  1. 如果是使用定制域来连接到 NLB 服务的,请确保定制域已映射到 NLB 服务的公共 IP 地址。
    1. 找到 NLB 服务的公共 IP 地址。
        kubectl describe service <service_name> | grep "LoadBalancer Ingress"
        ```
    2. 检查定制域是否已映射到指针记录 (PTR) 中 NLB 服务的可移植公共 IP 地址。