1.Service介绍
1.1 什么是Service
Kubernetes Service 定义了这样一种抽象:
- 一个 Pod 的逻辑分组
- 一种可以访问这组Pod的策略
也可以理解为微服务。 这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector实现的。
Service 通过标签来选取服务后端,一般配合
- Replication Controller
- Deployment
从而保证后端容器的正常运行。
这些匹配标签的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。
如下图,展示的是Service与Pod、RC的关系
总结:
k8s的Service定义了一个服务的访问入口地址。
前端的应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,来自外部的访问请求被负载均衡到后端的各个容器应用上。
1.2 Service 类型
Service 类型有四种,总接下来:
- NodePort
- LoadBalancer
- ExternalName
- ClusterIP
在定义Service的时候可以指定一个需要的类型的Service。
如果不指定,则默认是ClusterIP类型。
1.2.1 NodePort
只对外部可见
通过每个 Node 节点上的 IP 和静态端口(NodePort)暴露服务。
NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。
通过请求可以从集群的外部访问一个 NodePort 服务
主要适合:集群外业务访问的场景。
如下:
apiVersion: v1 kind: Service metadata: name: test-service spec: selector: app: test type: NodePort # 指定service 类型 ports: - protocol: TCP port: 80 targetPort: 80 name: test-http nodePort: 30000 # 范围:30000-32767
设置 type 的值为 "NodePort",Kubernetes master 将从给定的配置范围内(默认:30000-32767)分配端口
每个 Node 将从该端口(每个 Node 上的同一端口)代理到 Service。
该端口将通过 Service 的 spec.ports[*].nodePort 字段被指定,这里指定的是30000
如果不指定的话会自动生成一个端口。
1.2.2 LoadBalancer
使用云提供商的负载局衡器,可以向外部暴露服务。
外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务,
需要结合具体的云厂商进行操作
1.2.3 ExternalName
ExternalName 是 Service 的特例
- 没有 selector
- 没有定义任何的端口和 Endpoint
对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务。
示例:
kind: Service apiVersion: v1 metadata: name: test-service namespace: test spec: type: ExternalName # 类型 externalName: test.service.com
1.2.4 ClusterIP
只对内部可见,外部无法访问
Service的IP地址,通过集群的内部 IP 暴露服务,服务只能够在kubernetes集群内部可以访问,此为虚拟IP地址
是默认的ServiceType。
kubectl -n test get Service # 即可看到ClusterIP
test 是命名空间
2.yaml名词解释
以下为yaml名词解释:
apiVersion: v1 # 版本 kind: Service # 类型 metadata: #元数据 类型string name: test #Service名称 类型string namespace: test #命名空间,不指定时默认为default命名空间 labels: #自定义标签属性列表 类型string - name: string annotations: #自定义注解属性列表 - name: string spec: #详细描述 类型list[] selector: [] #Label Selector配置,选择具有指定label标签的pod作为管理范围 type: string #service的类型,指定service的访问方式,默认ClusterIP #ClusterIP:虚拟的服务ip地址,用于k8s集群内部的pod访问,在Node上kube-porxy通过设置的iptables规则进行转发 #NodePort:使用宿主机端口,能够访问各Node的外部客户端通过Node的IP和端口就能访问服务器 #LoadBalancer:使用外部负载均衡器完成到服务器的负载分发, #需要在spec.status.loadBalancer字段指定外部负载均衡服务器的IP,并同时定义nodePort和clusterIP用于公有云环境。 clusterIP: string #虚拟服务IP地址,当type=ClusterIP时,如不指定,则系统会自动进行分配,也可以手动指定。当type=loadBalancer,需要指定 sessionAffinity: string #是否支持session,可选值为ClietIP,默认值为空,ClientIP表示将同一个客户端(根据客户端IP地址决定)的访问请求都转发到同一个后端Pod ports: #service需要暴露的端口列表 - name: string #端口名称 类型string protocol: TCP #端口协议,支持TCP或UDP,默认TCP 类型string port: 80 #服务监听的端口号 类型int targetPort: 8080 #需要转发到后端的端口号 类型int nodePort: 8080 #当type=NodePort时,指定映射到物理机的端口号 类型:int status: #当type=LoadBalancer时,设置外部负载均衡的地址,用于公有云环境 loadBalancer: #外部负载均衡器 ingress: #外部负载均衡器 ip: string #外部负载均衡器的IP地址 hostname: string #外部负载均衡器的机主机