Service 用于为一组提供服务的Pod 抽象一个稳定的网络访问地址,是Kubernetes 实现微服务的核心概念,通过Service 的定义设置的访问地址是DNS 域名格式的服务名称,对于客户端应用来说,网络访问方式并没有改变(DNS 域名的作用等价于主机名,互联网域名或IP地址)。Service 还提供了负载均衡器功能,将客户端请求负载分发到后端提供具体服务的各个Pod 上。
Service 的yaml 格式的定义文件的完整内容如下:
apiVersion: v1
kind: Service
metadata:
name: string
namespace: string
labels:
- name: string
annotations:
- name: string
spec:
selector: []
type: string
clusterIP: string
sessionAffinity: string
ports:
- name: string
protocol: string
port: int
targetPort: int
nodePort: int
status:
loadBalancer:
ingress:
ip: string
hostname: string
属性名称 | 取值说明 |
---|---|
version | v1 |
kind | Service |
metadata | 元数据 |
metadata.name | Service名称,符合RFC 1035规范 |
metadata.namespace | 命名空间,不指定系统时将使用default 的命名空间 |
metadata.labels[] | 自定义标签属性列表 |
metadata.annotations[] | 自定义注解属性列表 |
spec | 详细描述 |
spec.selector[] | Label Selector配置,将选择具有指定Label 标签的Pod 作为管理范围 |
spec.type | Service 的类型,指定Service 的访问方式,默认值为ClusterIP。(1)ClusterIP: 虚拟服务IP 地址,该地址用于Kubernetes 集群内部的Pod 访问,在Node 上kube-proxy 通过设置的iptables 规则进行转发。(2)NodePort: 使用宿主机的端口,使能够访问各Node 的外部客户端通过Node 的IP地址和端口号就能访问服务。(3)LoadBalancer: 使用外接负载均衡器完成到服务的负载分发,需要在spec.status.loadBalancer 字段指定外部负载均衡器的IP地址,同时定义nodePort 和clusterIP,用于公有环境 |
spec.clusterIP | 虚拟服务的IP地址,当type=ClusterIP 时,如果不指定,则系统进行自动分配,也可以手工指定,当type=LoadBalancer 时,需要指定 |
spec.sessionAffinity | 是否支持Session ,可选值为ClientIP ,默认值为Node。ClientIP: 表示将同一个客户端(根据客户端的IP地址决定)的访问请求都转发到同一个后端Pod |
spec.ports[] | Service 端口列表 |
spec.ports[].name | Service端口名称 |
spec.ports[].protocol | 端口协议,支持TCP 和 UDP ,默认值为TCP |
spec.ports[].port | 服务监听的端口号 |
spec.ports[].targetPort | 需要转发到后端Pod 的端口号 |
spec.ports[].nodePort | 当spec.type=NodePort 时,指定映射到宿主机的端口号 |
status | 当spec.type=LoadBalancer时,设置外部负载均衡器的地址 |
status.loadBalancer | 外部负载均衡器 |
status.loadBalancer.ingress | 外部负载均衡器 |
status.loadBalancer.ingress.ip | 外部负载均衡器ip地址 |
status.loadBalancer.ingress.hostname | 外部负载均衡器主机名 |