任务

Kubernetes v1.12 版本的文档已不再维护。您现在看到的版本来自于一份静态的快照。如需查阅最新文档,请点击 最新版本。

Edit This Page

创建一个外部负载均衡器

本文展示如何创建一个外部负载均衡器。

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

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

准备开始

To check the version, enter kubectl version.

配置文件

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

    "type": "LoadBalancer"

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

    {
      "kind": "Service",
      "apiVersion": "v1",
      "metadata": {
        "name": "example-service"
      },
      "spec": {
        "ports": [{
          "port": 8765,
          "targetPort": 9376
        }],
        "selector": {
          "app": "example"
        },
        "type": "LoadBalancer"
      }
    }

使用 kubectl

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

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

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

更多信息(包括更多的可选参数),请参阅 kubectl expose reference

找到您的 IP 地址

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

kubectl describe services example-service

这将获得如下输出:

    Name:                   example-service
    Namespace:              default
    Labels:                 <none>
    Annotations:            <none>
    Selector:               app=example
    Type:                   LoadBalancer
    IP:                     10.67.252.103
    LoadBalancer Ingress:   123.45.678.9
    Port:                   <unnamed> 80/TCP
    NodePort:               <unnamed> 32445/TCP
    Endpoints:              10.64.0.4:80,10.64.1.5:80,10.64.2.4:80
    Session Affinity:       None
    Events:                 <none>

IP 地址列在 LoadBalancer Ingress 旁边。

Note:

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

minikube service example-service --url

保留客户端源 IP

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

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

    {
      "kind": "Service",
      "apiVersion": "v1",
      "metadata": {
        "name": "example-service"
      },
      "spec": {
        "ports": [{
          "port": 8765,
          "targetPort": 9376
        }],
        "selector": {
          "app": "example"
        },
        "type": "LoadBalancer",
        "externalTrafficPolicy": "Local"
      }
    }

特性可用性

k8s 版本 特性支持
1.7+ 支持完整的 API 字段
1.5 - 1.6 支持 Beta Annotation
<1.5 不支持

您可以在下面找到已弃用的 Beta annotation,在稳定版本前使用它来使用该功能。较新的 Kubernetes 版本可能会在 v1.7 之后停止支持这些功能。 请更新现有应用程序以直接使用这些字段。

service.beta.kubernetes.io/external-traffic annotation 与 service.spec.externalTrafficPolicy 字段相比拥有一组不同的值。值匹配如下:

请注意,此功能目前尚未实现在所有云提供商/环境中。

已知的问题:

外部负载均衡器提供商

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

当服务类型设置为 LoadBalancer 时,Kubernetes 向集群中的 pod 提供与 type=<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 的概率相同。

反馈