系列文章目录
K8s中的Namespace是什么?
Kubernetes 集群的组件介绍
Kubernetes 对象是什么?
Pod——k8s中最重要的对象之一
Kubernetes 和 Docker 之间有什么区别?
部署安装 K8s 为什么要关闭 swap 分区?
k8s中容器之间、pod之间如何进行网络通信?
从不同的角度理解静态Pod和动态/普通Pod的区别
本篇目录
- 系列文章目录
- 什么是Service?
- 为什么要有Service?
- Service类型有哪些?
- 如何定义 Service?
什么是Service?
Kubernetes 中的 Service 是一组Pod集合的抽象,能够将Pod 集合在网络上公开出去。我们可以使用 Service 让一组 Pod 可在网络上访问,这样客户端就能与之交互。在这种情况下,在集群内外部访问Pod时并不是直接接触Pod,而是通过Service。Service也是K8s里的资源对象。在创建的时候要定义端点集合(所谓端点集合就是Pod集合,也就是这个Service代表了哪些Pod),并且还要定义策略来决定如何访问到这些Pod。
为什么要有Service?
Pod是动态的,是临时资源,它不可靠也不耐用。每个Pod都有自己的IP地址,哪怕一个Pod“重启”了,它的IP也会发生变化。所以我们不希望前端客户端直接和每个Pod单独通讯,这样的通讯是不可靠的。
所以就提出了Service抽象。Service对象创建后,Kubernetes会为它分配一个IP地址,这个IP地址比较持久,不会轻易改变,前端只需要知道这个Service的IP地址就可以了,然后Service会将传过来的流量转发到它代表的Pod集合中的一个或一些Pod上去。
Service类型有哪些?
-
ClusterIP
Service的默认类型就是ClusterIP。也就是通过集群的内部 IP 公开 Service,选择该值时 Service 只能够在集群内部访问。
-
NodePort
这种类型是通过 每个节点上的IP和特定的静态端口(NodePort) 来公开Service。也就是说每个节点会将这个端口(每个节点上的相同端口号)上的流量代理到所创建的 Service。这样通过合适的协议和分配给该Service的端口连接到任何一个节点,我们都能从集群外部访问NodePort类型的Service·。
-
LoadBalancer
在使用支持外部负载均衡器的云平台时,如果将
type
设置为"LoadBalancer"
, 则平台会为 Service 提供负载均衡器 -
ExternalName
类型为 ExternalName 的 Service 将 Service 映射到 DNS 名称,而不是典型的选择算符。
如何定义 Service?
Service是Kubernetes中的一个对象,可以使用 Kubernetes API 创建、查看或修改 Service 定义。
例如,假定有一组 Pod,每个 Pod 都在侦听 TCP 端口 9376,并且它们还被打上 app.kubernetes.io/name=MyApp
标签。我们就可以定义一个 Service 来发布该 TCP 侦听器:
apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app.kubernetes.io/name: MyAppports:- protocol: TCPport: 80targetPort: 9376
应用上述清单时,系统将创建一个名为 “my-service” 的、 服务类型默认为 ClusterIP 的 Service。 该 Service 指向带有标签 app.kubernetes.io/name: MyApp
的所有 Pod 的 TCP 端口 9376。
需要解释的是,清单里的port指的是暴露给客户端的端口,外部的流量从port端口经过kube-proxy流入到后端pod的targetPort上,最后进入容器。