前言
通过实际启动的实例,介绍网络流量路径。
不同的插件,不同的访问方式都略有不同,这里只能举一个最合适的例子介绍网络,不能代表所有的网络实现方式。
环境
操作系统:centos7
kubernets版本:v1.13.4
service类型:NodePort
网络插件:calico
正文
kubernetes 1.8 开始,kube-proxy的实现载体由iptables转为ipvs(可以通过kube-proxy的配置文件看出,/var/lib/kube-proxy/config.conf)。
kube-proxy的作用为:负责kubernetes的网络实现。比如让外部访问到pod。
本环境已启动一个pod,这里主要讨论nginx容器的流量路径。nginx的targetPort为80,nodePort为30000。如下图:
我们可以通过任意一个物理节点ip访问到这个nginx,但是nginx实际运行在某一个物理节点上。
当前环境的pod运行在node3上,可以通过node1的ip访问到此pod。
首先到node1上,看看这个30000端口如何被导向到node3上。
在node1执行:
ipvsadm -Ln
上图可以看到将本地的30000端口导向了 10.233.69.21:80
继续在node1上执行:
route -n
上图可以看到将 10.233.69.0/24 的包发往 10.10.10.213(这是node3节点的真实ip)
至此,流量已然发往到pod所在节点。接下来就是节点与pod之间的通信。
在node3上查看nginx容器的ip
上图可以看出,流量直接指向具体的容器,不用再考虑nat转换。现在只需要查出容器与宿主机的连通实现。
容器中的 eth0@if10 可以看出这是一个 veth pair(本人其它文章有介绍,也可自行百度)。势必存在与之连通的另外一张网卡。
在node3上执行:
ip a
可以看到与容器网卡组成一对的另外一张网卡,并且没有使用网桥之类。那么接下来就要看如何在本机将流量传入这个veth pair中。
继续在node3上执行:
ip route
上图可以看出,10.233.69.21的流量直接传入 veth pair。从而到达容器当中。
至此 NodePort类型的服务访问链路已全部走通。
总结:
外部流量在到达node节点后,node节点的ipvs 与路由将流量导向pod所在节点,pod所在节点又利用veth pair和路由将流量导向容器当中。