创建一个外部负载均衡器

    创建服务时,您可以选择自动创建云网络负载均衡器。这提供了一个外部可访问的 IP 地址,可将流量分配到集群节点上的正确端口上 _假设集群在支持的环境中运行,并配置了正确的云负载平衡器提供商包_。

    有关如何配置和使用 Ingress 资源为服务提供外部可访问的 URL、负载均衡流量、终止 SSL 等功能,请查看 Ingress 文档。

    要获知版本信息,请输入 .

    配置文件

    要创建外部负载均衡器,请将以下内容添加到 服务配置文件

    您的配置文件可能会如下所示:

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: example-service
    5. spec:
    6. selector:
    7. ports:
    8. targetPort: 9376
    9. type: LoadBalancer

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

    此命令通过使用与引用资源(在上面的示例的情况下,名为 example 的 replication controller)相同的选择器来创建一个新的服务。

    找到您的 IP 地址

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

    1. kubectl describe services example-service

    这将获得如下输出:

    IP 地址列在 旁边。

    注意:

    注意: 如果您在 Minikube 上运行服务,您可以通过以下命令找到分配的 IP 地址和端口:

    1. minikube service example-service --url

    由于此功能的实现,目标容器中看到的源 IP 将 *不是客户端的原始源 IP*。要启用保留客户端 IP,可以在服务的 spec 中配置以下字段(支持 GCE/Google Kubernetes Engine 环境):

    • service.spec.externalTrafficPolicy - 表示此服务是否希望将外部流量路由到节点本地或集群范围的端点。有两个可用选项:Cluster(默认)和 Local。Cluster 隐藏了客户端源 IP,可能导致第二跳到另一个节点,但具有良好的整体负载分布。Local 保留客户端源 IP 并避免 LoadBalancer 和 NodePort 类型服务的第二跳,但存在潜在的不均衡流量传播风险。

    • service.spec.healthCheckNodePort - 指定服务的 healthcheck nodePort(数字端口号)。如果未指定,则 serviceCheckNodePort 由服务 API 后端使用已分配的 nodePort 创建。如果客户端指定,它将使用客户端指定的 nodePort 值。仅当 type 设置为 LoadBalancer 并且 externalTrafficPolicy 设置为 Local 时才生效。

    可以通过在服务的配置文件中将 externalTrafficPolicy 设置为 Local 来激活此功能。

    垃圾收集负载均衡器

    具体来说,如果服务具有 type LoadBalancer,则服务控制器将附加一个名为 service.kubernetes.io/load-balancer-cleanup 的终结器。 仅在清除负载均衡器资源后才能删除终结器。 即使在诸如服务控制器崩溃之类的极端情况下,这也可以防止负载均衡器资源悬空。

    自 Kubernetes v1.16 起,此功能为 beta 版本并默认启用。您也可以通过ServiceLoadBalancerFinalizer 在 v1.15 (alpha)中启用它。

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

    当服务 type 设置为 LoadBalancer 时,Kubernetes 向集群中的 pod 提供的功能等同于 等于 ClusterIP,并通过使用 Kubernetes pod 的条目对负载均衡器(从外部到 Kubernetes)进行编程来扩展它。 Kubernetes 服务控制器自动创建外部负载均衡器、健康检查(如果需要)、防火墙规则(如果需要),并获取云提供商分配的外部 IP 并将其填充到服务对象中。

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

    GCE/AWS 负载均衡器不为其目标池提供权重。对于旧的 LB kube-proxy 规则来说,这不是一个问题,它可以在所有端点之间正确平衡。

    使用新功能,外部流量不会在 pod 之间平均负载,而是在节点级别平均负载(因为 GCE/AWS 和其他外部 LB 实现无法指定每个节点的权重,因此它们的平衡跨所有目标节点,并忽略每个节点上的 pod 数量)。

    但是,我们可以声明,对于 NumServicePods << NumNodes 或 NumServicePods >> NumNodes 时,即使没有权重,也会看到接近相等的分布。

    一旦外部负载平衡器提供权重,就可以将此功能添加到 LB 编程路径中。 未来工作:1.4 版本不提供权重支持,但可能会在将来版本中添加

    内部 pod 到 pod 的流量应该与 ClusterIP 服务类似,所有 pod 的概率相同。