创建外部负载均衡器

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

创建 服务 时,您可以选择自动创建云负载均衡器。这将提供一个可外部访问的 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,则服务将使用用户指定的 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)