kubernetes容器网络接口(CNI) midonet网络插件的设计与实现

2023-05-16

相关原理概述

先来讲讲什么是CNI?

CNI(容器网络接口)是一种操作容器网络规范,包含方法规范,参数规范等。
CNI只关心容器的网络连接,在容器创建时分配网络资源,并在删除容器时删除分配的资源。因为这个焦点,CNI有广泛的支持,规格易于实现。CNI接口只需要实现两个方法,一个创建容器时调用,一个删除容器时调用。

image

Kubernetes如何支持和运行遵循CNI规范的插件

kubernetes首先以插件的形式完成(pod)容器的网络资源设置。内置的插件包括:cni,kubenet,hostport等。这里简单说说kubenet。这是一个简单的网络插件,每台机器上创建一个br0网桥,根据PodCIDR为每个pod设置ip连接到br0网桥上。次方式可结合一些网络路由工具完成一个小规模的集群网络pod互联。我们主要讲CNI插件。kubernetes以cni插件来支持cni规范,调用其他厂商和个人开发的遵循cni规范的各种网络插件,例如Calico,Flannel等。k8s默认情况下cni模式不支持端口映射等。k8s将容器网络设置none,完全交给插件去管理容器网络资源。
image

上文多次提到的网络资源是什么?

容器网络资源包括:虚拟网卡,IP地址,DNS,网络路由等等。容器使用独立的网络命名空间,可以具有自己的网络资源信息。这些信息数据由不同的CNI插件根据不同的SDN网络的实现给容器配置。

MidoNet SDN网络

MidoNet是由日本的SDN公司Midkura研发的一款网络虚拟化软件,其基于底层物理设施来实现网络虚拟化,具有分布式、分散、多层次的特点,主要作为OpenStack中的默认网络组件,可以让虚拟网络解决方案,特别是专为网络基础设施设计的方案,为云平台如OpenStack服务,并且将其网络存贮栈虚拟化。MidoNet为每个租户分配一个逻辑router,租户与租户之间是相互隔离的,租户内部之间是能够相互通讯的,Midonet支持L2交换、L3路由、L4负载均衡

有状态和无状态NAT,逻辑和分布式防火墙,BGP与ECMP支持。其架构主要包含以下组件:

Midolman(Midonet Agent):Midonet

Agent安装在各个计算节点,负责建立网络流量控制和提供分布式Midonet网络服务,路由,NAT等他把相关的虚拟网络信息存放到NSDB。

Network State

Database(NSDB):存储网络配置和状态,网络拓扑,路由,Midonet不集中处理网络功能,由Midonet Agent处理,Midonet Agent会跟NSDBs做实时同步当有变化时候会及时同步并且更新NSDB
MidoNet支持大规模SDN集群,其架构理论上支持上万节点。我们可以使用MidoNet完成k8s集群内租户内Pod网络互联。

MidoNet多租户下网络结构模型

SDN(软件定义网络),Midonet软件定义你所熟知的网络组件。以下简单介绍几个核心的软件定义概念:
* Router(路由器)
一个租户对应一个Router,连接到同一个Router的Bridge网络互通。Midonet会创建一个PrivierRouter,所有租户Router连接到PrivierRouter与外网互通。等价于一个路由器内网互通,连接上级路由器接入公网。
* Bridge(网桥)
一个租户下可以有多个Bridge,每个Bridge使用不同的网段。例如一个Bridge网段为192.168.0.0/24,最多可以有253个虚拟设备连接到本Bridge。
* Port(设备通信端口)
Router与Router之间,Router与Bridge之间的通信接口。
* Route(路由)
路由规则,给Router定义流量包转发端口的规则。
* Rule(过滤规则)
定义包过滤条件。类似于iptables。

image

基于MidoNet的kubernetes CNI插件实现

Midonet数据交换工作在三层,但是其本身不提供IP地址管理(IPAM),因此基于Midonet的cni插件需要完成以下工作:IPAM,租户Router、Bridge创建,容器网卡创建,以及所有端到端连接和路由过滤规则创建。

IPAM

需要完成两个层面的IP管理,Router级别的地址管理,每一个Router具有一个IP地址,且全局唯一不冲突。每一个Bridge具有一个唯一网段,连接的虚拟网卡具有全局唯一IP 。
IPAM有很多实现方式,CNI插件是无状态应用,或许你需要一个守护进程来完成IPAM工作。基于简化架构的思路,我们使用ETCD来存储IP数据,直接由插件来操作ETCD。完成IP的使用和释放。

租户网络初始化

