Kubernetes网络插件flannel原理简介

这篇具有很好参考价值的文章主要介绍了Kubernetes网络插件flannel原理简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flannel是kubernetes的网络插件之一,通过构建k8s集群节点之间的overlay网络,实现跨节点通信等功能。flannel常用的网络转发模式有hostgw、udp、vxlan等,在实际生产中常用的是vxlan模式。

子网划分

k8s会为每个集群节点划分子网,这样pod调度到某节点时,就会按照该节点的子网网段分配ip,保障pod ip的集群唯一性。

我们可以查看/run/flannel/subnet.env 文件,里面主要包括当前节点的子网信息。例如本机集群192.168.249.10节点子网网段是10.244.0.0/24,192.168.249.12节点子网网段是10.244.1.0/24

Kubernetes网络插件flannel原理简介

Flannel通过daemonset的方式在每个k8s节点上运行了一个flanneld的服务,通过flanneld进程对节点进行创建隧道,添加路由信息,修改iptables等操作。

跨节点Pod通信

我们以vxlan模式为例看一下flannel如何实现的pod间的通信。

Flannel创建名为flannel.1的vxlan设备(nolearning),设备ip是子网的第一个IP 10.244.1.0,并把设备的mac和ip和本节点的ip记录到etcd中。还会创建名为cni0的网桥,网桥的ip是子网的第二个ip 10.244.1.1,起到docker0网桥的作用。

Kubernetes网络插件flannel原理简介

我们先看一下跨节点通信的流程图,然后一步一步查看数据包流向。

Kubernetes网络插件flannel原理简介

我们从节点192.168.249.12上的pod1 10.244.1.4中ping节点192.168.249.10上的pod2  10.244.0.2

Kubernetes网络插件flannel原理简介

进入pod1 执行route -n,我们发现pod的默认网关是10.244.1.1,也就是cni0Kubernetes网络插件flannel原理简介

为什么pod的eth0可以发给cni0网桥呢,查看pod的eth0网卡,发现他的对端是if11。

Kubernetes网络插件flannel原理简介

我们再看宿主机上的网络设备if11是vethc8894304,这个设备在cni0网桥上。这里可以理解成一根网线一头插在pod里,另一头插在了cni0网桥上。

Kubernetes网络插件flannel原理简介

到了cni0网桥其实就到了宿主机,再看宿主机的路由信息。可以发现flannel专门为每个子网网段创建了一条路由,10.244.0.0/24网段就通过宿主机上的vxlan设备flannel.1发给网关10.244.0.0,网关的ip、mac与宿主机的对应关系都可以在etcd中查到。

Kubernetes网络插件flannel原理简介

之后通过flannel.1 进行vxlan封包。vxlan包结构如图所示。

Kubernetes网络插件flannel原理简介

包内层就是pod到pod发送的二层链路层包,在此基础上添加了vxlan的header,并使用udp、宿主机的ip和mac信息进行封包后,传输给对方宿主机再进行拆包。

最后查看对端宿主机的路由表,route -n。Kubernetes网络插件flannel原理简介

对于本机pod网段的数据包 10.244.0.0/24,都转给了虚拟网桥cni0,而cni0再通过上面的veth对将数据包转发到pod中。至此就完成了跨node节点的pod通信。

同节点Pod通信

了解了跨节点pod通信,再考虑同节点pod通信就明白,直接通过cni0网桥就可以了。

Kubernetes网络插件flannel原理简介

UDP与Host-gw模式

Flannel还提供了UDP和Host-gw两种模式。UDP模式和Vxlan基本一致,只是封包方式不同,UDP封包结构如下图所示。

Kubernetes网络插件flannel原理简介

所以UDP封包就是直接将内层IP层数据包封装到了UDP中,由于是使用flanneld应用层面进行封包解包,效果比vxlan内核封包要差,使用较少。

我们修改flannel的configmap,将flannel从vxlan模式换成host-gw模式,并重启flannel的pod。这样就从vxlan模式切换成了host-gw模式。

kubectl edit cm -nkube-system kube-flannel-cfg

Kubernetes网络插件flannel原理简介

我们发现其他pod网段的路由信息有所变化,输出网卡从flannel.1变成了本机网卡,因为不需要进行封包,同时flannel的mtu从1450改成1500。而网关直接配置为宿主机ip,这就需要所有的集群节点处于同一个二层网络中,即二层可达。这也是host-gw模式的最大限制。

Kubernetes网络插件flannel原理简介

最后,如果你对kubernetes感兴趣的话,欢迎关注~文章来源地址https://www.toymoban.com/news/detail-417629.html

