1、什么是Service
Service只是一个抽象概念,在逻辑上将一组功能相同的pod给抽象出来一个统一入口。可以将他简单理解为做了一个服务的负载均衡。我们知道pod在重新部署之后ip会改变,所以一般会通过service来访问pod。core-dns会给service分配一个内部的虚拟ip(该IP不是node节点上的虚拟ip而是k8s集群内的虚拟ip)k8s内部服务可以通过这个ip或者是serviceName来访问到pod的服务。
Service 常用类型:
ClusterIP:也是默认方式。Service会分配一个集群内部的固定虚拟IP,实现集群内通过该IP来对POD进行访问。这个又有两类,上面说到的最普通的Service,ClusterIP还有一种是Headless Service,这种形式不会分配IP也不会通过kube-proxy做反向代理或者负载均衡,而是通过DNS提供稳定的网络ID来访问,DNS会将headless service的后端直接解析为POD的IP列表,这种主要是共StatefulSet类型使用。
NodePort:这种类型的Service是除了使用ClusterIP的功能外还会映射一个宿主机随机端口到service上,这样集群外部可以通过宿主机IP+随机端口来访问。这样得保证每一个node节点的该端口都可用才行,直接使用任意node节点的ip+端口就能直接访问pod。
HostPort: 他这个和nodeport的区别是,只在某一个node节点打开端口。
LoadBalancer:和nodePort类似,不过除了使用ClusterIP和NodePort之外还会向使用的公有云申请一个负载均衡器,从而实现集群外部通过LB来访问服务。这个主要是依托云lb。
ExternalName:是Service的一种特例,此模式主要面对运行在集群外部的服务,通过它可以将外部服务映射到k8s集群,具备k8s内服务的一些特性。
2、什么是endpoint
Endpoints 也是k8s的一个资源对象,在创建Service的时候如果我们设置了通过selector 标签关联相关的pod,那么Endpoint Controller就会自动创建一个与Service同名的Endpoints。存储在etcd中,用来记录一个service对应的所有pod的访问地址。
service配置selector,endpoint controller才会自动创建对应的endpoint对象;否则不会生成endpoint对象。
Endpoint Controller
endpoint controller是k8s集群控制器的其中一个组件,其功能如下:
- 负责生成和维护所有endpoint对象的控制器
- 负责监听service和对应pod的变化
- 监听到service被删除,则删除和该service同名的endpoint对象
- 监听到新的service被创建,则根据新建service信息获取相关pod列表,然后创建对应endpoint对象
- 监听到service被更新,则根据更新后的service信息获取相关pod列表,然后更新对应endpoint对象
- 监听到pod事件,则更新对应的service的endpoint对象,将podIp记录到endpoint中
3、Service、Endpoint 和 Pod 的关系
自动关联体系内 Pod 服务(下图):
手工维护体系外的外部服务(下图):
4、如何实现的
kubernetes核心组件kube-proxy
参考: https://blog.csdn.net/qq_30062181/article/details/107547331