跳至正文
Wener Notes

CNI

约 2 分钟阅读
  • 是什么?
    • 抽象容器网络接口规范
    • cni-plugins 提供了大量实现
  • - 规范
  • - 参考实现
  • alpine 默认安装路径 /usr/libexec/cni/
  • 默认网络配置目录 /etc/cni/net.d
  • CNI 包含了启动脚本 -
    • 操作 netns - ip netns
    • exec-plugins add|del CNI_CONTAINERID CNI_NETNS
      • CNI_CONTAINERID - 容器 ID
        • 唯一标示目的,可以随机生成
        • docker 可直接使用 容器 ID
        • 例如 printf '%x%x%x%x' $RANDOM $RANDOM $RANDOM $RANDOM
      • CNI_NETNS - 网络命名空间路径
        • /proc/<pid>/ns/net
TypeDesc
Main: 网口创建
bridge创建桥接,添加宿主机和容器网络到桥接
ipvlan添加 ipvlan 到容器
loopbackip li set lo1 up
macvlan创建 macvlan 给容器,转发 mac 流量
ptpveth 对
vlan创建 vlan
host-device透传已存在设备
Windows
win-bridge
win-overlay
IPAM: IP 地址申请
dhcpDHCP 申请
host-local管理本地申请到的 IP
static使用静态地址
Meta: 其他插件
flannel基于 flannel 生成网口
tuning通过 sysctl 修改网口配置
portmap基于 iptables 的端口映射 - 主机地址端口到容器
bandwidth进出带宽限制
sbr基于来源的路由
firewall基于 iptables 或 firewalld 的防火墙控制

spec

  • add,delete,version
  • stdin, stdout
  • CNI_ARGS, CAP_ARGS
bash
cat <<CONF > bridge.conf
{
  "name": "mynet",
  "type": "bridge",
  "ipam": {
    "type":"host-local",
    "subnet": "10.10.1.0/24"
  }
}
CONF
ip netns add ns1

CNI_COMMAND=ADD CNI_CONTAINERID=ns1 CNI_NETNS=/var/run/netns/ns1 CNI_IFNAME=eth2 CNI_PATH="$PWD" \
bridge < bridge.conf

bridge

json
{
  "cniVersion": "0.3.1",
  // 网络名字
  "name": "mynet",
  // 网络类型 - 对应 /usr/libexec/cni/
  "type": "bridge",

  // 桥接名字 - 默认 cni0
  "bridge": "cni0",
  // 设置的 IP 作为默认路由
  "isDefaultGateway": false,
  // 设否设置新的 IP 地址
  "forceAddress": false,
  // 是否配置 masquerade
  "ipMasq": false,
  // MTU 默认取决于 内核
  "mtu": 0,
  // hairpin 模式
  "hairpinMode": false,
  // IP 地址管理 - L2 网络
  "ipam": {
    "type": "host-local",
    "subnet": "10.10.0.0/16"
  },
  // promiscuous 模式
  "promiscMode": false
  // 是否设置 VLAN tag
  // "vlan":0
}

Windows

  • win-overlay
  • win-bridge
  • host-local
  • flannel
bash
cat <<CONF > overlay.conf
{
	"name": "mynet",
	"type": "win-overlay",
	"ipMasq": true,
	"endpointMacPrefix": "0E-2A",
	"ipam": {
		"type": "host-local",
		"subnet": "10.10.0.0/16"
	},
  "loopbackDSR": true,
  "capabilites": {
      "dns": true
  }
}
CONF

CNI_COMMAND=ADD CNI_CONTAINERID=ns1 CNI_NETNS=/var/run/netns/ns1 CNI_IFNAME=eth2 CNI_PATH="$PWD" \
./win-overlay < overlay.conf

error while GETHNSNewtorkByName(mynet): hnsCall failed in Win32: The specified module could not be found. (0x7e)

failed to find plugin flannel in path /usr/libexec/cni

cni-plugins v1 后没有 flannel

关联信息

反向链接、本文链接的其他页面和外部资料。

参考资料

GitHub4 条
其他外链2 条
最近更新commit 970526b编辑