k8s之Service

Serviced的概念和作用

Service是建立在一组Pod对象之上的资源对象,它是通过标签选择器选择一组Pod对象,并为这组Pod对象定义一个统一的固定访问入口(通常是一个IP地址)一个Service可以看作一组提供相同服务的Pod的对外访问接口。
为动态的Pod资源提供近似静态的流量入口。
持续监视着相关Pod资源的变动,并实时反映至相应的流量调度规则之上。

原理

kube-proxy负责创建service时,把service定义转换为当前节点iptables规则,删除则删除规则。

如果某个service背后的Pod资源发生改变,比如service的标签选择器适用的Pod多了一个,这个Pod适用的信息会立即反应到apiserver,因为多出的Pod需要存储在apiserver后端的ectd中,kube-proxy会watch到这种变化并将其立即转换为iptables规则。转换是动态实时的。
Service依赖的组件:CoreDNS、kube-dns

Service的本质是iptables或ipvs规则:
iptables -vnL -t nat

Service三种工作模型

  • userspace:1.1-

  • iptables:1.10-

  • ipvs:1.11+

Service的类型

  • ClusterIP

通过集群的内部IP暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的ServiceType。

  • NodePort

通过每个 Node 节点上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。可以从集群的外部访问一个 NodePort 服务。
NodePort 需要借助真实存在的ip,是一个公共的ip,任何人都可以访问,而ClusterIP可以理解成不对外开放,仅限于集群内的节点之间特定的一个范围。

NodePort:在每个节点上启用一个端口来暴露服务,可以在集群
	○ 外部访问。也会分配一个稳定内部集群IP地址。
	○ 访问地址:<任意NodeIP>:PORT
	○ 端口范围:30000-32767
  • LoadBalancer

使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务,这个需要结合具体的云厂商进行操作。

  • ExternalName

通过返回 CNAME 和它的值,可以将服务映射到externalName字段的内容(例如,foo.bar.example.com)。没有任何类型代理被创建,这只有Kubernetes1.7或更高版本的 kube-dns才支持。
将集群外部的服务映射到集群内部,别名记录。指向真正的互联网域名。
CNAME ---> FQDN

Endopoint

Service依赖于同名的Endpoints资源维护匹配的后端各Pod的IP和Port
创建Service时会由Endpoint Controller自动创建同名的Endpoints对象
Endpoints对象基于标签选择器筛选并跟踪后端Pod

posted @ 2024-04-08 15:12  *一炁化三清*  阅读(19)  评论(0编辑  收藏  举报