1. K8S中的Service分类
K8S中Service的作用是四层负载均衡,把发往Service的流量负载均衡到对应的Pod(endpoints)上。
根据暴露服务方式的不同,可以分为四种类型:ClusterIP、NodePort、LoadBalancer和ExternalName。
参考文档:
2. ClusterIP
ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType。
3. NodePort
NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。NodePort的默认范围是30000-32767,可以通过–service-node-port-range修改。
4. LoadBalancer
LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。
5. ExternalName
ExternalName:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com),实现外部服务的对内映射。
这个类型的作用主要是为了方便迁移,比如现在集群中的服务依赖一个外部的服务,那就可以使用ExternalName把这个外部服务映射到集群内部,以后这个外部服务迁移到集群内部,我们可以通过修改service类型使用内部的新服务,对于依赖方是无感的。
externalName虽然可以配置IP地址,但是Ingress和CoreDNS并没有解析。如果外部服务为IP,则可以使用Headless Service来实现映射。
示例1:
1 | apiVersion: v1 |
示例2:
1 | apiVersion: v1 |
参考文档:Kubernetes External Service Mapping
注意:一个service可能有多个endpoint,这些endpoint要求IP不同。
比如,mysql:3306
对应的endpoint是192.168.56.10:3306
,如果想要再增加endpoint,那么需要增加IP,而不是增加port。
6. Headless Service
Headless Service,实际上属于ClusterIP类型,是一种特殊的ClusterIP。
有时不需要负载均衡,也不需要单独的 ServiceIP,可以通过指定 ClusterIP(spec.clusterIP)的值为 “None” 来创建 Headless Service。
Headless Service常用于StatefulSet类型负载的对外服务暴露,或者外部服务的对内映射。
Headless Service和普通Service的不同有两点:
1、在DNS查询时普通Service会返回ServiceIP,而Headless Service会返回多个真实的endpoint,这样客户端就可以自己选择调用哪一个endpoint。
2、Headless Service对应的每一个pod都会分配一个DNS域名,这样pod间就可以通过域名互相访问了。而有状态服务就需要这种互相不同的识别,因此,Headless Service常常和statefulset配合使用。
参考文档: