containerd AMD版 二进制安装containerd

安装步骤

由于 containerd 需要调用 runc,所以我们也需要先安装 runc,不过 containerd 提供了一个包含相关依赖的压缩包 cri-containerd-cni-${VERSION}.${OS}-${ARCH}.tar.gz,可以直接使用这个包来进行安装。

下载二进制包

wget https://github.com/containerd/containerd/releases/download/v1.7.23/cri-containerd-cni-1.7.23-linux-amd64.tar.gz

可以通过 tar 的 -t 选项直接看到压缩包中包含哪些文件:

[root@iZ0jldvvnr8cjbe87g9cqbZ ~]# tar -tf cri-containerd-cni-1.7.23-linux-amd64.tar.gz
cri-containerd.DEPRECATED.txt
etc/
etc/systemd/
etc/systemd/system/
etc/systemd/system/containerd.service
etc/cni/
etc/cni/net.d/
etc/cni/net.d/10-containerd-net.conflist
etc/crictl.yaml
usr/
usr/local/
usr/local/sbin/
usr/local/sbin/runc
usr/local/bin/
usr/local/bin/containerd-shim-runc-v1
usr/local/bin/containerd
usr/local/bin/critest
usr/local/bin/containerd-shim
usr/local/bin/ctd-decoder
usr/local/bin/crictl
usr/local/bin/ctr
usr/local/bin/containerd-stress
usr/local/bin/containerd-shim-runc-v2
opt/
opt/cni/
opt/cni/bin/
opt/cni/bin/host-device
opt/cni/bin/sbr
opt/cni/bin/loopback
opt/cni/bin/bridge
opt/cni/bin/portmap
opt/cni/bin/vlan
opt/cni/bin/tuning
opt/cni/bin/vrf
opt/cni/bin/macvlan
opt/cni/bin/firewall
opt/cni/bin/dhcp
opt/cni/bin/ptp
opt/cni/bin/dummy
opt/cni/bin/ipvlan
opt/cni/bin/host-local
opt/cni/bin/bandwidth
opt/cni/bin/static
opt/containerd/
opt/containerd/cluster/
opt/containerd/cluster/gce/
opt/containerd/cluster/gce/cloud-init/
opt/containerd/cluster/gce/cloud-init/node.yaml
opt/containerd/cluster/gce/cloud-init/master.yaml
opt/containerd/cluster/gce/env
opt/containerd/cluster/gce/configure.sh
opt/containerd/cluster/gce/cni.template
opt/containerd/cluster/version

 解压&&安装

tar -C / -xzf cri-containerd-cni-1.7.23-linux-amd64.tar.gz

配置环境变量

如果PATH中已经有如下2个环境变量,则可忽略

# 为当前用户配置环境变量
vim ~/.bashrc

# 添加内容(如果PATH中已经有如下2个环境变量,则可忽略):
export PATH=$PATH:/usr/local/bin:/usr/local/sbin

# 生效
source ~/.bashrc

 生成containerd默认配置文件

mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml

 配置自定义存储目录

vim /etc/containerd/config.toml

# 将下面内容
root = "/var/lib/containerd"

# 替换为:
root = "/you/customer/path"

# 重启containerd
sudo systemctl restart containerd

 配合k8s部署-自定义修改

这里的修改是为了解决:在大陆部署k8s时无法访问国外网络的问题

# 编辑配置文件
vim /etc/containerd/config.toml

## 修改项-1
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

## 修改项-2
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

containerd.service

由于上面我们下在的 containerd 压缩包中包含一个 etc/systemd/system/containerd.service 的文件,这样我们就可以通过 systemd 来配置 containerd 作为守护进程运行了,内容如下所示:

➜  ~ cat /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
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=1048576
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target

 这里有两个重要的参数:

  • Delegate: 这个选项允许 containerd 以及运行时自己管理自己创建容器的 cgroups。如果不设置这个选项,systemd 就会将进程移到自己的 cgroups 中,从而导致 containerd 无法正确获取容器的资源使用情况。
  • KillMode: 这个选项用来处理 containerd 进程被杀死的方式。默认情况下,systemd 会在进程的 cgroup 中查找并杀死 containerd 的所有子进程。KillMode 字段可以设置的值如下。
    • control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
    • process:只杀主进程
    • mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
    • none:没有进程会被杀掉,只是执行服务的 stop 命令

我们需要将 KillMode 的值设置为 process,这样可以确保升级或重启 containerd 时不杀死现有的容器。

启动containerd服务

systemctl enable containerd --now

验证containerd服务

systemctl status containerd

 使用 ctr 拉取镜像

ctr images pull registry.cn-beijing.aliyuncs.com/mycentos:blog_v2

参考网址

Releases · containerd/containerd · GitHub containerd release

Releases · opencontainers/runc · GitHub runc release

Releases · containernetworking/plugins · GitHub cni release

containerd、cni、runc三者的关系

containerdCNI (Container Network Interface) 和 runc 是容器生态系统中的三个重要组件,它们在容器的创建、管理和网络配置中扮演着不同但互相关联的角色。

runc

  • 功能runc 是一个轻量级的容器运行时,负责根据 OCI(Open Container Initiative)规范创建和管理容器。它直接与操作系统的内核进行交互,使用 Linux 的命名空间和控制组(cgroups)等功能来实现容器的隔离和资源限制。
  • 角色runc 执行容器的生命周期管理,包括创建、启动、停止和删除容器。

containerd

  • 功能containerd 是一个高层的容器管理守护进程,它提供了容器的生命周期管理功能,包括镜像管理、容器运行时管理等。containerd 作为对 runc 的封装,使得用户不必直接与 runc 交互。
  • 职责: 它负责协调容器的创建和删除,管理容器的状态,以及维护容器所需的网络和存储等资源。containerd 支持多种容器运行时,包括 runc

CNI (Container Network Interface)

  • 功能CNI 是一种用于管理容器网络的标准接口。它定义了一组插件,来配置容器的网络连接、IP 地址分配等功能。
  • 作用: 在容器启动时,containerd 会调用 CNI 插件来配置容器的网络,确保容器能够在网络中通信。

它们之间的关系

  • 集成架构containerd 利用 runc 作为底层运行时来启动和管理容器,并通过 CNI 来处理容器的网络配置。具体流程是:containerd 启动一个容器时,会通过 runc 来创建和管理容器本身,然后调用 CNI 插件以设置网络。
  • 工作流程:
    1. 当用户请求启动一个容器时,containerd 接收该请求并与 runc 交互,创建容器实例。
    2. containerd 向 CNI 发送请求,配置容器的网络设置。
    3. CNI 插件负责为容器分配 IP 地址和设置网络规则,使得容器能够相互通信或与外部网络交互。

小结

综上所述,containerdCNI 和 runc 形成了容器管理的完整生态系统,其中 runc 负责底层容器运行,containerd 作为管理层和调用者,CNI 处理容器网络配置。这种分层架构使得容器管理更加灵活和模块化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

耿雨飞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值