深入理解containerd/nerdctl中的CNI网络配置
前言
在现代容器化技术中,网络配置是一个至关重要的组成部分。containerd/nerdctl作为容器运行时工具,通过CNI(Container Network Interface)插件来实现容器网络功能。本文将全面解析nerdctl中CNI网络的使用方式,帮助开发者更好地理解和配置容器网络。
CNI基础概念
CNI(Container Network Interface)是一个云原生计算基金会(CNCF)项目,它定义了容器网络的标准接口和规范。nerdctl利用CNI插件为容器提供网络功能,主要包括:
- 容器网络接口的创建
- IP地址分配
- 网络策略实施
- 端口映射等
基本网络类型
nerdctl支持多种基本CNI插件类型,无需额外配置即可使用(前提是已安装相应CNI插件):
Linux系统支持
bridge
:默认网络类型,创建虚拟网桥portmap
:实现端口映射功能security
:提供网络安全功能tuning
:用于网络参数调优
Windows系统支持
nat
:Windows平台的默认网络类型
默认情况下,Linux系统使用bridge
网络,Windows系统使用nat
网络。
默认bridge网络配置详解
Linux系统的默认bridge网络配置如下:
{
"cniVersion": "1.0.0",
"name": "bridge",
"plugins": [
{
"type": "bridge",
"bridge": "nerdctl0",
"isGateway": true,
"ipMasq": true,
"hairpinMode": true,
"ipam": {
"type": "host-local",
"routes": [{ "dst": "0.0.0.0/0" }],
"ranges": [
[
{
"subnet": "10.4.0.0/24",
"gateway": "10.4.0.1"
}
]
]
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
},
{
"type": "security",
"ingressPolicy": "same-bridge"
},
{
"type": "tuning"
}
]
}
关键配置解析:
bridge
:指定网桥名称为nerdctl0isGateway
:设置为true表示创建网关ipMasq
:启用IP伪装,允许容器访问外部网络hairpinMode
:允许容器通过自己的外部IP访问自己ipam
:IP地址管理配置,使用host-local插件subnet
:定义子网范围为10.4.0.0/24gateway
:设置网关地址为10.4.0.1
网络隔离机制
从nerdctl 0.18版本开始,当安装的security
插件版本≥1.1.0时,会设置ingressPolicy
为same-bridge
。这一策略替代了nerdctl 0.17及更早版本中使用的CNI isolation
插件。
如果没有找到≥1.1.0版本的security
插件,nerdctl不会启用网桥隔离。这意味着--net=foo
网络中的容器可以连接到--net=bar
网络中的容器。
macvlan和IPvlan网络
nerdctl支持更高级的网络驱动类型,包括macvlan和IPvlan。
macvlan网络创建
创建macvlan网络的基本命令格式:
nerdctl network create mac0 --driver macvlan \
--subnet=192.168.5.0/24 \
--gateway=192.168.5.2 \
-o parent=eth0
参数说明:
--driver macvlan
:指定使用macvlan驱动--subnet
:定义子网范围--gateway
:设置网关地址-o parent
:指定物理网络接口(默认为默认路由接口)
使用DHCP分配IP
更简单的方式是使用DHCP自动分配IP:
nerdctl network create mac0 --driver macvlan --ipam-driver=dhcp
IPvlan网络创建
创建IPvlan网络的命令类似,默认模式为l2:
nerdctl network create ipv0 --driver ipvlan
DHCP高级配置
nerdctl自动将容器的hostname设置为DHCP主机名选项。此外,在创建网络时,可以通过--ipam-options
设置其他DHCP选项。
目前支持的DHCP选项包括:
- dhcp-client-identifier
- subnet-mask
- routers
- user-class
- vendor-class-identifier
示例:
nerdctl network create --driver macvlan \
--ipam-driver dhcp \
--ipam-opt 'vendor-class-identifier={"type": "provide", "value": "CustomValue"}' \
my-dhcp-net
自定义网络配置
nerdctl允许用户完全自定义CNI网络配置。配置文件的位置取决于运行模式:
- rootful模式:
/etc/cni/net.d
- rootless模式:
~/.config/cni/net.d/
配置文件可以放在根目录下(对所有命名空间可见),也可以放在子目录中(仅对同名命名空间可见)。
自定义bridge网络示例
创建/etc/cni/net.d/10-mynet.conf
文件:
{
"cniVersion": "1.0.0",
"name": "mynet",
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"ipam": {
"type": "host-local",
"subnet": "172.19.0.0/24",
"routes": [
{ "dst": "0.0.0.0/0" }
]
}
}
使用自定义网络创建容器:
nerdctl run -it --net mynet --rm alpine ip addr show
最佳实践建议
- 生产环境网络隔离:确保使用≥1.1.0版本的security插件以获得网络隔离功能
- IP地址规划:合理规划子网范围,避免IP冲突
- 性能考虑:macvlan性能优于bridge,但需要更多物理网络配置
- DHCP使用:在动态环境中考虑使用DHCP简化IP管理
- 配置备份:自定义网络配置应进行版本控制和备份
总结
nerdctl通过CNI插件提供了灵活强大的容器网络功能,从简单的bridge网络到复杂的macvlan/IPvlan网络,再到完全自定义的网络配置,可以满足各种场景下的容器网络需求。理解这些网络配置的原理和使用方法,将帮助开发者更好地设计和部署容器化应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考