对于裸机集群,Kubernetes 不提供网络负载均衡器的实现(LoadBalancer 类型的服务)。Kubernetes 附带的网络负载均衡器的实现都是调用各种云提供商(GCP、AWS、Azure...)的粘合代码。如果您没有在受支持的云提供商(GCP、AWS、Azure...)上运行,则 LoadBalancer 在创建时将无限期地保持“Pending”状态。
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):
LoadBalancer
类型的Service会自动被分配一个external IP进行工作,否则 LoadBalancer
类型的Service在创建时将无限期地保持Pending状态,仅能提供NodePort
功能;正常分配时表现为status.loadBalancer
被指定了一个external IP;3、如果是自建的kubernetes和云提供商提供的外部负载均衡器:
LoadBalancer
功能;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。