Kubernetes(k8s)CNI(flannel)网络模型原理

news2025/7/11 18:22:48

一、概述

Kubernetes 采用的是基于扁平地址空间的、非NAT的网络模型,每个Pod有自己唯一的IP地址。网络是由CNI(container network interface)插件建立的,而非K8S本身。

二、常见的几种CNI插件介绍

为了使容器之间的通信更加方便,Google 和 CoreOS 主导制定了一个容器网络标准CNI(Conteinre Network Interface) 。

k8s官网:Installing Addons | Kubernetes
CNI可允许K8S配置任何CNI插件,常见的CNI插件有以下几种:

1)Flannel(本章讲解)

Flannel是由CoreOS开发的项目,是容器编排系统中最成熟的网络结构示例之一,旨在实现更好的容器间和主机间网络。

与其他方案相比,Flannel相对容易安装和配置。它被打包为单个二进制文件flanneld,许多常见的Kubernetes集群部署工具和许多Kubernetes发行版都可以默认安装Flannel。Flannel可以使用Kubernetes集群的现有etcd集群来使用API存储其状态信息,因此不需要专用的数据存储。

详细参考 GitHub - flannel-io/flannel: flannel is a network fabric for containers, designed for Kubernetes
官网:https://coreos.com/flannel/docs/latest/
文档:https://coreos.com/flannel/docs/latest/kubernetes.html

2)Calico

Calico是Kubernetes生态系统中另一种流行的网络选择,它提供收费的技术支持。虽然Flannel被公认为是最简单的选择,但Calico以其性能、灵活性而闻名。Calico的功能更为全面,更为复杂。它不仅提供主机和pod之间的网络连接,还涉及网络安全和管理。Calico CNI插件在CNI框架内封装了Calico的功能。

详细参考 GitHub - projectcalico/cni-plugin: Calico CNI plugin

3)Romana

Romana是Panic Networks在2016年新提出的开源项目,旨在解决Overlay方案给网络带来的开销。虽然目标和Calico基本一致,但其采取的方法却截然不同,具体项目的发展有待观察。

4)Weave Nets

大家都叫惯了weave,实际上目前该产品的名字叫做Weave Nets。

Weave是由Weaveworks提供的一种插件,它提供的模式是在集群中的节点之间创建网状的overlay网络。与Calico一样,Weave也为Kubernetes集群提供网络策略功能。

三、Flannel 组件的解释

  • Cni0:网桥设备,每创建一个pod都会创建一对 veth pair,其中一端是pod中的eth0,另一端是Cni0网桥中的端口 (网卡),Pod中从网卡eth0发出的流量都会发送到Cni0网桥设备的端口(网卡)上,Cni0 设备获得的ip地址是该节 点分配到的网段的第一个地址。
  • Flannel.1:overlay网络的设备,用来进行vxlan报文的处理(封包和解包),不同node之间的pod数据流量都从 overlay设备以隧道的形式发送到对端。

Flannel的系统文件及目录

$ find / -name flannel

当前node主机IP地址范围

$ cat /run/flannel/subnet.env

四、Flannel网络通信原理实验

1)同节点Pod之间的通信

在容器启动前,会为容器创建一个虚拟Ethernet接口对,这个接口对类似于管道的两端,其中一端在主机命名空间中,另外一端在容器命名空间中,并命名为eth0。在主机命名空间的接口会绑定到网桥。网桥的地址段会取IP赋值给容器的eth0接口。

【实验】这里利用nodeName特性将Pod调度到相同的node节点上(亲和性),创建两个pod

$ cat >p1.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx
  name: p1
  namespace: default
spec:
  nodeName: k8s-node1
  containers:
  - image: busybox
    name: c1
    command: 
    - "ping"
    - "baidu.com"
EOF

$ cat >p2.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: busybox
  name: p2
  namespace: default
spec:
  nodeName: k8s-node1
  containers:
  - image: busybox
    name: c2
    command: 
    - "ping"
    - "baidu.com"
EOF

执行

$ kubectl apply -f p1.yaml -f p2.yaml
$ kubectl get pod p{1,2}
$ kubectl get pod p{1,2} -o wide
# p1 ping p2
$ kubectl exec -it p1 -- ping 10.244.1.230

工作流程

1、源容器向目标容器发送数据,数据首先发送给 cni0 网桥
查看路由

$ kubectl exec -it p1 -c c1 -- ip route
$ kubectl exec -it p2 -c c2 -- ip route

2、cni0 网桥接受到数据后,将其转交给 flannel.1 虚拟网卡处理

cni0 收到数据包后,docker0的内核栈处理程序会读取这个数据包的目标地址,根据目标地址将数据包发送给下一个路由节点:

$ ip a
$ ip route

