IBM Cloud Docs
关于 VPC 负载均衡器

关于 VPC 负载均衡器

虚拟私有云

了解如何使用 VPC 负载均衡器在公共或专用网络上公开您的应用程序。

要在 VPC 集群中公开应用程序,可以创建第 7 层 VPC 应用程序负载平衡器(VPC ALB)或第 4 层 VPC 网络负载平衡器(VPC NLB)。

如果您创建了 public Kubernetes LoadBalancer 服务,您就会将应用程序暴露在公共网络流量中。 您可以通过 VPC NLB 分配给 Kubernetes LoadBalancer 服务的外部公共 IP 地址从互联网访问您的应用程序。 您的 VPC 子网不需要公共网关来允许对 VPC NLB 的公共请求。 但是,如果您的应用程序必须访问公共 URL,则必须将公共网关附加到工人节点所连接的 VPC 子网。

如果您创建了 private Kubernetes LoadBalancer 服务,您就会将应用程序暴露在私有网络流量中。 只有连接到同一区域和 VPC 中私有子网的系统才能访问您的应用程序。 如果您已连接到私有 VPC 网络,则可以通过 VPC NLB 分配给 Kubernetes LoadBalancer 服务的外部私有 IP 地址访问应用程序。

负载平衡器类型

下表介绍了每种负载平衡选项的基本特性。

VPC 群集的负载平衡选项
特性 应用程序负载 BalancerA (ALB) 网络负载均衡器 (NLB) 专用路径 NLB
受支持的 Red Hat OpenShift 版本 所有版本 所有版本 4.4.16及以后
传输层 第 7 层 第 4 层 第 4 层
负载平衡器的类型 公用和专用 公用和专用 专用
支持的协议 TCP TCP 和 UDP TCP
应用程序访问权 主机名 主机名和静态 IP 地址 仅通过 VPE 网关
源 IP 预留 可配置
通过直接返回服务器提高性能
多区路由 仅后台池
端口范围 仅公共
安全组

VPC 应用程序负载平衡器

设置 layer-7、多区 Application Load Balancer for VPC (VPC ALB),作为向群集中的应用程序传入请求的外部入口点。 在规划 VPC ALB 设置时,请牢记以下几点。

请勿将 Application Load Balancer for VPC与 Red Hat OpenShift on IBM Cloud 入口应用程序负载平衡器混淆。 VPC 的应用程序负载平衡器(VPC ALB)在 VPC 中的群集外运行,并由您创建的 Kubernetes LoadBalancer 服务进行配置。 Ingress 应用程序负载平衡器(ALB) 是在集群中的工作节点上运行的 Ingress 控制器。

  • VPC ALB 名称的格式为 kube-<cluster_ID>-<kubernetes_lb_service_UID>。 要查看群集 ID,请运行 ibmcloud oc cluster get --cluster <cluster_name>。 要查看 Kubernetes LoadBalancer 服务 UID,请运行 oc get svc myloadbalancer -o yaml 并查找输出中的 metadata.uid 字段。 从 Kubernetes LoadBalancer 服务 UID 中删除 VPC ALB 名称中的连字符 (-)。

  • 默认情况下,为群集中的应用程序创建 Kubernetes LoadBalancer 服务时,会在群集之外的 VPC 中创建 Application Load Balancer for VPC。 VPC ALB 会通过在工作节点上自动打开的私有 NodePorts 将请求路由到您的应用程序。

  • 如果创建了公共 Kubernetes LoadBalancer 服务,则可以通过 VPC ALB 为 Kubernetes LoadBalancer 服务分配的主机名从互联网访问应用程序,主机名格式为 1234abcd-<region>.lb.appdomain.cloud。 即使您的工作节点只连接到私有 VPC 子网,VPC ALB 也能接收公共请求并将其路由到公开您应用程序的服务。 请注意,您的 VPC 子网不需要公共网关来允许对 VPC ALB 的公共请求。 但是,如果您的应用程序必须访问公共 URL,则必须将公共网关附加到工人节点所连接的 VPC 子网。

  • 如果您创建了私有 Kubernetes LoadBalancer 服务,则只有连接到同一区域和 VPC 中私有子网的系统才能访问您的应用程序。 如果连接到私有 VPC 网络,则可以通过 VPC ALB 为 Kubernetes LoadBalancer 服务分配的主机名访问应用程序,格式为 1234abcd-<region>.lb.appdomain.cloud

  • 通过重命名 VPC ALB,您可以在不同的群集中使用现有的 VPC ALB。

