深入理解containerd/nerdctl中的CNI网络配置

深入理解containerd/nerdctl中的CNI网络配置

nerdctl contaiNERD CTL - Docker-compatible CLI for containerd, with support for Compose, Rootless, eStargz, OCIcrypt, IPFS, ... nerdctl 项目地址: https://gitcode.com/gh_mirrors/ne/nerdctl

前言

在现代容器化技术中,网络配置是一个至关重要的组成部分。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:指定网桥名称为nerdctl0
  • isGateway:设置为true表示创建网关
  • ipMasq:启用IP伪装,允许容器访问外部网络
  • hairpinMode:允许容器通过自己的外部IP访问自己
  • ipam:IP地址管理配置,使用host-local插件
  • subnet:定义子网范围为10.4.0.0/24
  • gateway:设置网关地址为10.4.0.1

网络隔离机制

从nerdctl 0.18版本开始,当安装的security插件版本≥1.1.0时,会设置ingressPolicysame-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.1.0版本的security插件以获得网络隔离功能
  2. IP地址规划:合理规划子网范围,避免IP冲突
  3. 性能考虑:macvlan性能优于bridge,但需要更多物理网络配置
  4. DHCP使用:在动态环境中考虑使用DHCP简化IP管理
  5. 配置备份:自定义网络配置应进行版本控制和备份

总结

nerdctl通过CNI插件提供了灵活强大的容器网络功能,从简单的bridge网络到复杂的macvlan/IPvlan网络,再到完全自定义的网络配置,可以满足各种场景下的容器网络需求。理解这些网络配置的原理和使用方法,将帮助开发者更好地设计和部署容器化应用。

nerdctl contaiNERD CTL - Docker-compatible CLI for containerd, with support for Compose, Rootless, eStargz, OCIcrypt, IPFS, ... nerdctl 项目地址: https://gitcode.com/gh_mirrors/ne/nerdctl

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

### 如何在 Ubuntu 上安装 containerdnerdctl #### 1. 安装 containerd 为了在 Ubuntu 系统上成功安装 `containerd`,需要遵循以下流程: - **下载并解压容器运行时工具** 首先从官方仓库获取最新版本的 `containerd` 并将其解压缩到指定目录。以下是具体操作步骤: ```bash wget https://github.com/containerd/containerd/releases/download/v1.7.5/containerd-1.7.5-linux-amd64.tar.gz sudo tar Cxzvf /usr/local containerd-1.7.5-linux-amd64.tar.gz ``` - **配置 systemd 单元文件** 接下来创建必要的服务单元文件以便于管理 `containerd` 的启动和服务状态。 ```bash sudo mkdir -p /etc/systemd/system/containerd.service.d/ cat <<EOF | sudo tee /etc/systemd/system/containerd.service [Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target local-fs.target [Service] ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/local/bin/containerd Type=notify Delegate=yes KillMode=process Restart=always RestartSec=5 OOMScoreAdjust=-900 [Install] WantedBy=multi-user.target EOF ``` - **启用并启动 service** 使用 systemctl 命令来激活和验证新设置的服务是否正常工作。 ```bash sudo systemctl daemon-reload sudo systemctl enable --now containerd sudo systemctl status containerd ``` --- #### 2. 安装 nerdctl 完成 `containerd` 的基础环境搭建后,继续安装 `nerdctl` 来提供 Docker CLI 兼容功能。 - **选择合适的版本进行下载与提取** 根据需求挑选适合系统的二进制包形式(推荐 minimal 版本),然后放置至全局可访问路径下。 ```bash wget https://github.com/containerd/nerdctl/releases/download/v1.5.0/nerdctl-1.5.0-linux-amd64.tar.gz tar xzvf nerdctl-1.5.0-linux-amd64.tar.gz sudo mv nerdctl /usr/local/bin/ ``` - **测试安装情况** 执行下面这条指令确认程序已被正确加载以及其基本参数设定无误。 ```bash nerdctl version ``` 如果一切顺利的话,则会显示当前所使用的客户端版本号及相关信息[^2]。 --- #### 3. 解决可能遇到的问题 当尝试利用 `nerdctl` 启动镜像实例时报错提示缺少某些网络插件支持时,请按照如下方式处理: - **安装必要依赖项——CNI 插件集** 访问官方资源页面找到对应平台架构适用版本链接地址,并依照指示完成整个过程。 ```bash VERSION="v1.3.0" ARCH="amd64" URL="https://github.com/containernetworking/plugins/releases/download/${VERSION}/cni-plugins-linux-${ARCH}-${VERSION}.tgz" curl -L "${URL}" -o cni-plugins.tgz sudo mkdir -p /opt/cni/bin sudo tar zxvf cni-plugins.tgz -C /opt/cni/bin/ rm -rf cni-plugins.tgz ``` 这样就能有效规避因缺失特定组件而导致的功能受限现象发生[^5]。 --- ### 总结 以上就是在 Ubuntu 中实现基于 `containerd` 运行时框架配合 `nerdctl` 工具链的一整套解决方案概述说明文档内容摘录整理而成的结果展示部分[^1][^2][^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

昌寒庆Quillan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值