1. CNI为Containerd容器添加网络能力
1.1 什么是CNI
CNI (Container Network Interface)也是CNCF旗下的一个项目。CNI包含一些用于配置linux容器网络接口的规范、库,以及一些支持插件。CNI只关心容器创建时的网络分配,以及当容器被删除时已经分配网络资源的释放。 CNI作为容器网络的标准,使得各个容器管理平台可以通过相同的接口调用各种各样的网络插件来为容器配置网络。Kubernetes就内置了CNI并通过CNI配置网络。
1.CNI规范
当前CNI规范的版本是0.4.0,规范的地址是https://github.com/containernetworking/cni/blob/spec-v0.4.0/SPEC.md。
CNI规范主要是为Linux容器提出了一个通用的基于插件的网络解决方案,这个解决方案被称作CNI即容器网络接口。
在CNI规范中对container
容器和network
网络的定义如下:
container
容器: 可以认为是linux newtwork namespace的同义词,一个network namespace具体对应什么,与具体的容器运行时有关 network
网络: 是指可以唯一寻址且可互相通信的实体。这些实体可以是一个单独容器(如上定义),一台机器,或者其他的网络设备(如一台路由器)。容器container可以加入一个或多个网络network,也可以从一个或多个network中移除。
1.2 部署CNI插件
高版本之后,可以自带cni插件
https://github.com/containernetworking/plugins/releases
https://github.com/containernetworking/plugins/releases
bash
[root@kubeadm-master01 bin]# tree -L 1
.
├── bandwidth
├── bridge
├── calico
├── calico-ipam
├── dhcp
├── dummy
├── firewall
├── flannel
├── host-device
├── host-local
├── ipvlan
├── loopback
├── macvlan
├── portmap
├── ptp
├── sbr
├── static
├── tuning
├── vlan
└── vrf
[root@kubeadm-master01 bin]# tree -L 1
.
├── bandwidth
├── bridge
├── calico
├── calico-ipam
├── dhcp
├── dummy
├── firewall
├── flannel
├── host-device
├── host-local
├── ipvlan
├── loopback
├── macvlan
├── portmap
├── ptp
├── sbr
├── static
├── tuning
├── vlan
└── vrf
从功能上看可以分为三类:
- 主插件: 用于创建网络设备
- bridge: 创建一个网桥设备,并添加宿主机和容器到该网桥
- ipvlan: 为容器添加ipvlan网络接口
- loopback: 设置lo网络接口的状态为up
- macvlan: 创建一个新的MAC地址,并将所有流量转发到容器
- ptp: 创建Veth对
- vlan: 分配一个vlan设备
- host-device: 将已存在的设备移入容器内
- IPAM插件: 用于IP地址的分配
- dhcp: 在宿主机上运行dhcp守护程序,代表容器发出dhcp请求
- host-local: 维护一个分配ip的本地数据库
- static: 为容器分配一个静态IPv4/IPv6地址,主要用于调试
- Meta插件: 其他插件,非单独使用插件
- flannel: flannel网络方案的CNI插件,根据flannel的配置文件创建网络接口
- tuning: 调整现有网络接口的sysctl参数
- portmap: 一个基于iptables的portmapping插件。将端口从主机的地址空间映射到容器
- bandwidth: 允许使用TBF进行限流的插件
- sbr: 一个为网络接口配置基于源路由的插件
- firewall: 过iptables给容器网络的进出流量进行一系列限制的插件
参考:
1.3 CNI网络配置
1.重要字段
cni json配置文件中的一些重要字段:
cniVersion
(string): 描述cni配置遵循的cni规范版本(版本号为语义化版本,如0.4.0)name
(string): 表示network name,在主机(或其他管理域)上的所有容器中应该是唯一的type
(string): 表示cni插件的可执行文件名args
(dictionary, optional): 由容器运行时提供的可选参数。例如,可以通过将标签添加到args下的标签字段,将标签字典传递给CNI插件ipMasq
(boolean, optional): 如果插件支持此字段,将为这个网络上的主机设置一个ip伪装(ip masquerade)。如果主机将充当分配给容器的子网的网管,那么这个配置字段是必须的- ipam(boolean, optional): 包含具体IPAM(IP地址管理)值的键值对
type
(string) 表示ipam插件的可执行文件名,如dhscp
,host-local
,static
- dns(dictionary, optional): 包含具体DNS配置的键值对
nameservers
(list of strings, optional): 一个对配置网络可见的按优先级顺序排列的dns服务器列表,列表中的每个值是一个IPV4或IPV6的字符串domain
(string, optional): 用于短主机名查找的本地域名search
(list of strings, optional): 用于短主机名查找的优先级排序搜索域列表,被大多数解析器(resolver)在解析时优先于domain
options
(list of strings, optional): 一组可以传递给解析器(resolver)的选项值
参考:
2. 网络
nerdctl 所使用的网络及模式和 docker 完全一致
1.1 查看网络
bash
[root@kube-master-01 init_pack]# nerdctl network ls
NETWORK ID NAME FILE
containerd-net /etc/cni/net.d/10-containerd-net.conflist
17f29b073143 bridge /etc/cni/net.d/nerdctl-bridge.conflist
host
none
[root@kube-master-01 init_pack]# nerdctl network ls
NETWORK ID NAME FILE
containerd-net /etc/cni/net.d/10-containerd-net.conflist
17f29b073143 bridge /etc/cni/net.d/nerdctl-bridge.conflist
host
none
2.2 创建网桥
bash
nerdctl network create -d bridge --subnet 10.244.0.0/16 mynet
nerdctl network create -d bridge --subnet 10.244.0.0/16 mynet