什么是Service: 将一组 Pods 公开为网络服务的抽象方法。
举个例子:假如我们开发了一个后台管理应用【前后分离】,使用deployment部署成3份。然后需要给前端一个ip去访问我们这个应用,这时候我们需要提供什么ip给前端呢?这里不能是pod的ip,因为如果该节点的pod挂了,前端就访问不了了,而且这样也不具备负载均衡的能力。
这时候K8S的Service就派上用场了,看下图,这时候我们给到前端的ip就是service的ip,前端发起请求直接打到service,service具备赋值均衡的能力会将请求分摊到不同节点的pod。service还是具备服务发现的功能,如果某个节点的pod挂了,这时候service会发现该pod不可能,就将接收到的请求分发给其他的pod
接下来做个实验,以2台nginx为例【假设ngx就是我们的后端应用】,测试负载均衡和服务发现。我修改nginx的首页内容,分别为111和222,这时候通过service去访问pod的话,nginx的首页就会出现不一样。看下图:
修改2台nginx首页内容
看看是否修改成功,访问下2个pod的ip:port看看
接下来我们通过Service访问pod,使用以下命令暴露Deploy
kubectl expose deployment my-deploy-01 --port=8000 --target-port=80
expoose就是暴露的意思这里暴露的就是8000【也就是Service的8000端口对外暴露】端口,目标端口就是我们应用的端口,看我控制台执行的效果,先是查看deploment的名称,然后执行kubectl expose deployment my-deploy-01命令,再可以使用kubectl get service 查看下service,发现有个名称叫my-deploy-01且service的ip是10.96.175.47。最后用此ip:port访问下发现达到了负载均衡的效果
上面是以clusterIp的方式暴露端口,这种还是以集群内部的访问方式。接下来还可以使用NodePort的方式暴露service端口。
以NodePort的方式暴露service端口:
删除之前部署的deployment
再次以NodePort的方式部署,且使用clusterIp+8000端口访问Service会请求到ngx首页
以节点的ip+31573的端口访问nginx
总结
命令:kubectl expose deployment my-dep --port=8000 --target-port=80 --type=NodePort
该方式会给每个port生成一个端口,并且我们可以通过机器的节点ip去访问该端口也可以访问应用,这样就相当于对外网开放了,以下图为例:端口30948就是NodePort。这样我们就可以通过任意一台公网ip+nodePort的方式去访问ngingx。