为什么我的应用程序无法通过网络负载均衡器 (NLB) 服务进行连接?
当无法通过 NLB 服务访问您的应用时,请排查网络负载均衡器 (NLB) 的连接问题。
经典基础设施
您通过在经典集群中创建一个 NLB 服务,将您的应用程序对外公开。
但尝试使用 NLB 的公共 IP 地址连接到应用程序时,连接失败或超时。
由于下列其中一个原因,NLB 服务可能未正常运行:
- 集群尚未完全部署。
- NLB 服务的配置脚本包含错误。
检查是否设置了完全部署的标准集群,以及该集群是否至少有两个工作程序节点,以确保 NLB 服务具有高可用性。
-
列出工作程序节点。 在 CLI 输出中,确保工作程序节点的 Status 显示 Ready,并且 Machine Type 显示除了 free 之外的类型模板。
ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID -
对于 V2.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 服务,您必须拥有一个包含至少两个工作节点的标准集群。
- 没有可用于实现 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 服务。 一个原因可能是您已部署了包含多个工作程序节点的标准集群,但供应这些工作程序节点失败。
- 通过运行
kubectl get nodes列出可用工作程序节点。 - 如果至少找到两个可用的工作程序节点,请通过运行
ibmcloud ks worker get --cluster <cluster_name_or_ID> --worker <worker_ID>来列出工作程序节点详细信息。 - 请确保通过
kubectl get nodes和ibmcloud ks worker get命令返回的 worker 节点的公共 VLAN ID 和私有 VLAN ID 相互匹配。
- 通过运行
- 如果是使用定制域来连接到 NLB 服务的,请确保定制域已映射到 NLB 服务的公共 IP 地址。
- 找到 NLB 服务的公共 IP 地址。
kubectl describe service <service_name> | grep "LoadBalancer Ingress" ``` 2. 检查定制域是否已映射到指针记录 (PTR) 中 NLB 服务的可移植公共 IP 地址。