到了这里,关于Kubernetes网络插件flannel原理简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S安装网络插件flannel

    引言:K8S集群刚刚创建完成之后,由于网络环境未进行配置,在执行查看Node节点时,节点状态会显示NotReady,信息如下。导致显示这个状态的原因是因为还未安装网络插件,注意,该网络插件只在master节点中执行就可以了。本文使用flanner网络查看 执行后,会显示各种文件

    2024年02月15日
    浏览(40)
  • 【K8S系列】深入解析k8s网络插件—Flannel

      做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。 文章标记颜色说明: 黄色:重要标题 红色:用来标记结论 绿色:用来标记论点 蓝色:用来标记论点 Kubernetes (k8s) 是一个容器编排平台,允许在容器中运行应用程序和服务。今天学习一下k8s网络插件

    2024年02月16日
    浏览(41)
  • 深入 K8s 网络原理(一)- Flannel VXLAN 模式分析

    这周集中聊下 K8s 的集群网络原理,我初步考虑分成3个方向: Pod-to-Pod  通信(同节点 or 跨节点),以 Flannel VXLAN 模式为例; Pod/External-to-Service  通信,以 iptables 实现为例; Ingress  原理,以 NGINX Ingress Controller 实现为例; 其他:(到时候看心情)Flannel host-gw 模式,Calico,…

    2024年01月17日
    浏览(40)
  • k8s kubernetes 1.23.6 + flannel公网环境安装

    准备环境,必须是同一个云服务厂商,如:华为,阿里、腾讯等,不要存在跨平台安装K8S,跨平台安装需要处理网络隧道才能实现所有节点在一个网络集群中,这里推荐使用同一家云服务厂商安装即可 这里使用centos7进行安装: 必须先开通端口 2380 2379 10250 10257 10259 6443 否则会

    2024年02月07日
    浏览(43)
  • K8s进阶之网络:pod内不同容器、同节点不同pod通信、CNI插件、不同节点pod通信、Flannel容器网络、Serivce连接外部网络、服务发现、Nginx反向代理与域名、Ingress代理

    Pod是Kubernetes中最小的可部署单元,它是一个或多个紧密关联的容器的组合,这些容器共享同一个网络命名空间和存储卷,因此Pod中的 所有容器都共享相同的网络命名空间和IP地址——PodIP ,所以在同一个Pod内的容器间通信可以 通过localhost直接通信 。 k8s创建Pod时永远都是首先

    2024年02月05日
    浏览(53)
  • k8s Calico网络和flannel网络对比

    Calico 和 Flannel 是 Kubernetes(K8s) 中常用的两种网络插件,它们都有各自的优点和适用场景。以下是 Calico 网络与 Flannel 网络的一些主要对比点: Calico 1. 技术基础 :Calico 依赖于 BGP(Border Gateway Protocol)路由协议来实现节点间通信,可以支持大规模的集群。 2. 性能 :由于使用

    2024年04月27日
    浏览(56)
  • etcd跨主机通信与Flannel

    Docker 默认的网络环境下 , 单台主机上的 Docker 容器可以通过 docker0 网桥直接通信 , 而不同主机上的 Docker 容器之间只能通过在主机上做端口映射进行通信。 这种端口映射方式对很多集群应用来说极不方便。 如果能让 Docker 容器之间直接使用自己的 IP 地址进行通信 , 会解决很多

    2024年01月25日
    浏览(29)
  • 解决k8s拉取flannel失败的方法

    k8s版本:1.26.0 flannel:0.20.2 flannel-cni-plugin:v1.1.0 flannel是k8s常用的网络插件,正常的部署步骤为: 打开flannel项目: https://github.com/flannel-io/flannel 按照指引执行: kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml 但是在国内如果按照该步骤,则会显示

    2024年02月16日
    浏览(29)
  • Flannel dial tcp X.X.X.X i/o timeout

    E0826 15:59:20.782550       1 main.go:229] Failed to create SubnetManager: error retrieving pod spec for \\\'kube-flannel/kube-flannel-ds-k79vs\\\': Get \\\"https://10.0.0.1:443/api/v1/namespaces/kube-flannel/pods/kube-flannel-ds-k79vs\\\": dial tcp 10.0.0.1:443: i/o timeout  这种报错一般是 集群网段设置错误造成的 查看kube-flannel.yaml   step1 检查

    2024年02月11日
    浏览(33)
  • Pod提示NetworkPlugin cni failed to set up .. network:open/run/flannel/subnet.env:nosuchfileordirectory

    K8s在创建pod时发现pod状态为ContainerCreating状态 检查pod的日志发现提示 Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container \\\"fdd30141bf51b68d4f08a2405ea287508aa0d585d30c853a849d9d57cb7c1062\\\" network for pod \\\"tiller-deploy-58565b5464-zhnml\\\": NetworkPlugin cni failed to set up pod \\\"tiller-deploy-585

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包