CNI插件之CNI插件最简实现之macvlan plugin

本文详细介绍了CNI插件中的macvlan,包括其概念、简单实验配置、接口方法、源码编译、工作原理和实验示例。通过macvlan插件,读者可以深入理解Kubernetes中CNI的工作方式,以及如何解决容器间的连通性问题。此外,文章还提供了CNI插件的调试方法和macvlan的总结与讨论。
摘要由CSDN通过智能技术生成

CNI插件之CNI插件最简实现之macvlan plugin

Kubernetes的CNI插件非常智能,通过几个yaml文件就可以完成整套安装。这是kubernet的优势,但是对于想要了解原理的同学,太智能了,反而感觉无从下手。

当我开始学习CNI插件的时候也有这般感受。当时我的第一个想法是找一个最最最简单的CNI插件,快速的了解CNI的原理。后来反复对比,选择了macvlan。一是macvlan plugin由containernetworking官方 提供,较可靠;二是macvlan使用了最简单的命令操作,这些命令我都比较熟悉;选择macvlan之后,也还是遇到了小插曲,可能是由于macvlan太简单,反而网上并没有了整理完整的安装步骤。好吧,那一切只能靠自己拼凑。等macvlan顺利运行起来后,感觉此刻对kubernet cni插件的原理立刻就打通了。写这篇博客,把我的实验过程整理出来。如果你也习惯通过一个简单的例子,解开复杂的流程,那么以下内容会非常适合你。

接下来本文将介绍:

  • 什么是CNI插件
  • macvlan插件简单实验配置示例
  • CNI插件接口方法
  • macvlan插件源码下载与编译方法
  • macvlan原理及macvlan实验示例
  • macvlan插件代码实现
  • 编写一个简单插件实验
  • CNI插件调试方法
  • macvlan总结与讨论

本文假定用户已经安装Kubernetes环境。

什么是CNI插件

CNI(container network interface),是一个接口规范,这个规范定义了输入、输出的标准和调用的接口,只要调用CNI插件的实体遵守这个规范,就能从CNI拿到满足网络互通条件的网络参数(如IP地址、网关、路由、DNS等),这些网络参数可以配置container实例。

macvlan插件简单实验配置示例

macvlan 插件正确运行需要两个前提:

  • 插件二进制正确安装
  • 提供正确的配置文件

我这边环境kubernetes版本是1.14.3,已正确安装kubernetes-cni-0.7.5-0.x86_64内部含有macvlan插件。

配置

配置文件路径:/etc/cni/net.d/10-maclannet.conf
内容如下:

{
	"cniVersion":"0.3.1",
	"name": "macvlannet",
	"type": "macvlan",
	"master": "ens3",
	"mode": "bridge",
	"isGateway": true,
	"ipMasq": false,
	"ipam": {
		"type": "host-local",
		"subnet": "192.168.1.0/24",
		"rangeStart": "192.168.1.100",
		"rangeEnd": "192.168.1.200",
		"gateway": "192.168.1.1",
		"routes": [
			{ "dst": "0.0.0.0/0" }
			]
	}
}

配置文件路径:/etc/cni/net.d/99-loopback.conf
内容如下:

{
	"cniVersion": "0.3.1",
	"name": "lo",
	"type": "loopback"
}

字段说明:

  • cniVersion:版本
  • name: 网络方案名称
  • type: 这里指定用macvlan网络方案
  • master: 指定要在哪个网口上通过macvlan虚拟出不同mac/ip的网络接口
  • mode: 桥接方式
  • ipam: ip分配方案参数
    1. type: 指定使用哪种ip分配方案,这里是host-local
    2. subnet: 分配的子网范围
    3. rangeStart:开始的地址
    4. rangeEnd:结束的地址
    5. gateway: 容器内部网络的网关
    6. routes: 路由

这里仅仅展示Kubernetes集群master上的配置,其它node节点上的配置,可以从以下链接获取:集群macvlan配置文件

在刚安装完Kubernetes集群时,通过命令kubectl get nodes -A -o wide可以看到集群节点还是NotReady的状态。

在确认完macvlan二进制已经安装、内核支持macvlan虚拟化、配置正确的放在对应的位置后,通过上述同样的命令,我们可以看到集群节点已经变成Ready状态。

另外这里还需要特别注意,Kubernetes初始化的时候指定的pod-network-cidr需要包含这里的subnet子网

CNI插件接口方法

CNI插件的接口方法一般包括:

  • ADD
  • CHECK
  • DEL
  • VERSION

实际使用中,将一个容器添加进一个网络,调用的是ADD接口方法。将一个容器从网络中删除,则是调用DEL接口方法。

调用接口方法的参数又可以分成两类:输入参数,环境变量