当新租户第一次创建容器时进行租户虚拟设备的初始化创建,上文我们已经介绍了一个租户需要创建的虚拟设备有哪些,这里我讲讲细节。
Midonet提供了Rest-API来操作虚拟设备。这里注意,根据使用的不同版本的Midonet使用不同版本的API。
https://github.com/barnettZQG/golang-midonetclient
封装了golang版的Midonet api操作方法,支持1.*和5.*API版本。
创建步骤如下:
1. 创建租户,调用Keystone API。
2. 创建Router,并包含创建进出Chain。
3. 创建PrivierRouter Port并赋IP,创建Router Port并赋IP。创建PortLink连接两个Port。
4. 为前面创建的Chain创建对应的路由规则
5. 为前面创建的Port创建包过滤规则
6. 创建一个默认的Bridge。并创建Port连上Router。
7. 存储以上创建的相关数据进ETCD.

容器网卡创建和网络绑定

Virtual Ethernet Pair

简称veth pair,是一个成对的端口,所有从这对端口一 端进入的数据包都将从另一端出来,反之也是一样.其两端可存在于不同的网络空间(Network Namespace)。容器创建成功后具有一个网络空间,k8s此时调用CNI插件ADD方法进行网络设置。插件首先创建一对Veth pair。将其一端置于宿主机网络空间,调用Midonet 绑定API将其与Bridge一个Port绑定。另一端在容器内并赋予IP地址,根据当前使用的Bridge网段。
与Docker0网卡部分原理一致。

设置容器内路由规则

将默认路由设置到上文创建的网卡上。例如上文创建的网卡命名为eth0。

设置DNS

根据需要设置一些DNS信息。

怎么实现操作?

1.使用shell命令。

ip link *
ip netns *
ip address *
ip route *

以上命令详细使用方法网上很多了,这里不再描述。

  1. golang netlink library

https://github.com/vishvananda/netlink
定义了关于网卡相关与linux内核通信的用户空间的相关接口。

CNI插件实现的注意事项

  1. CNI插件的添加和删除操作应该具有幂等性,即同样的参数传入不管调用多少次都应该有相同的效果。
  2. CNI插件应该支持并发性,主要是租户相关组件的创建和IP地址分配的强一致性。
  3. CNI插件有一定的规范,请参考:https://github.com/containernetworking/cni

好雨云Midonet cni插件开源

好雨云开源基于ETCD版的的midonet cni插件具有上文提到的所有功能和特性。
github:https://github.com/goodrain/midonet-cni

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

