K8s bridge、ip分配原理

2023-05-16

一个Blog (jerichoking.wtf) 自建网站欢迎来戳

一、项目地址

GitHub - containernetworking/plugins: Some reference and example networking plugins, maintained by the CNI team.

二、项目介绍

bridge、IPAM 插件都在K8s的网络插件里面


三、bridge

1.原理:

bridge插件首先创建一个虚拟网桥,其功能类似物理交换机,将所有容器接入一个二层网络;容器接入是通过创建的veth pair(虚拟网卡对)实现,将网卡对的一端放在容器中并分配IP地址,另一端放在host的namespace内连上虚拟网桥,网桥上可以配置IP作为容器的网关,通过网桥连接了两个不同namespace内的网卡,容器内发出的数据包可通过网桥转发到host网络协议栈或进入另一个容器,最终实现容器之间、容器和主机间、容器和服务间的通信。

2.工作流程

创建容器时的动作
1)按名称检查网桥是否存在,若不存在则创建一个虚拟网桥
2)创建虚拟网卡对,将host端的veth口连接到网桥上
3)IPAM从地址池中分配IP给容器使用,并计算出对应网关配置到网桥
4)进入容器网络名称空间,修改容器端的网卡ip并配置路由
5)使用iptables增加容器内部网段到外部网段的masquerade规则
6)获取当前网桥信息,返回给调用者

删除容器时的动作
1)按输入参数找到要删除容器的IP地址,调用ipam插件删除地址并将IP归还地址池
2) 进入容器网络隔离ns,根据容器IP找到对应的网络接口并删除
3) 在节点主机上删除创建网络时添加的所有iptables规则

数据结构

解析bridge配置需转化的json结构

接口

网桥提供了三个接口add、del、check

add:解析配置文件,创建网桥,虚拟网卡对、获取当前namespace,用虚拟网卡对将网桥和namespace连接,调用ipam插件给namespace侧的虚拟网卡对分配ip,配置路由,配置snat,返回bridge信息

del: 通过ipam插件删除容器申请的IP地址,并归还到地址池,进入容器ns删除对应的网络接口veth和IP地址,snat

check: 调用ipam插件ExecCheck进行检查, 检测bridge端口类型和mac地址,检测容器接口类型和mac地址,检查bridge和容器的veth是否配对,检查ip是否配置正确,检查route是否配置正确

四、IP Address Management (IPAM)

DHCP模式

一个DHCP的服务流程需要两个组件DHCP Client 和DHCP Server,而DHCP IPAM扮演的角色就是DHCP Client,DHCP Client运作的模式

1.发送DHCP 请求

2.等待DHCP 响应

3.设定IP到目标网络介质上

4.定期Renew

DHCP模式下有两种运行的形式,一种是CNI模式(提供函数接口),一种是启动一个不停运行的daemon模式(使用rpc提供接口)。

daemon 模式的功用很简单,接受所有来自 CNI 模式的请求,然后切换到目标的 namespace 里面去根据目标的网络介质发送一个 DHCP 请求封包,所以运行 DHCP IPAM 之前,要先在系统上跑一个 daemon,然后会通过 unix socket 的方式等待 DHCP IPAM CNI 发送命令过来,该命令需要包含 目标的namespace和目标的网卡名称。

执行流程图

  1. 首先当 DHCP CNI被调用后,会先通过 unix socket 的方式通知 daemon
  2. daemon 接着到该 ns 之中,确认这个ns存在就发送对应的DHCP 請求
  3. magic 的意思代表沒有限定数据包要怎么处理,总之 DHCP 封包要有办法出去
  4. 最后外面的(甚至同一台机器)上面的 DHCP Server 可以看到 Request 并且回复Reply
  5. 最后当DHCP Daemon 发送 DHCP 请求的那个 thread 接收到 DHCP 回复后,就会给目标网卡设置 IP 地址。

Static模式

static IPAM 是一个非常简单的 IPAM 插件,可以将 IPv4 和 IPv6 地址静态分配给容器。 这将有助于调试目的以及在不同 vlan/vxlan 中为容器分配相同 IP 地址的情况。