我们这里罗列出常用的接口方法的输入参输,环境变量,输出参数,这些参数的获取方法详见:cni插件输入输出获取方法

  • 输入参数:
    这里的输入参数,实际上就是macvlan配置文件
{
	"cniVersion":"0.3.1",
	"name": "macvlannet",
	"type": "macvlan",
	"master": "ens3",
	"mode": "bridge",
	"ipam": {
		"type": "host-local",
		"subnet": "192.168.122.0/24",
		"rangeStart": "192.168.122.21",
		"rangeEnd": "192.168.122.99",
		"gateway": "192.168.122.14",
		"routes": [
			{ "dst": "0.0.0.0/0" }
		]
	}
}
  • 环境变量:
    环境变量包括:
    1. CNI_ARGS:含有POD的NAMESPACE(K8S_POD_NAMESPACE),POD名字(K8S_POD_NAME),POD的infra容器ID(K8S_POD_INFRA_CONTAINER_ID)等信息
    2. CNI_COMMAND:包含接口调用的方法,比如ADD/DEL/CHECK/VERSION等
    3. CNI_IFNAME:包含网络接口名称
    4. CNI_NETNS:包含隔离空间路径
    5. CNI_CONTAINERID: 容器ID
    6. CNI_PATH: CNI插件二进制所在目录
CNI_ARGS=IgnoreUnknown=1;K8S_POD_NAMESPACE=kube-system;K8S_POD_NAME=nginx-controller-dxxfg;K8S_POD_INFRA_CONTAINER_ID=b76473e8fe8dd4bba26b73fef7be002a59da050f0c96d55d293848b0f891e302
CNI_COMMAND=ADD
CNI_IFNAME=eth0
CNI_NETNS=/proc/19504/ns/net
CNI_CONTAINERID=b76473e8fe8dd4bba26b73fef7be002a59da050f0c96d55d293848b0f891e302
CNI_PATH=/opt/cni/bin
  • 输出参数:
    包括:网口名称,mac地址,隔离空间路径,ipv4版本,网口ip,默认网关等信息
{
    "cniVersion": "0.3.1",
    "interfaces": [
        {
            "name": "eth0",
            "mac": "5e:e0:14:f3:31:61",
            "sandbox": "/proc/19504/ns/net"
        }
    ],
    "ips": [
        {
            "version": "4",
            "interface": 0,
            "address": "192.168.122.117/24",
            "gateway": "192.168.122.14"
        }
    ],
    "routes": [
        {
            "dst": "0.0.0.0/0"
        }
    ],
    "dns": {}
}

macvlan插件源码下载与编译方法

  • 源码下载:
git clone https://github.com/containernetworking/plugins
  • 源码编译:
    源码编译有个前提,需要先安装go环境,可以网上查找安装方法。
./build_linux.sh

如果想增加sample的编译,则可以先执行

cp -rf plugins/sample plugins/main

编译结果:

[root@k8s-new-master ~]# ls xujx/cni/plugins/bin/
bandwidth  bridge  dhcp  firewall  flannel  host-device  host-local  ipvlan  loopback  macvlan  portmap  ptp  sbr  static  tuning  vlan

可以以上内容拷贝到Kubernetes对应路径:/opt/cni/bin/

macvlan原理及macvlan实验示例

macvlan 是在 HOST 网卡上创建多个子网卡,并分配独立的 IP 地址和 MAC 地址,把子网卡分配给容器实例来实现实例与物理网络的直通,并同时保持容器实例的隔离性。Host 收到数据包后,则根据不同的 MAC 地址把数据包从转发给不同的子接口,在外界来看就相当于多台主机。macvlan 要求物理网卡支持混杂 promisc 模式并且要求 kernel 为 v3.9-3.19 和 4.0+,因为是直接通过子接口转发数据包,所以可想而知,性能比 bridge 要高,不需要经过 NAT。

macvlan支持模式:

  • p
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
multus-cni 是一个 Kubernetes 的多网络 CNI 插件,它是 Kubernetes 上负责多网络管理的代表性插件之一。它允许 Kubernetes 集群中的每个 Pod 拥有多个网络接口,并能针对每个网络接口对应的网络策略和路由进行不同的配置。 multus-cni 的源码主要分为三部分:CNI 插件相关代码、配置文件相关代码和网络资源相关代码。CNI 插件相关代码包括主程序 main.go、CNI 配置解析器 conf.go、IPAM 相关代码和网络审计相关代码。配置文件相关代码包括 multus.conf 和各种 JSON/YAML 配置文件的解析器。网络资源相关代码主要负责通过 Kubernetes API 获取和管理 Pod、NetworkAttachmentDefinition 和 Service 等网络资源信息。 multus-cni 的核心是 CNI 插件相关代码中的 main.go,它主要负责 CNI 插件的初始化和执行。CNI 插件的执行流程大概可以总结为如下三步:首先,multus-cni 解析 CNI 配置文件并获取 Pod 相关的网络资源信息;接着,multus-cni 调用下层 CNI 插件(比如 flannel、calico、ovs 等)完成网络接口的创建和配置;最后,multus-cni 继续执行其他 CNI 插件(比如 ipvlanmacvlan、bridge 等)完成其他网络接口的创建和配置。 此外,multus-cni 通过 Kubernetes API 获取和管理 NetworkAttachmentDefinition 和 Service 等网络资源信息。在 Kubernetes 中,NetworkAttachmentDefinition 用于定义和配置网络接口,而 Service 用于定义和管理 Kubernetes 集群中的服务。multus-cni 通过获取、解析和应用这些网络资源信息,实现了多网络的管理和配置。 总的来说,multus-cni 是一个非常优秀的多网络 CNI 插件,它利用 Kubernetes API 实现了多网络的管理和配置,并同时支持插件化扩展。它的源码比较清晰,适合对 Kubernetes 网络原理比较熟悉的开发者学习和探究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codemillion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值