service是对一组提供相同功能的 Pods 的抽象,并为它们提供一个统一的入口。借助 Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。
service作为pods 的入口,通过labelselector找寻到满足label的pods,这样就能把service 与 pods 的对应关系确立。
apiVersion: v1
kind: Service
metadata:
labels:
run: nginx
name: nginx
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
根据上述的service yaml,当pod有着run:nginx的label的时候,就会被service 捕获到; service 的 targetPort 对应着捕获到pod的port
service 类型
service 有着四种类型:NodePort,LoadBalancer,ClusterIP,ExternalNme
- ClusterIP:默认类型,自动分配一个仅 cluster 内部可以访问的虚拟 IP,该IP 取自kube-apiserver的配置--service-cluster-ip-range=10.96.0.0/12
- NodePort:在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样就可以通过 <NodeIP>:NodePort 来访问该服务。如果 kube-proxy 设置了 --nodeport-addresses=10.240.0.0/16(v1.10 支持),那么仅该 NodePort 仅对设置在范围内的 IP 有效。
- LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 <NodeIP>:NodePort
- ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。需要 kube-dns 版本在 1.7 以上
不指定selector的service
不指定selector,则不会自动创建endpoint,关于这个转发,则有两种方式
- 自定义endpoint:手动创建endpoint ,各组件去寻找endpoint,寻找方式是去找同一个namespace且与service name 一致的endpoint资源
- 在service 配置externalName
kind: Service
apiVersion: v1
metadata:
name: my-service
namespace: default
spec:
type: ExternalName
externalName: my.database.example.com
该service不会赋予有clusterip,服务访问该service,域名解析返回externalName 参数对应的my.database.example.com
headless service:
即不需要 Cluster IP 的服务,即在创建service的时候,配置 spec.clusterIP为None, kube-apiserver则不会分配ip给该service;
headless service包括两种类型
- 不指定 Selectors,但设置 externalName,通过 CNAME 记录处理
- 指定 Selectors,通过 kube-dns 返回endpoint 列表,也就是kube-dns进行负载均衡
ClusterIP 模式的 Service 为你提供的,就是一个 Pod 的稳定的 IP 地址,即 VIP。并且,这里 Pod 和 Service 的关系是可以通过 Label 确定的。
而 Headless Service 为你提供的,则是一个 Pod 的稳定的 DNS 名字,并且,这个名字是可以通过 Pod 名字和 Service 名字拼接出来的。
转载:https://blog.csdn.net/fly910905/article/details/102091145