需要手动设置

  1. IP 地址,包含了 ipv4/ipv6
  2. Route 路由表
  3. DNS 设置

Host-Local模式

大部分CNI 会使用这个IPAM去处理IP分配的问题

1.config格式

{
"ipam": {
         "type": "host-local",
         "ranges": [
                           [
                            {
                              "subnet": "10.10.0.0/16",
                              "rangeStart": "10.10.1.20",
                              "rangeEnd": "10.10.3.50",
                               "gateway": "10.10.0.254"
                            },
                         {
                           "subnet": "172.16.5.0/24"
                         }
                      ]
                    ]
            }
}

返回的ip格式

"cniVersion": "0.2.0",
"ip4": {
            "ip": "10.10.1.20/16",
             "gateway": "10.10.0.254"
},
"dns": {}
}

2.IP分配原理

host-local IPAM 插件从一组地址范围中分配 IP 地址。 它将状态本地存储在主机文件系统上,从而确保单个主机上 IP 地址的唯一性。 分配器可以分配多个范围,并支持多个(不相交的)子网集。 分配策略在每个范围集中进行round-robin

3.状态存储路径

默认路径 /var/lib/cni/networks/

$ sudo find /var/lib/cni/networks/ -type f
/var/lib/cni/networks/last_reserved_ip.0
/var/lib/cni/networks/10.10.1.20
/var/lib/cni/networks/10.10.1.22
/var/lib/cni/networks/10.10.1.21

