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分配方案参数
- type: 指定使用哪种ip分配方案,这里是host-local
- subnet: 分配的子网范围
- rangeStart:开始的地址
- rangeEnd:结束的地址
- gateway: 容器内部网络的网关
- 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" }
]
}
}
- 环境变量:
环境变量包括:- CNI_ARGS:含有POD的NAMESPACE(K8S_POD_NAMESPACE),POD名字(K8S_POD_NAME),POD的infra容器ID(K8S_POD_INFRA_CONTAINER_ID)等信息
- CNI_COMMAND:包含接口调用的方法,比如ADD/DEL/CHECK/VERSION等
- CNI_IFNAME:包含网络接口名称
- CNI_NETNS:包含隔离空间路径
- CNI_CONTAINERID: 容器ID
- 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