1.service
由RS和RC托管的pod,随时都会因为各类原因而死亡,或是因为物理节点宕机,或是因为pod中进程异常终止。为了保证集群中总是存在replica count个pod,RS和RC就会创建新的pod,而新的pod的ip地址不会与旧pod的ip地址一模一样。这样的行为,使得pod的ip地址总是在不停变化的。因此希望有一个组件能够对外提供一个固定单一的ip和端口地址,然后所有想要访问pod的链接,都由这个拥有固定单一ip地址的组件重定向至集群中的pod。这个组件就是service。
1.1 service 中的selector
//创建一个service的yaml文件片段
ports:
-port:80
targetPort:8080
selector:
app:kubia
这个service将在端口80上面监听,并请求转发到标签名为app=kubia的pod的8080端口上。换句话说,想要访问标签名为app=kubia的pod,就可以通过直接访问这个service的ip地址。这个service将会将链接请求重定向至标签名为app=kubia的pod。
Q:若在创建pod之后,再创建service,pod如何获取service的ip地址?
A:pod能够自动的通过环境变量来获取service的ip地址,不过在这之前,应该删除掉旧的pod,然后由RC和RS自动创建出来新的pod将会自动的知道service的ip地址。
BTW:service的ip是虚拟ip地址,无法使用ping命令ping通。
1.2 selector与endpoint
在上文中提到了service的作用-----对外提供统一固定的ip地址,并将请求重定向至集群中的pod。其中“将请求重定向至集群中的pod”就是通过endpoint与selector协同工作实现。selector是用于选择pod,由selector选择出来的pod的ip地址和端口号,将会被记录在endpoint中。endpoint便记录了所有pod的ip地址和端口号。当一个请求访问到service的ip地址时,就会从endpoint中选择出一个ip地址和端口号,然后将请求重定向至pod中。
//使用命令kubectl describe svc kubia 的部分返回
Endpoints:10.108.1.4:8080,10.108.2.5:8080 ......//所有pod的ip地址和端口号。
endpoint也可以手动自己配置,可以通过yaml文件生成endpoint资源。
//一个endpoint的yaml文件
-addresses
-ip:xx.x.x.x
-ip:xx.x.x.x
Q:为什么要将endpoint单独剥离出来,并可以手动创建它?
A:这样可以人为地将所有访问服务的链接请求,重新定向至自己希望的ip地址,这个ip地址可以是由第三方软件公司所i共的服务。