$ sudo find /var/lib/cni/networks/ -type f | xargs -I % sh -c 'echo -n "%: ->"; cat %; echo "";'
/var/lib/cni/networks/last_reserved_ip.0: ->10.10.1.22
/var/lib/cni/networks/10.10.1.20: ->ns1
/var/lib/cni/networks/10.10.1.22: ->ns1
/var/lib/cni/networks/10.10.1.21: ->ns1
每个被用过的 IP 都会产生一个以该 IP 为名的文件,该文件中的內容非常简单,就是使用的 container ID(ns1),last_reserved_ip 的文件,该文件用来记住每个 range 目前分配的最后一个 IP 是哪个

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K8s bridge、ip分配原理 的相关文章

  • stlink制作安排

    安排 xff1a 教大家如何刷固件 xff0c 同时再测试一遍硬件 已完成 小蓝板硬件上的注意事项 xff08 d 43 上拉 boot 64 128k flash xff09 已完成 我做这个stlink的完整的过程 xff0c 包括踩的
  • 为什么说神经网络是黑箱子模型,我刚刚有了新的感悟。

    为什么说神经网络是黑箱子模型 xff0c 我刚刚有了新的感悟 深度神经网络是自动提取特征 xff0c 不同于以往的人工提取特征 人工提取特征他是知道为什么提取这个特征的 xff0c 而神经网络 xff0c 则是通过训练去尽可能贴近训练集 x
  • 个人总结一下batch和epoch

    首先得说梯度下降算法 https blog csdn net lhhopencv article details 78912256 那也就可以理解了为什么说梯度下降的几种方式的根本区别就在于上面公式中的batch不同 当batch size
  • 关键在于理解

    关键在于理解 xff0c 你懂了还是没懂你自己心里清楚 xff0c 用什么方式让自己弄懂 xff0c 都是可以的 看书啊 xff0c 看视频啊 xff0c 网上搜文章啊 xff0c 请教人啊 你懂没懂 xff0c 掌握没掌握 xff0c 心
  • 关于购买ipad

    首先ipad和ipad pro有哪些产品要搞清楚 首先2017年之前的不考虑了 2017年的有ipad2017 9 7寸 xff0c 这个不支持笔写 xff09 ipad pro 10 5 ipad pro 12 9 第二代 xff09 2
  • 个人目前理解机器学习和深度学习的区别在于特征是否自动提取

    首先我是看到SIGAI给的机器学习算法地图里没有无监督学习里面没有自动编码器 xff0c 而这个在他们的深度学习的课表目录里面 xff0c MNIST手写识别也是在他们的深度学习课程里面 xff0c CNN RNN都是深度学习课程里面的 x
  • 论文阅读笔记2——Evading Defenses to Transferable Adversarial Examples by Translation-Invariant Attacks

    论文标题 xff1a Evading Defenses to Transferable Adversarial Examples by Translation Invariant Attacks 论文链接 xff1a https arxiv
  • visual lisp dcl对话框开发 --控件右对齐

    演示按钮右对齐 alignment lsp span class token punctuation span by 鸟哥 qq1833183060 span class token punctuation span 功能 xff1a 演示
  • visual lisp/autolisp dcl对话框开发 --显示文本

    演示如何在对话框中显示文本 text lsp span class token punctuation span by 鸟哥 qq1833183060 span class token punctuation span 功能 xff1a 演
  • visual lisp/autolisp dcl对话框开发 --列表框(list_box)

    本文演示dcl list box控件 效果图 xff1a listbox lsp span class token punctuation span by 鸟哥 qq1833183060 span class token punctuati
  • 使用Docker安装ROS2 (ros-humble) 并开启对Wayland的支持

    前言 ROS Robot Operating System 是主流的机器人开发框架之一 截止目前 xff08 2020 10 xff09 xff0c 已经推出了ros humble版本 xff0c ROS2相比ROS1有很大的不同 xff0
  • linux下添加永久路由

    在linux下永久保存路由表的写法 一 SuSe Linux 在 etc sysconfig network routes里添加 etc sysconfig network routes格式如下 xff1a Destination Dumm
  • MySQL远程访问及访问速度慢等问题解决

    1 访问速度慢 现象 访问数据库速度慢 xff0c 完成一次连接或数据访问需要将近5s左右 原因 每次访问数据库 xff0c mysql就会试图去解析来访问的机器的domain name xff0c 如果这时解析不料 xff0c 等一段时间
  • JVM实战1-JVM虚拟机内存区域划分

    1 程序计数器 PC寄存器 当前线程所执行的字节码的行号指示器 在虚拟机的概念模型里 xff0c 字节码解析器工作就是通过这个计数器的值来选取下一条要执行的字节码指令 xff0c 分支 xff0c 循环 xff0c 跳转 xff0c 异常处
  • 2014,我还是一名菜鸟

    正如题目所提到 xff0c 菜鸟 什么是菜鸟呢 xff0c 不够成熟 xff0c 不够厉害 xff0c 对所从事和正在进行的工作不入流 反应痴呆 生疏 对于作为一名刚刚升大二的计算机专业的学生的我来说 xff0c 就是菜鸟 我所在的地方 x
  • Linux下so文件的生成和使用

    环境 xff1a Vmware Workstation xff1b CentOS 6 4 x86 64 说明 xff1a 1 源文件中不能有main函数 xff1b 写so文件的时候使用C语言写 xff0c 不要用C 43 43 2 在使用
  • 2014嗖的一声就过去了

    项目结束 xff0c 在CSDN一通乱逛看大牛所写文章 xff0c 正待如饥似渴 xff0c 突然瞄到右边栏有 我的2014 醒目字样 xff0c 以为是哪位大牛总结自己的2014 xff0c 没曾想到是CSDN发出的活动 xff0c 看到
  • IOS缓存基本知识和清除缓存的方法

    第一 NSURLRequest的缓存设置 id initWithURL NSURL URL cachePolicy NSURLRequestCachePolicy cachePolicy timeoutInterval NSTimeInte
  • CentOS7,玩转samba服务,基于身份验证的共享

    以前我们在Windows上共享文件的话 xff0c 只需右击要共享的文件夹然后选择共享相关的选项设置即可 然而如何实现Windows和Linux的文件共享呢 xff1f 这就涉及到了samba服务了 xff0c 这个软件配置起来也不难 xf
  • 清除浏览器的缓存,使js,css等修改后的内容生效

    方法1 ctrl 43 F5 方法2 在页面文件中添加如下代码 xff0c 禁用缓存 span class token tag span class token tag span class token punctuation lt spa

随机推荐