k8s教程:10.通过Service来访问我们的Pod
在前面的重要概念中我们介绍了service,这是kubernetes为了解决存在多个pod的情况下,如何不依赖随时变更的ip就能够正常访问到pod里面的容器所定义的新概念。在实际的应用中,尽管我们都坚信Pod是健壮的,不会出现异常或者是销毁的情况。但是我们还是不应该期望这个可能性。因为Pod是脆弱的。每个Pod在被创建的时候都会分配随机的IP,这就意味着每一个Pod的IP都是不一样的。当我们线上的
在前面的重要概念中我们介绍了service,这是kubernetes为了解决存在多个pod的情况下,如何不依赖随时变更的ip就能够正常访问到pod里面的容器所定义的新概念。
在实际的应用中,尽管我们都坚信Pod是健壮的,不会出现异常或者是销毁的情况。但是我们还是不应该期望这个可能性。
因为Pod是脆弱的。
每个Pod在被创建的时候都会分配随机的IP,这就意味着每一个Pod的IP都是不一样的。当我们线上的某一个Pod出现故障而被销毁的同时,会同步创建一个新的Pod,用新的Pod替代原来故障的继续工作,新的Pod会被分配新的IP地址,不会继续使用替换的Pod的IP,这个时候就会出现一个严重的问题:
Pod的IP随时发生变化,客户端该怎么去访问?
这时候kubernetes就定义了Service的概念。
- 创建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地址即可。
- Service的工作
那么问题来了,为什么service会知道是这三个IP地址的呢,它和这三个Pod的IP地址映射关系在哪里保存或者是维护的呢?
我们可以对这个service进行详细的查看:
kubectl describe service service-httpd
其实在service里面,它自己维护着一个IP数组–Endpoints 。通过这个配置的维护,就可以与随时发生变化的pod进行映射关系了。
想了解更多不同领域的知识,请关于我的微信公众号:Hugo技术。
更多推荐
所有评论(0)