下图说明了用户如何通过 VPC ALB 从互联网访问应用程序。

通过 VPC ALB 实现群集负载平衡。
通过 VPC ALB 实现群集负载平衡

  1. 对应用程序的请求使用 VPC ALB 分配给 Kubernetes LoadBalancer 服务的主机名,如 1234abcd-<region>.lb.appdomain.cloud
  2. VPC ALB 会自动将请求转发到 Worker 节点上的一个节点端口,然后再转发到应用程序 pod 的私有 IP 地址。
  3. 如果应用程序实例部署到集群中的多个工作程序节点,那么负载均衡器会在各个工作程序节点上的应用程序 pod 之间路由请求。 此外,如果您有一个多区群集,VPC ALB 会跨群集中的所有子网和区将请求路由到工作节点。

适用于 VPC 的网络负载均衡器

在 VPC 群集中,在群集的每个区域设置 layer-4 Network Load Balancer for VPC (VPC NLB),作为向应用程序传入请求的外部入口点。

VPC NLB 具有多种优势,如利用直接服务器返回(DSR)提供更高的吞吐量和更好的性能。 通过 DSR,工作节点可以直接向客户端 IP 地址发送应用程序响应包,跳过 VPC NLB,从而减少 VPC NLB 必须处理的流量。 此外,您还可以通过包含 externalTrafficPolicy: Local 规范,将 VPC NLB 配置为在所有客户端请求中包含源 IP 地址保护。

  • 标准 VPC NLB 名称的格式为 kube-<cluster_ID>-<kubernetes_lb_service_UID>。 要查看群集 ID,请运行 ibmcloud oc cluster get --cluster <cluster_name>。 要查看 Kubernetes LoadBalancer 服务 UID,请运行 oc get svc myloadbalancer -o yaml 并查找输出中的 metadata.uid 字段。 删除 VPC NLB 名称中 Kubernetes LoadBalancer 服务 UID 中的连字符 (-)。

  • 为群集中的应用程序创建 Kubernetes LoadBalancer 服务并包含 service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "nlb" 注解时,将在群集之外的 VPC 中创建 VPC NLB。 VPC NLB 通过工作节点上自动打开的私有 NodePorts 路由应用程序的请求。

  • 如果创建了 public Kubernetes LoadBalancer 服务,您就可以通过 VPC NLB 分配给 Kubernetes LoadBalancer 服务的外部公共 IP 地址从互联网访问您的应用程序。 即使您的工作节点只连接到私有 VPC 子网,VPC NLB 也能接收公共请求并将其路由到暴露您应用程序的服务。 请注意,VPC 子网上不需要公共网关来允许对 VPC NLB 的公共请求。 但是,如果您的应用程序必须访问公共 URL,则必须将公共网关附加到工人节点所连接的 VPC 子网。

  • 如果您创建了私有 Kubernetes LoadBalancer 服务,则只有连接到同一区域和 VPC 中私有子网的系统才能访问您的应用程序。 如果您已连接到私有 VPC 网络,则可以通过 VPC NLB 分配给 Kubernetes LoadBalancer 服务的外部私有 IP 地址访问应用程序。

下图说明了用户如何通过 VPC NLB 从互联网访问应用程序。

通过 VPC NLB 实现群集负载平衡。
通过 VPC NLB 实现集群的 VPC 负载平衡

  1. 向您的应用程序发出的请求会使用 VPC NLB 分配给 Kubernetes LoadBalancer 服务的外部 IP 地址。
  2. VPC NLB 会将请求自动转发到 Worker 节点上的一个节点端口,然后再转发到应用程序 pod 的私有 IP 地址。
  3. 如果应用程序实例部署到群集中的多个工作节点上,VPC NLB 会在群集所有区域的不同工作节点上的应用程序 pod 之间路由请求。

限制

