saowu's Blog

kubernetes怎么使用外部负载均衡器?

kubernetes怎么使用外部负载均衡器?
2023-07-04 · 4 min read
Kubernetes 日记

对于裸机集群,Kubernetes 不提供网络负载均衡器的实现(LoadBalancer 类型的服务)。Kubernetes 附带的网络负载均衡器的实现都是调用各种云提供商(GCP、AWS、Azure...)的粘合代码。如果您没有在受支持的云提供商(GCP、AWS、Azure...)上运行,则 LoadBalancer 在创建时将无限期地保持“Pending”状态。

Kubernetes 中 Service 是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法。它的类型如下:

  • ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是你没有为服务显式指定 type 时使用的默认值。 你可以使用 Ingress 或者 Gateway API 向公众暴露服务。
  • NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 为了让节点端口可用,Kubernetes 设置了集群 IP 地址,这等同于你请求 type: ClusterIP 的服务。
  • LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 Kubernetes 不直接提供负载均衡组件;你必须提供一个,或者将你的 Kubernetes 集群与云提供商集成。来自外部负载均衡器的流量将直接重定向到后端 Pod 上,由云提供商决定如何进行负载平衡;这里主要表现为外部负载均衡器永远知道Pod运行在哪台Node上,避免Node间流量转发(如:华为云CCE表现为当创建一个该类型的Service后,在Pod就绪时,ELB后端服务组自动更改为Pod所在Node集合);
  • ExternalName:将服务映射到 externalName 字段的内容(例如,映射到主机名 api.foo.bar.example)。 该映射将集群的 DNS 服务器配置为返回具有该外部主机名值的 CNAME 记录。 无需创建任何类型代理。

LoadBalancer类型的Service如何与外部负载均衡器合作,如上面描述的那样,该类型的Service必须提供一个外部负载均衡器:

1、如果是云提供商提供kubernetes和外部负载均衡器

  • 则按照云提供商的规范来操作即可;

2、如果是自建的kubernetes和外部负载均衡器(MetalLB):

  • 在IP池有资源的情况下,LoadBalancer类型的Service会自动被分配一个external IP进行工作,否则 LoadBalancer类型的Service在创建时将无限期地保持Pending状态,仅能提供NodePort功能;正常分配时表现为status.loadBalancer被指定了一个external IP;

3、如果是自建的kubernetes和云提供商提供的外部负载均衡器:

  • 无法发挥LoadBalancer功能;
  • 把外部负载均衡器单纯作为NodeIP前置负载均衡使用,使用其NodePort功能,并且忽略Pending状态(可使用externalIPs解决Pending状态,也可将LoadBalancer类型的Service直接改成NodePort类型,避免没有external IP导致的Pending状态);

那么,externalIPs字段是干什么的呢?

externalIPs:如果有外部 IP 能够路由到一个或多个集群节点上,则 Kubernetes 服务可以暴露在这些 externalIPs 上。 当网络流量到达集群时,如果外部 IP(作为目的 IP 地址)和Port都与该 Service 匹配,Kubernetes 配置的规则和路由会确保流量被路由到该 Service 的 Endpoints 之一。定义 Service 时,你可以为任何Service类型指定 externalIPs。

Copyright © 2020 - 2024 saowu. All Right Reserved
Powered by Gridea