创建外部负载均衡器

此页面展示了如何创建外部负载均衡器。

创建 服务 时,您可以选择自动创建云负载均衡器。这提供了一个可从外部访问的 IP 地址,该地址将流量发送到集群节点上的正确端口,*前提是您的集群在支持的环境中运行,并使用正确的云负载均衡器提供程序包进行配置*。

您也可以使用 入口 来代替服务。有关更多信息,请查看 入口 文档。

在开始之前

您需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 游乐场之一

您的集群必须在已支持配置外部负载均衡器的云或其他环境中运行。

创建服务

从清单创建服务

要创建外部负载均衡器,请将以下行添加到您的服务清单中

    type: LoadBalancer

您的清单可能如下所示

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example
  ports:
    - port: 8765
      targetPort: 9376
  type: LoadBalancer

使用 kubectl 创建服务

您也可以使用 kubectl expose 命令及其 --type=LoadBalancer 标志创建服务

kubectl expose deployment example --port=8765 --target-port=9376 \
        --name=example-service --type=LoadBalancer

此命令使用与引用资源相同的选择器创建新服务(在上面的示例中,是一个名为 example部署)。

有关更多信息(包括可选标志),请参阅 kubectl expose 参考

查找您的 IP 地址

您可以通过 kubectl 获取服务信息来查找为您的服务创建的 IP 地址

kubectl describe services example-service

这应该生成类似于以下内容的输出

Name:                     example-service
Namespace:                default
Labels:                   app=example
Annotations:              <none>
Selector:                 app=example
Type:                     LoadBalancer
IP Families:              <none>
IP:                       10.3.22.96
IPs:                      10.3.22.96
LoadBalancer Ingress:     192.0.2.89
Port:                     <unset>  8765/TCP
TargetPort:               9376/TCP
NodePort:                 <unset>  30593/TCP
Endpoints:                172.17.0.3:9376
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

负载均衡器的 IP 地址列在 LoadBalancer Ingress 旁边。

保留客户端源 IP

默认情况下,目标容器中看到的源 IP *不是* 客户端的原始源 IP。要启用保留客户端 IP,可以在服务的 .spec 中配置以下字段

  • .spec.externalTrafficPolicy - 表示此服务是否希望将外部流量路由到节点本地端点或集群范围端点。有两个可用选项:Cluster(默认)和 LocalCluster 会隐藏客户端源 IP,并可能导致跳到另一个节点,但应具有良好的整体负载分发。Local 会保留客户端源 IP,并且对于 LoadBalancer 和 NodePort 类型服务会避免跳到另一个节点,但可能会导致流量分发不均衡。
  • .spec.healthCheckNodePort - 指定服务的运行状况检查节点端口(数字端口号)。如果您没有指定 healthCheckNodePort,服务控制器将在集群的 NodePort 范围中分配一个端口。
    您可以通过设置 API 服务器命令行选项 --service-node-port-range 来配置该范围。如果您指定了,服务将使用用户指定的 healthCheckNodePort 值,前提是服务的 type 设置为 LoadBalancer 并且 externalTrafficPolicy 设置为 Local

在服务清单中将 externalTrafficPolicy 设置为 Local 会激活此功能。例如

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example
  ports:
    - port: 8765
      targetPort: 9376
  externalTrafficPolicy: Local
  type: LoadBalancer

保留源 IP 时的注意事项和限制

某些云提供商的负载均衡服务不允许您为每个目标配置不同的权重。

由于每个目标在将流量发送到节点方面都具有相同的权重,因此外部流量不会在不同的 Pod 之间进行均衡负载。外部负载均衡器不知道每个节点上用作目标的 Pod 数量。

NumServicePods << NumNodesNumServicePods >> NumNodes 的情况下,即使没有权重,也会看到相当接近的均衡分布。

内部 Pod 到 Pod 的流量应与 ClusterIP 服务类似,在所有 Pod 之间具有相同的概率。

垃圾收集负载均衡器

功能状态: Kubernetes v1.17 [稳定]

在通常情况下,云提供商中的相关负载均衡器资源应在删除 LoadBalancer 类型服务后立即清理。但众所周知,存在一些特殊情况,导致在删除关联服务后云资源成为孤儿。为服务负载均衡器引入最终器保护是为了防止这种情况发生。通过使用最终器,服务资源永远不会被删除,直到相应的负载均衡器资源也被删除。

具体来说,如果服务具有 type LoadBalancer,服务控制器将附加一个名为 service.kubernetes.io/load-balancer-cleanup 的最终器。最终器只有在负载均衡器资源清理后才会被删除。这即使在服务控制器崩溃等特殊情况下,也能防止负载均衡器资源成为孤儿。

外部负载均衡器提供程序

需要注意的是,此功能的数据路径由 Kubernetes 集群外部的负载均衡器提供。

当服务的 type 设置为 LoadBalancer 时,Kubernetes 提供与 type 等于 ClusterIP 相当的功能,用于集群内的 Pod,并通过将托管相关 Kubernetes Pod 的节点的条目编程到(Kubernetes 外部的)负载均衡器中来扩展它。Kubernetes 控制平面会自动创建外部负载均衡器、健康检查(如果需要)和数据包过滤规则(如果需要)。一旦云提供商为负载均衡器分配 IP 地址,控制平面就会查找该外部 IP 地址并将其填充到服务对象中。

下一步

上次修改时间:2023 年 10 月 22 日下午 6:49 PST:修复了页面“创建外部负载均衡器”上的错别字 (28c7a312af)