Deployment只是保证了支撑服务的Pod的数量,但是没有解决如何访问这些服务的问题。一个Pod只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的IP启动一个新的Pod。因此不能以确定的IP和端口号提供服务。
要稳定地提供服务,需要服务发现和负载均衡能力。服务发现是一个微服务中很基础的概念,即当服务提供者网络发生变化时,服务消费者能及时获得最新的位置信息。对于k8s来说,服务提供者就是Pod,提供服务发现能力的是Service。Deployment和Service分别负责Pod的部署和访问策略,互不相关。
所以从下面这张图也可以看出来,Service和Deployment并不是上下层级的关系。
1. Service YAML
一个简单的Service YAML模板如下:
1 | apiVersion: v1 |
可以看到它是由selector.app来选择需要暴露的Pod。spec.ports.port是service对外暴露的端口,而targetPort是Pod的端口。默认使用TCP协议。
对于我们的POC的网站,service YAML定义如下:
1 | apiVersion: v1 |
当我们查看已部署的service的时候,可以看到该service对应的ip: