一、Service的定义
Service,定义了一组Pods的逻辑集合和一个用于访问它们的策略。一个 Service 的目标 Pod 集合通常是由Label Selector 来匹配和关联的。
在Service和pod中间,实际上还有一层是endpoint,endpoint用来映射可以对外提供服务的running的pod,且endpoint的ip和pod的ip是一致的。(注意,不是running的状态,则没有对应的endpoint。)
Endpoints 是一组实际服务的端点集合。一个 Endpoint 是一个可被访问的服务端点,即一个状态为 running 的 pod 的可访问端点。一般 Pod 都不是一个独立存在,所以一组 Pod 的端点合在一起称为 EndPoints。只有被 Service Selector 匹配选中并且状态为 Running 的才会被加入到和 Service 同名的 Endpoints 中。
注意:service和控制器没有对应关系,只是Service可以使用控制器创建的pod资源作为endpoints而已;
在Kubernetes当中,有三类IP地址:
- Node Network
- Pod Network
- Service Network(Cluster Network)
二、Service的工作原理
Service的三种工作(代理)方式:
-
userspace方式,Kubernetes V1.1之前的
-
iptables方式,Kubernetes V1.10之前的
-
ipvs方式,Kubernetes V1.11之后的,默认是ipvs,否则会自动降级为iptables;
需要在kubelet的配置文件/etc/sysconfig/kubelet(不同Kubernetes版本,配置文件地址不同)当中,添加KUBELET_PROXY_MODE=ipvs,并写脚本使得主机自动装入相关的内核模板;
三、Service的服务方式
Service的服务暴露方式有四种:
- ClusterIP(默认,仅用于集群内通信);
- NodePort(主要用于集群外通信,在指定的范围内随机分配端口(默认值:30000-32767)。每个节点将分配的端口代理到服务中,服务需要基于ClusterIP。)
- LoadBalancer(工作节点是在云环境中的云主机,公有云厂商提供,服务需要基于NodePort。)
- ExternalName(将集群外部的服务引入到集群的内部,由外部FQDN和内部FQDN组成)
Headless Service,即没有ClusterIP,且必须定义为None,否则会自动分配一个ClusterIP;使用dig解析之后,可以直接看到后面的pod IP;其他则是Service的ClusterIP;
Headless Service在statefulSet服务用到;
扩展:
几种端口的区别;
- nodePort,节点上的端口;
- port,Service对外服务的端口;
- targetPort,pod的端口;
- containerPort,container的端口;
Service的yaml示例如下: