kubernetes 从外部到容器的完整流量路径介绍

前言

通过实际启动的实例,介绍网络流量路径。
不同的插件,不同的访问方式都略有不同,这里只能举一个最合适的例子介绍网络,不能代表所有的网络实现方式。

环境

操作系统: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。如下图:


image.png

我们可以通过任意一个物理节点ip访问到这个nginx,但是nginx实际运行在某一个物理节点上。
当前环境的pod运行在node3上,可以通过node1的ip访问到此pod。

首先到node1上,看看这个30000端口如何被导向到node3上。

在node1执行:

ipvsadm -Ln
image.png

上图可以看到将本地的30000端口导向了 10.233.69.21:80

继续在node1上执行:

route -n
image.png

上图可以看到将 10.233.69.0/24 的包发往 10.10.10.213(这是node3节点的真实ip)
至此,流量已然发往到pod所在节点。接下来就是节点与pod之间的通信。

在node3上查看nginx容器的ip


image.png

上图可以看出,流量直接指向具体的容器,不用再考虑nat转换。现在只需要查出容器与宿主机的连通实现。

容器中的 eth0@if10 可以看出这是一个 veth pair(本人其它文章有介绍,也可自行百度)。势必存在与之连通的另外一张网卡。

在node3上执行:

ip a

可以看到与容器网卡组成一对的另外一张网卡,并且没有使用网桥之类。那么接下来就要看如何在本机将流量传入这个veth pair中。


image.png

继续在node3上执行:

ip route
image.png

上图可以看出,10.233.69.21的流量直接传入 veth pair。从而到达容器当中。

至此 NodePort类型的服务访问链路已全部走通。

总结:
外部流量在到达node节点后,node节点的ipvs 与路由将流量导向pod所在节点,pod所在节点又利用veth pair和路由将流量导向容器当中。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容