kubernetes容器网络接口(CNI) midonet网络插件的设计与实现 的相关文章

  • ubuntu16.04下,ROS+PX4+QGC安装

    ubuntu16 04下 xff0c ROS 43 PX4 43 QGC安装 ROS安装 xff1a 第一步 xff1a ROS安装前准备工作 1 在Ubuntu系统上 xff0c 确认git已经安装 span class token fu
  • TokenEndpoint : Handling Null Pointer Exception

    springboot oauth2 0生成token时报错 详细的日志没有打印出来 需要手动配置log 64 Override public void configure AuthorizationServerEndpointsConfig
  • linux(ubuntu)无法连接网络

    提示 xff1a 版本 xff1a ubuntu16 0 4 问题 xff1a 开机没有网络 xff0c 无法连接网络 xff0c 尝试了很多方法最终才可以 首先查看ifconfig 查看网卡信息 ifconfig 查看ip ip a 查看
  • 八皇后问题

    问题描述 在国际象棋中 xff0c 有一个非常强势的棋子 皇后 xff0c 他的走法可以在网上参考一下 xff0c 概括来说就是可以沿着行 列 与对角线平行的线走 而在计算机中有一个关于他的经典问题 xff0c 8皇后 xff0c 就是在8
  • ubuntu18.04.3如何在终端下切换到指定文件夹或根目录

    看到很多的新手 xff0c 不知道如何在终端切换到根目录的 xff0c 或者是指定的目录的 xff0c 下面介绍一下切换的方法 1 先按键盘 ctrl 43 alt 43 t 弹出终端 xff0c 那么你会看到终端上的提示当前目录为 这个就
  • MySql简单查询——单表查询

    一 DDL xff08 Data Definition Language xff09 xff1a 数据定义语言 xff0c 用来定义数据库对象 xff1a 库 表 列等 xff1b 相关字段 xff1a create drop alter
  • linux下可视化git工具git-cola安装与使用(HTTP方式)

    一 git cola为何物 很多小伙伴 xff0c 特别喜欢使用TortoiseGit xff0c 该软件是做什么的 xff0c 就不用多说吧 奈何 xff0c TortoiseGit只有windows版 xff0c 这让在linux上开发
  • 解决ubuntu下应用程序菜单不在程序的左上角

    测试版本 xff1a ubuntu16 04 问题 xff1a 应用程序菜单不在程序的左上角 xff0c 默认放在了桌面顶部的菜单栏上 如下 xff1a 解决办法 xff1a System Settings gt Appearance gt
  • linux下可视化git工具git-cola安装与使用(SSH方式)

    一 git cola为何物 很多小伙伴 xff0c 特别喜欢使用TortoiseGit xff0c 该软件是做什么的 xff0c 就不用多说吧 奈何 xff0c TortoiseGit只有windows版 xff0c 这让在linux上开发
  • CAS实现SSO单点登录原理

    yale cas可以百度一下 xff0c 这是学习cas后的一点总结 xff0c 以备日后使用 xff01 安全性 xff1a 用户只须在cas录入用户名和密码 xff0c 之后通过ticket绑定用户 xff0c 在cas客户端与cas校
  • 五种知网文献免费下载方式

    1 idata中国知网 网址 xff1a idata中国知网 进入系统 xff0c 注册账号 xff0c 登录即可 每天五篇额度 xff0c 基本够用 xff0c 可注册多个账号使用 2 上海研发公共服务平台 网址 xff1a 上海研发公共
  • 【FreeRTOS】二值信号量实现线程的同步

    FreeRTOS 二值信号量实现线程的同步 测试环境如下 stm32L431RCT6 MDK keil5 stm32cube 43 FreeRTOS 一 添加多个任务 1 引脚配置 LED使用的引脚PA8和PB2设置成output 将按键引
  • 暗影精灵2pro安装win10+ubuntu16.10双系统

    暗影精灵2pro预装win10家庭版 xff0c 默认启动win10系统 xff0c 且无法引导其他系统 xff0c 今天我们来解决这个问题 先进入到win10的磁盘管理器服务 xff0c 为ubuntu单独分配磁盘空间 xff0c 让wi
  • 第二十三讲.从HadoopURL中读取数据

    视频 xff1a 美妙人生 Hadoop课程系列之HDFS 手把手教你精通HDFS 美妙人生 Hadoop课程系列之HDFS 手把手教你精通HDFS 视频笔记 从hadoop URL读取数据 static URL setURLStreamH
  • winform窗体

    一 winform介绍 WinForm xff0c 是 Net开发平台中对Windows Form的一种称谓 WinForm是窗体应用程序 xff0c 由若干个窗体应用组成 xff0c 基于C S架构 二 winform的使用 xff08
  • 赋予人工智能记忆的人,带你梳理深度学习核心算法

    新智元翻译 1 来源 xff1a Idsia 作者 xff1a J rgen Schmidhuber 翻译 xff1a 张巨岩 作者介绍 xff1a J rgen Schmidhuber 被称为是赋予人工智能记忆的人 xff0c 递归神经网
  • C++实现贪吃蛇游戏

    注意 xff1a 本代码是在VC 43 43 6 0环境下编译的 xff0c 在其他环境如codeblocks下运行可能会产生意想不到的问题 xff0c 请尽量使用VC xff01 最近由于小编闲着慌 xff0c 捣鼓了一个贪吃蛇游戏 xf
  • Win10正式版19044.2132(KB5020435)来啦!(附完整更新日志)

    微软发布了Win10正式版KB5020435 xff08 操作系统内部版本 19042 2132 19043 2132 和 19044 2132 xff09 xff0c 此次更新主要解决了某些类型的安全套接字层 xff08 SSL xff0
  • SOUI总结之皮肤说明

    皮肤说明 说明 框架自带的皮肤都是 skin sys XXXX开始 xff0c 自带的皮肤存放位置trunk soui sys resource theme sys res xff0c 图片和名称映射关系可以打开trunk soui sys
  • C++中逗号运算符

    今天测试代码的时候 xff0c 遇到一行代码出现了疑问 xff0c 原因是出现了自减运算符和逗号运算符 xff0c 这就涉及到一个顺序的问题 xff0c 于是写了一个C 43 43 小程序 xff0c 验证了一下这个想法 include u

