简介
在上篇中,我们部署了我们的应用,但我们访问是直接在应用所在的容器,使用IP+Port的方式直接访问的,style不够k8s,本篇文章我们将使用service和跨主机访问
内容概览
目前我们的应用大致如下:
我们的应用目前是部署在工作节点1上面,如上篇所示,我们可以在工作节点1上面直接使用应用容器的ip+port进行访问
➜ ~ curl http://10.244.1.8:9000/app/versionCheck\?version\=1
{"data":{"downloadUrl":null,"updateMsg":null,"latest":true},"code":200,"msg":null}#
但上面有个问题,每次重启,我们的应用ip是会变化的,也就是不固定,这样对我们访问会造成麻烦,我们不可能每次重启都去替换我们的访问ip
针对这种情况,k8s提供的解决方案是:Service
Service有一个固定的集群内访问IP,能够感知其对应的pod的ip变化,自动对应上
Service解决了Pod重启后的IP变化问题,但还有一个问题是跨主机访问问题:pod重启后,不一定在原来的node节点上,这个时候对我们访问也会带来麻烦,需要访问节点是能跨节点访问
针对跨主机访问问题,目前有很多解决方案,比如:Flannel,本篇也是基于Flannel进行探索的
整个如下图所示:
在工作节点和主节点上,我们都能通过service的集群IP进行访问,如下:
➜ dashboard curl http://10.103.5.88:9000/app/versionCheck\?version\=1
{
"data":{
"downloadUrl":null,"updateMsg":null,"latest":true},"code":200,"msg":null}
目前的概况就如上所示,接下来的我们就开始探索其中的原理,主要是两方面:
- 1.在工作节点中,如何通过service访问到具体的应用
- 2.主节点上没有部署有应用,是如何通过service访问到具体应用的
准备工作
本篇文章基于下面的文章:
本篇中,将应用重新部署了下,将网络插件contained换成了flanned,具体参考文章:[kubernetes] 跨云厂商使用公网IP搭建k8s v1.20.9集群
首先是参考链接配置eth0:1网卡
其他的也不复杂,我们先将之前部署的k8s卸载,然后初始化k8s集群即可
service的生成也比较简单,在Dashboard中部署的我们的应用时,设置service即可,如下图所示:
部署应用的时候选择service为Internal,即只集群内访问,不绑定主机节点端口,端口就填我们的应用对应端口接口:第一个端口是service的监听端口,第二个端口是pod应用的监听端口
本机内service访问原理解析
我们在工作节点1-IP:106.55.227.160上,使用service的方式访问应用:
➜ curl http://10.103.5.88:9000/app/versionCheck\?version\=1
{"data":{"downloadUrl":null,"updateMsg":null,"latest":true},"code":200,"msg":null}
通过查阅资料,其原理是使用Iptables,具体如下:
我们首先看看10.103.5.88这个ip相关的iptables规则配置
➜ ~ iptables -S -t nat |grep 10.103.5.88
-A KUBE-SERVICES -d 10.103.5.88/32 -p tcp -m comment --comment "xiuxian/auth-java:tcp-9000-9000-c8kgf cluster IP" -m tcp --dport 9000 -j KUBE-SVC-ATUXI35NVHBYDGFQ
如上所示:-d 10.103.5.88/32 + --dport 9000 :表示将访问10.103.5.88+9000端口的请求,转到链路规则KUBE-SVC-ATUXI35NVHBYDGFQ
所以我们接着看看KUBE-SVC-ATUXI35NVHBYDGFQ
➜ ~ iptables -S -t nat |grep KUBE-SVC-ATUXI35NVHBYDGFQ
-A KUBE-SVC-ATUXI35NVHBYDGFQ -m comment --comment "xiuxian/auth-java:tcp-9000-9000-c8kgf" -j KUBE-SEP-7ETKSBKARXRYVX3G
如上所示,这个又将这个请求转到了:KUBE-SEP-7ETKSBKARXRYVX3G
我们接着看KUBE-SEP-7ETKSBKARXRYVX3G
➜ ~ iptables -S -t nat |grep KUBE-SEP-7ETKSBKARXRYVX3G
-A KUBE-SEP-7ETKSBKARXRYVX3G -p tcp -m comment --comment "xiuxian/auth-java:tcp-9000-9000-c8kgf" -m tcp -j DNAT --to-destination 10.244.1.8:9000