查看以下默认设置和限制。

  • 查看 VPC ALB 的已知限制VPC NLB 的已知限制
  • 专用 VPC ALB 不接受所有流量,只接受 RFC 1918 流量。
  • 专用 VPC NLB 必须在专用 VPC 子网上创建,该子网必须与群集位于同一 VPC 和位置,但该子网不能连接到群集或任何工作节点。
  • Red Hat OpenShift:尽管 Kubernetes SCTP 协议在 Kubernetes 社区版本中普遍可用,但 IBM Cloud Kubernetes Service 群集不支持创建使用此协议的负载平衡器。
  • 将为创建的每个 Kubernetes LoadBalancer 服务创建一个 VPC 负载均衡器,VPC 负载均衡器仅将请求路由到对应的 Kubernetes LoadBalancer 服务。 在 VPC 的所有 VPC 集群中,最多可创建 50 个 VPC 负载平衡器。 有关详细信息,请参阅 VPC 配额文档
  • VPC 负载均衡器可将请求路由到数量有限的工作节点。 可以路由请求到的最大节点数取决于您如何设置 externalTrafficPolicy 注解。
    • 如果您在负载平衡器配置中设置了 externalTrafficPolicy: Cluster
      • VPC 负载均衡器会路由到每个区域中发现的前 8 个工作节点。 对于在三个区域都有工作节点的集群,负载平衡器将总共路由到 24 个工作节点。 对于单区群集,负载平衡器总共会路由到 8 个工作节点。 您可以使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-member-quota 更改负载平衡器路由到的每个区域的工作节点数量,但所有区域的总数量不能超过 50 个。 如果集群中所有区域的工作节点都少于 50 个,则指定 0 以路由到区域中的所有工作节点。 kube-proxy 配置 IP 表,以便将来自工作者节点的传入流量路由到应用程序 pod 所在节点上的应用程序 pod。
    • 如果在负载平衡器配置中设置 externalTrafficPolicy: Local,则只有当群集上有 50 个或更少的工作节点时,才会创建 VPC 负载平衡器。 此限制由 VPC 配额限制设定,即每个 VPC 负载平衡器池有 50 个池成员。 要避免这种限制,可使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selector 注解来限制负载平衡器池中的工作节点。 例如,您可以使用此注解将传入流量强制转入特定的工作池。 如果使用此注解将流量强制导入特定的 Worker 池,还必须确保应用程序 pod 也在同一 Worker 池中运行。
  • 为 Kubernetes LoadBalancer 服务定义配置 YAML 文件时,不支持以下注释和设置:
    • service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>"
    • service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"
    • service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "<algorithm>"
    • spec.loadBalancerIP
    • spec.loadBalancerSourceRanges
    • 仅限 VPC NLB:service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "proxy-protocol"
    • 仅限 VPC ALB:支持 externalTrafficPolicy: Local 设置,但该设置不会保留请求的源 IP。
  • 删除 VPC 群集时,该群集中以 kube-<cluster_ID>-<kubernetes_lb_service_UID> 格式命名并由 Red Hat OpenShift on IBM Cloud 为 Kubernetes LoadBalancer 服务自动创建的任何非持久性 VPC 负载平衡器也会自动删除。 但是,具有唯一名称的 持久负载平衡器 和在 VPC 中手动创建的 VPC 负载平衡器不会被删除。
  • 对于 VPC 负载均衡器主机名,最多可以注册 128 个子域。 可以通过打开支持案例来解除对请求的这一限制。
  • 您为 VPC 负载平衡器注册的子域只能使用 130 个字符或更少的字符。
  • 除非 Kubernetes 负载平衡器服务是使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnetsservice.kubernetes.io/ibm-load-balancer-cloud-provider-zone 注释创建的,否则 VPC ALB 会在群集工作节点分配的相同 VPC 子网上进行监听,这些注释会将流量限制到特定节点。
    • 创建 ALB 后,可以更新或修改 VPC ALB 的子网和区域。 如果向群集添加更多区域,或使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnetsservice.kubernetes.io/ibm-load-balancer-cloud-provider-zone 注解更新 Kubernetes 负载平衡器服务,VPC ALB 将更新以监听新的子网。
  • VPC NLB 只监听单个区域中的单个 VPC 子网。 不能将它们配置为监听多个 VPC 子网或监听多个区域。 您可以使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnetsservice.kubernetes.io/ibm-load-balancer-cloud-provider-zone 注解指定 NLB 要监听的单个子网。
    • 除非使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selectorservice.kubernetes.io/ibm-load-balancer-cloud-provider-zone annotations 将传入流量限制到特定的工作节点,否则 VPC NLB 会将传入流量转发到群集中的所有工作节点。 要将流量限制在特定区域内,可以使用这些注释来指定该区域内的工作者节点。
  • VPC 负载平衡器不支持禁用负载平衡器 NodePort 分配。
  • VPC NLB 可以在同一 VPC LB 上使用 UDP 和 TCP 设置,但监听端口必须不同。