一、什么是Service
通过创建 Service,可以为一组具有相同功能的容器应用提供一个统一的入口地 址,并且将请求负载分发到后端的各个容器应用上。所以service的存在基于:
- 服务发现
- 负载均衡
1、服务发现
Pod因为Node节点的宕机会导致其重新调度,这样Pod就没有固定的ip,那么之前的Pod就会失联,为了防止重新调度的Pod能够找到就需要进行服务发现。
这样虽然Pod被调度到另一个节点上,但是也可以继续被发现,不至于失联。
2、负载均衡
定义一组Pod的访问策略:
前台请求,后台将其进行负载均衡,然后分发到不同的Pod上。Service与Pod之间通过label与selector进行关联,这与Controller与Pod之间建立关联的方式一样。
二、Service类型
对一些应用的某些部分,可能希望将其暴漏给k8s集群外部的IP地址,Service允许指定你需要的Service类型,默认的是ClusterIP类型。
- ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType
- NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。
- LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。
在之前常用的对外暴露端口使用的就是NodePort:
apiVersion: v1 kind: Service metadata: name: my-service spec: type: NodePort selector: app: MyApp ports: # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。 - port: 80 targetPort: 80 # 可选字段 # 默认情况下,为了方便起见,Kubernetes 控制平面会从某个范围内分配一个端口号(默认:30000-32767) nodePort: 30007