创建外部负载均衡器
创建 服务 时,你可以选择自动创建云网络负载均衡器。 负载均衡器提供外部可访问的 IP 地址,可将流量发送到集群节点上的正确端口上 ( 假设集群在支持的环境中运行,并配置了正确的云负载均衡器驱动包)。
你还可以使用 代替 Service。 更多信息,请参阅 Ingress 文档。
你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:
你的集群必须在已经支持配置外部负载均衡器的云或其他环境中运行。
创建服务
要创建外部负载均衡器,请将以下内容添加到你的 Service 清单文件:
你的清单文件可能会如下所示:
kind: Service
metadata:
name: example-service
spec:
selector:
app: example
- port: 8765
targetPort: 9376
type: LoadBalancer
你也可以使用 kubectl expose
命令及其 --type=LoadBalancer
参数创建服务:
此命令通过使用与引用资源(在上面的示例的情况下,名为 的 ) 相同的选择器来创建一个新的服务。
你可以通过 kubectl
获取服务信息,找到为你的服务创建的 IP 地址:
kubectl describe services example-service
这将获得类似如下输出:
负载均衡器的 IP 地址列在 LoadBalancer Ingress
旁边。
说明:
如果你在 Minikube 上运行服务,你可以通过以下命令找到分配的 IP 地址和端口:
minikube service example-service --url
保留客户端源 IP
默认情况下,目标容器中看到的源 IP 将不是客户端的原始源 IP。 要启用保留客户端 IP,可以在服务的 .spec
中配置以下字段:
.spec.externalTrafficPolicy
- 表示此 Service 是否希望将外部流量路由到节点本地或集群范围的端点。 有两个可用选项:Cluster
(默认)和Local
。Cluster
隐藏了客户端源 IP,可能导致第二跳到另一个节点,但具有良好的整体负载分布。Local
保留客户端源 IP 并避免 LoadBalancer 和 NodePort 类型服务的第二跳, 但存在潜在的不均衡流量传播风险。.spec.healthCheckNodePort
- 指定服务的 healthcheck nodePort(数字端口号)。 如果你未指定healthCheckNodePort
,服务控制器从集群的 NodePort 范围内分配一个端口。 你可以通过设置 API 服务器的命令行选项 来配置上述范围。 在服务type
设置为 LoadBalancer 并且externalTrafficPolicy
设置为Local
时, Service 将会使用用户指定的healthCheckNodePort
值(如果你指定了它)。
一些云服务供应商的负载均衡服务不允许你为每个目标配置不同的权重。
由于每个目标在向节点发送流量方面的权重相同,因此外部流量不会在不同 Pod 之间平均负载。 外部负载均衡器不知道每个节点上用作目标的 Pod 数量。
在 NumServicePods << _NumNodes
或 NumServicePods >> NumNodes
时, 即使没有权重,也会看到接近相等的分布。
内部 Pod 到 Pod 的流量应该与 ClusterIP 服务类似,所有 Pod 的概率相同。
特性状态: Kubernetes v1.17 [stable]
在通常情况下,应在删除 LoadBalancer 类型 Service 后立即清除云服务供应商中的相关负载均衡器资源。 但是,众所周知,在删除关联的服务后,云资源被孤立的情况很多。 引入了针对服务负载均衡器的终结器保护,以防止这种情况发生。 通过使用终结器,在删除相关的负载均衡器资源之前,也不会删除服务资源。
具体来说,如果服务具有 type
LoadBalancer,则服务控制器将附加一个名为 service.kubernetes.io/load-balancer-cleanup
的终结器。 仅在清除负载均衡器资源后才能删除终结器。 即使在诸如服务控制器崩溃之类的极端情况下,这也可以防止负载均衡器资源悬空。
外部负载均衡器供应商
请务必注意,此功能的数据路径由 Kubernetes 集群外部的负载均衡器提供。
- 阅读服务
- 阅读