3、flannel.1 接受到数据后,对数据进行封装,并发给宿主机的 ens33,再通过ens33出外网,或者访问不同node节点上的pod

针对相同节点上的pod通信,直接cni0 网桥通信,流程如下图:

2)不同节点Pod之间的通信

【实验】这里利用nodeName特性将Pod调度到不同的node节点上(亲和性),创建两个pod

$ cat >p3.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx
  name: p3
  namespace: default
spec:
  nodeName: k8s-node1
  containers:
  - image: busybox
    name: c3
    command: 
    - "ping"
    - "baidu.com"
EOF

$ cat >p4.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: busybox
  name: p4
  namespace: default
spec:
  nodeName: k8s-node2
  containers:
  - image: busybox
    name: c4
    command: 
    - "ping"
    - "baidu.com"
EOF

执行

$ kubectl apply -f p3.yaml -f p4.yaml
$ kubectl get pod p{3,4}
$ kubectl get pod p{3,4} -o wide
# p3 ping p4
$ kubectl exec -it p3 -- ping 10.244.1.230

工作流程上面已经讲解了,这里就不重复了。流程如下图:

3)Pod与Service之间的通信

在不同节点上的Pod通信中,我们知道了Pod是以IP地址进行通信,但Kubernetes 的集群中, Pod 可能会频繁的销毁和创建,也就是说 Pod 的 IP 不是固定的。为了解决这个问题,Service 提供了访问 Pod 的抽象层,即为一组功能相同的Pod提供单一不变的接入点资源。无论后端的 Pod 如何变化,Service 都作为稳定的前端对外提供服务。同时,Service 还提供了高可用和负载均衡功能,Service 负责将请求转发给正确的 Pod。

【实验】因为在pod基本上都是由控制器管理,所以这里就创建Service和Deployment

cat >Service-Deployment-test001.yaml<<EOF
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc001
  labels:
    app: nginx-svc001
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080
  type: NodePort 
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-deployment001
spec:
  replicas: 2
  selector:
    matchLabels:
     app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

执行

$ kubectl apply -f Service-Deployment-test001.yaml
$ kubectl get pod -o wide|grep nginx-deployment001
$ kubectl get svc nginx-svc001

发现每个node节点上都运行了一个pod,curl验证是否正常访问

$ curl 192.168.0.113:30080

$ ipvsadm -Ln|grep -A10 10.1.35.17
$ ss -tnlp|grep 30080

流程图如下:

关于Kubernetes(k8s)CNI(flannel)网络模型的介绍就先到这里了,有疑问的小伙伴,欢迎给我留言哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络面试大总结

本文分文五大部分&#xff0c;第一部分总纲说明计算机网络层次划分的三种模型&#xff0c;一到四部分以TCP/IP协议模型作为划分标准&#xff0c;分别说明各层作用和最常见的面试题&#xff0c;最后总结网络综合面试题&#xff0c;历时六天全文一千字。 其他经典面试题参考程序员…

虹科校园大使招募令

虹科校园大使招募令 我们正式邀请你成为虹科校内明星代言人&#xff01; 近距离接触技术大牛工作领域 来自人力总监的职业发展指导 官方校园大使认证证书 走内部通道提前斩获校招offer 你将成为 校园品牌首席推广师 赋予你自主“DIY”的权利&#xff0c;与校招负责人一起…

损失函数——机器学习

目录 一、实验内容 二、实验过程 1、算法思想 2、算法原理 3、算法分析 三、源程序代码 四、运行结果分析 五、实验总结 一、实验内容 理解损失函数的基本概念&#xff1b;理解并掌握均方差损失函数的原理&#xff0c;算法实现及代码测试分析&#xff1b;理解并掌握交叉…

【linux】linux实操篇之权限管理

14天学习训练营导师课程&#xff1a; 互联网老辛《 符合学习规律的超详细linux实战快速入门》 目录前言权限的基本介绍rwx权限详解更改文件属性1、chgrp&#xff1a;更改文件属组2、chown&#xff1a;更改文件属主&#xff0c;也可以同时更改文件属组3、chmod&#xff1a;更改文…

帷幄前沿茶话丨如何发起一场直播间运营变革?

打开抖音&#xff0c;各种各样的带货模式都有。吃播的、喊麦的、跳舞的、说相声的&#xff0c;各种表现形式都可以是带货的手段。 但实际效果如何复盘&#xff1f;一旦感性的带货模式回归到理性分析&#xff0c;问题就没那么简单了。 电商的关键衡量指标是 GMV。直播带货中&…

[附源码]java毕业设计学院竞赛管理信息系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

RabbitMQ【基本使用】

