在前面的重要概念中我们介绍了service,这是kubernetes为了解决存在多个pod的情况下,如何不依赖随时变更的ip就能够正常访问到pod里面的容器所定义的新概念。

在实际的应用中,尽管我们都坚信Pod是健壮的,不会出现异常或者是销毁的情况。但是我们还是不应该期望这个可能性。

因为Pod是脆弱的。

每个Pod在被创建的时候都会分配随机的IP,这就意味着每一个Pod的IP都是不一样的。当我们线上的某一个Pod出现故障而被销毁的同时,会同步创建一个新的Pod,用新的Pod替代原来故障的继续工作,新的Pod会被分配新的IP地址,不会继续使用替换的Pod的IP,这个时候就会出现一个严重的问题:
Pod的IP随时发生变化,客户端该怎么去访问?

这时候kubernetes就定义了Service的概念。

  1. 创建Service
    从逻辑上来看,每一个Service代表了一组 Pod,具体是哪些 Pod 则是由我们在创建Pod时候所给他定义的 label 来决定的。
    每一个Service都有自己 IP,但是它所拥有的IP和Pod的不一样,这个 IP 是不变的。
    在实际的场景下,客户端只需要访问 Service 的 IP,不需要知道有多少个Pod或者是多少个Pod的IP,因为Kubernetes 则负责建立和维护 Service 与 Pod 的映射关系。无论后端 Pod 如何变化,对客户端不会有任何影响,因为 Service 没有变。

下面我们通过yaml来创建一个Service:
在这里插入图片描述
① v1 是 Service 的 apiVersion。

② 指明当前资源的类型为 Service。

③ Service 的名字为 httpd-svc。

④ selector 指明挑选那些 label 为 run: httpd 的 Pod 作为 Service 的后端。

⑤ 将 Service 的 8080 端口映射到 Pod 的 80 端口,使用 TCP 协议。

我们使用命令:

kubectl create -f httpd.yaml

kubectl get pod -o wide

在这里插入图片描述
我们可以看到,有三个副本被创建,分别被分配:10.100.224.248、10.100.224.247、10.100.24.241.

这是我们随机访问其中一个IP:
在这里插入图片描述
我们随机访问一个IP是没问题,但是作为客户端,我们总不可能记住这个随时可变的IP地址啊,这时候我们可以回顾刚刚的yaml文件,里面还同时创建了一个service,我们可以去获取这个service看看,并且进行访问:

kubectl get pod -o wide

kubectl get service

在这里插入图片描述
我们可以看到,除了创建三个Pod之后,还同时创建了一个service,还给它单独分配了IP地址,我们直接访问service的IP地址,也能够获取到我们的响应,证明实际上,我们只需要记住service的IP地址即可。

  1. Service的工作
    那么问题来了,为什么service会知道是这三个IP地址的呢,它和这三个Pod的IP地址映射关系在哪里保存或者是维护的呢?

我们可以对这个service进行详细的查看:

kubectl describe service service-httpd

在这里插入图片描述
其实在service里面,它自己维护着一个IP数组–Endpoints 。通过这个配置的维护,就可以与随时发生变化的pod进行映射关系了。

想了解更多不同领域的知识,请关于我的微信公众号:Hugo技术。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