创建外部负载均衡器

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

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

您也可以使用 Ingress 来代替 Service。有关更多信息,请查看 Ingress 文档。

开始之前

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

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

创建服务

从清单创建服务

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

    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

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

有关更多信息,包括可选标志,请参阅 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 的保留,可以在 Service 的 .spec 中配置以下字段

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

在 Service 清单中将 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 类型的服务后,云提供商中的相关负载均衡器资源应立即清理。但是众所周知,在关联的服务被删除后,云资源会被遗留下来。引入了服务负载均衡器的 Finalizer 保护机制,以防止这种情况发生。通过使用 Finalizer,在删除相关负载均衡器资源之前,永远不会删除 Service 资源。

具体来说,如果 Service 的 type 为 LoadBalancer,则服务控制器将附加一个名为 service.kubernetes.io/load-balancer-cleanup 的 Finalizer。仅在清理负载均衡器资源后才会删除 Finalizer。这可以防止出现诸如服务控制器崩溃之类的特殊情况下的悬空负载均衡器资源。

外部负载均衡器提供商

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

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

下一步

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