随机推荐

  • PsExec的问题及其解决办法

    C gt PsExec exe 192 168 1 142 cmd PsExec v1 98 Execute processes remotely Copyright C 2001 2010 Mark Russinovich Sysinte
  • ubuntu 18.04安装protobuf

    今天需要安装protobuf 在网上搜了一篇教程 xff0c 但是篇幅太长 xff0c 于是对其进行简化一下 原文 1 96 96 96 git clone https github com protocolbuffers protobuf
  • 读取配置文件的程序

    时常会遇到需要从配置文件中读取一些信息 xff0c 这里就提供一个例子 xff0c 方便日后使用 xff1a span class token comment ini h span span class token macro proper
  • 命令行读取参数

    有时需要从命令读取一些输入 xff0c 这里找到一个方法 xff0c 怎么实现的没有仔细研究 xff0c 但是可用 cmdline h span class token comment Copyright c 2009 Hideyuki T
  • 如何在一个shell脚本中开启多个应用程序?

    之前在csdn上搜索 xff0c 提示用gnome terminal指令 xff0c 但是发现怎么都不好使 于是找到一种解决方案 span class token comment bin bash span span class token
  • 使用openCV播放视频 在视频中加入滑动条

    include 34 opencv2 highgui highgui hpp 34 include 34 opencv2 imgproc imgproc hpp 34 include lt iostream gt include lt fs
  • Linux下vscode无法查看定义?

    今天要用到vscode查到c 43 43 程序 但是发现vscode无法查看程序的定义 于是找了一下解决方法 vscode无法转到定义可能是因为没有安装插件 由于我需要使用C 43 43 所以我这里安装的是C 43 43 插件 第一步 第二
  • 冒泡排序的实现(基于顺序表)

    对于冒泡排序的含义以及图示表示 这里就不再赘述 这篇博客已经说的很明白了 添加链接描述 于是就用代码实现了一下基于顺序表的冒泡排序 因为一直看的时大话数据结构这本书 于是把上面介绍的三种实现方法都在代码中实现一下 具体实现与书中有一些出入
  • ambiguating new declaration of 问题的解决

    今天在运行代码的时候 一直在报这样的错误 ambiguating new declaration of int NewPartition seqlist int int 查看了许久 原来是头文件中的声明类型与函数实现的声明类型不一致造成的
  • opencv中的MatConstIterator,NAryMatIterator迭代器的使用

    第一个迭代器 MatConstIterator迭代器 使用迭代器计算一个三通道三维数组中 34 最长元素 34 这个代码实现过程中 照着书中的代码抄下来一直报错 后来在查阅代码的时候 发现了问题所在 具体已经在代码中标明了 include
  • 用python实现查询天气的功能

    附上代码 import urllib request import gzip import json print 39 天气查询 39 def get weather data city name 61 input 39 请输入要查询的城市
  • 1.Docker 安装

    安装 wget 命令 yum install wget 安装docker wget q O https get docker com sh O 下载并以指定的文件名保存 以 39 39 作为file参数 xff0c 那么数据将会被打印到标准
  • linux下sudo apt-get update 报Err http://security.ubuntu.com precise-security InRelease 等

    今天在进行linux更新的时候一直报错 尝试了很多办法都不行 于是找到一个方法 切实可行 以根用户运行 cd var lib apt lists rm rm var cache apt archives lock rm var lib dp
  • HTTP Authentication之Basic认证、Digest认证

    本文为博主原创 xff0c 未经许可严禁转载 本文链接 xff1a https blog csdn net zyooooxie article details 109691608 前面说到 Fiddler 的QuickExec Filter
  • Qt学习笔记(5) — Qt 类库【C++】

    目录 一 Qt核心特点1 元对象系统2 信号与槽的关联方式 二 Qt全局定义 xff08 常用头文件 xff09 1 lt QtGlobal gt 头文件1 xff09 数据类型定义2 xff09 函数3 xff09 宏定义 三 容器类1
  • 【C++】STL学习小总结

    经过自学以及查找资料汇总的一些记录 STL概述 长久以来 xff0c 软件界一直希望建立一种可重复利用的东西 xff0c 以及一种得以制造出 可重复运用的东西 的方法 xff0c 从函数 functions xff0c 类别 classes
  • ssh连接云服务器失败,能ping通但是连接不上

    环境 xff1a 腾讯云服务器 远程工具 xff1a xshell 7 问题描述 使用xshell远程工具时 xff0c 输入云服务器地址 xff0c 输入用户名密码之后显示 Connection established To escape
  • cheom 修改文件权限

    Chmod命令主要用于修改 设置文件权限 chmod 修改文件权限主要有两种方式 xff1a 字母法与数字法 1 字母法 xff1a chmod u g o a 43 61 r w x 文件名 以上是chmod的用法 xff0c 每个括号是
  • 通俗易懂的布谷鸟算法与莱维飞行,(附求解函数最小值matlab源码)

    1 从布谷鸟的育雏到布谷鸟算法2 布谷鸟算法3 萊维飞行与公式 1 的深层含义4 附 xff1a CS算法求解函数最小值代码5 源码下载6 参考文献 1 从布谷鸟的育雏到布谷鸟算法 布谷鸟不会做窝 xff0c 也不会育雏 xff0c 在春末
  • kubernetes容器网络接口(CNI) midonet网络插件的设计与实现

    相关原理概述 先来讲讲什么是CNI CNI xff08 容器网络接口 xff09 是一种操作容器网络规范 xff0c 包含方法规范 xff0c 参数规范等 CNI只关心容器的网络连接 xff0c 在容器创建时分配网络资源 xff0c 并在删