Service
Pod
的生命周期是有限的,死亡过后不会复活,RC
和Deployment
可以动态创建和销毁Pod
, 这样会出现我们重新启动了Pod
的话,那么它的IP
也可能会发生变化,如果一组后端的Pod
的集合为集群中的其他前端Pod
提供API
服务,如果在前端的Pod
中把所有的这些后端的Pod
都写死,后端Pod
正常的话这样是没有问题的,但是如果后端Pod
挂掉,然后重新启动了,IP
地址很有可能会变化,这是前端就有可能访问不到后端的服务了
解决办法
解决办法有很多种,从早期的
nginx
负载均衡来处理,以及后面的服务发现
工具解决,Consul
,Zookeeper
,etcd
, 我们只需要服务注册到服务发现中心就可以了,这些工具会动态的更新Nginx
的配置,这样就不用手动去修改Nginx
的配置文件
Service
Kubernetes
也为我们提供了这样一个资源对象,Service
, 当我们的Pod
被销毁或者新创建过后,我们可以把这个Pod
的地址注册到这个服务发现中心去就可以了,前端不用直接去连接后台的Pod
集合,连接到Service
上即可,Service
是一种抽象对象,它定义了一组Pod
的逻辑集合和用于访问他们的策略,一个Service
下面包含的Pod
集合一般是由Label Selector
来决定的,假如后端运行了很多副本,这些副本可能会发生变化,前端不需要关心这些变化,也不需要自己用一个列表来记录这些后端的服务,Service
可以帮我们达到解耦的目的
Service 的三种 IP
Node IP
:Node
节点的IP
地址Pod IP
:Pod
的IP
地址Cluster IP
:Service
的IP
地址
Node IP
Node IP
是Kubernetes
集群节点的物理IP地址, 属于这个网络之间的服务器之间可以直接通信,所以Kubernetes
集群要想访问Kubernetes
集群内部的某个节点或者服务,是通过Node IP
进行通信的
Pod IP
Pod IP
是每个Pod
的IP
地址, 它是Docker Engine
根据docker0
网桥的IP地址段进行分配的
Cluster IP
Cluster IP
是一个虚拟IP, 仅仅作用于Kubernetes Service
这个对象, 由Kubernetes
自己进行管理和分配地址,无法ping这个地址。
定义Service
Service
的定义方式和我们之前定义的各种资源对象方式类似,我们有一组Pod
, 对外暴露的端口是8080
, 同时都被打上了app=myapp
的标签,那么我们可以定义出下面的YAML
文件
Pod
定义
1 |
|
Service
定义
1 |
|
创建 Service 对象
1 | kubectl apply -f nginx-deploy.yaml |
myservice
的Service
对象,他会将请求代理到使用 TCP 端口为 8080,同时具有标签app=myapp
的Pod
上,同时会被系统分配一个Cluster IP
, 而且Service
还会持续的监听selector
下面的Pod
, 这些Pod
的集合都被收集到myservice
的Endpoints
对象上去
查看Service 对象
1 | kubectl get svc |
查看Service 详细
1 | kubectl describe svc myservice |
可以看到
Endpoints
上已经收集了符合规则的Pod
集合, TargetPort 可以是端口,也可以设置成一个字符串
验证访问 Service
1 | kubectl run -it testservice --image=busybox /bin/bash |