目录 消息队列 1. Message queue 释义 1.1 问题思考 ? 1.2 存在问题 1.3 优化方案 1.4 案例分析 1.5 带来的好处 1.6 消息队列特点 1.7 Email邮件案例分析 2. 消息队列相关 2.1 AMQP 3. Docker安装部署RabbitMQ 4. springboot连接配置 4.1 RabbitMQ 配置账号…

Unity记录

第四课&#xff1a;组件 自定义组件&#xff0c;主要是 编写 脚本 脚本&#xff1a;要求必须 挂载 到游戏物体上&#xff0c;才能使用 主要组件&#xff1a; &#xff08;1&#xff09;gameObject 游戏对象 VS中的显示 总结&#xff1a; //属性 name:名称 tag : 标签名称 ac…

Execution failed for task ‘:app:javaPreCompileDebug‘.

debug运行app到模拟器的时候&#xff0c;一直报错&#xff0c;然后百度了下&#xff0c;给出的答案是&#xff1a; android { defaultConfig { //添加如下配置就OK了 javaCompileOptions { annotationProcessorOptions { includeCompileClasspath true } } } 但是加了之后&am…

[附源码]java毕业设计养老护理综合服务系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

个人养老金真的要来了,详解人社部、财政部、税务局、银保监会和证监会联合发布的《个人养老金实施办法》(要点概览+示意图+逐条解读)

11月5日&#xff0c;人力资源社会保障部、财政部、国家税务总局、银保监会、证监会联合发布了《个人养老金实施办法》。&#xff08;人社部发〔2022〕70号&#xff09; 11月18日&#xff0c;中国银保监会发布了《商业银行和理财公司个人养老金业务管理暂行办法》。&#xff08;…

将一个硬盘空间分配给另一个硬盘,怎么把一个磁盘的空间给另一个磁盘

用户在管理电脑磁盘分区的时候&#xff0c;为了更好地利用磁盘分区&#xff0c;需要对磁盘分区进行调整&#xff0c;如果涉及到磁盘分区调整&#xff0c;将一个硬盘空间分配给另一个硬盘&#xff1f;那么&#xff0c;在本文中&#xff0c;易我小编将介绍电脑磁盘分区调整的知识…

【Linux】线程池

文章目录1.线程池概念2.线程池的优点3.线程池的应用场景4.线程池的实现5.STL和智能指针和线程安全5.1其他常见锁5.2读写锁1.线程池概念 线程池是一种线程使用模式。 线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线 程&#xff0c;等待…

土地覆盖数据集汇总

前言 土地覆盖数据是理解人类活动与全球变化之间复杂相互作用的关键信息来源,在改善生态系统、水文和大气模型的性能方面发挥着关键作用。而土地覆盖变化(LCC)是全球环境变化的起因和结果&#xff0c;影响着全球能量平衡和生物地球化学循环&#xff0c;进而影响气候变化和生态系…

Flutter中GetX系列二--Snackbar基本使用(顶部弹窗)

Snackbar基本使用 第一步&#xff1a;应用程序入口设置 当我们导入依赖后&#xff0c;在应用程序顶层把GetMaterialApp 作为顶层&#xff0c;如下所示 import package:flutter/material.dart; import package:get/get.dart;void main() {runApp(MyApp()); }class MyApp exte…

智慧物流解决方案-最新全套文件

智慧物流解决方案-最新全套文件一、建设背景行业痛点二、建设思路三、建设方案四、获取 - 智慧物流全套最新解决方案合集一、建设背景 随着物流国际化发展以及信息技术的普遍应用&#xff0c;物流管理由手工作业到半自动化、自动化&#xff0c;直至智能化的发展过程。面对现代…

MySQL之索引

引言 数据库作为项目中必不可少且运行速度相对较慢的一环&#xff0c;尤其是在大数据量下保证其更高的性能、更稳定的性能是每个后端程序员必备的技能。MySQL在执行查询语句时&#xff0c;会通过IO扫描磁盘&#xff0c;遍历数据表中的每一条数据&#xff0c;时间复杂度为O(N)&…

【机器学习】EM算法

EM算法 目录一、似然函数与极大似然估计二、Jenson不等式三、数学期望的相关定理四、边缘分布列五、EM算法一、似然函数与极大似然估计 例一 现有一个不透明的罐子&#xff0c;里面装有质地、大小均相同而颜色不同的黑白两种球&#xff08;数目未知&#xff09;。现要求在经过…

MyBatis 增删改查操作

什么是 MyBatis&#xff1f; mybatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apach 的一个开源项目 iBatis&#xff0c;2021 年这个项目由 apach software foundation 迁移到了 google code&#xff0c;并且改名为 MyBatis。2013 年 11 月迁移到…

[附源码]java毕业设计氧气罐管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…