Containerd 安装

Containerd 安装和简单初始化配置

containerd

containerd 官网kubernetes v1.24 移除了 Dockershim,默认使用 Containerd 作为容器运行时

1
2
3
4
5
# 添加镜像源
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 containerd
yum install -y containerd.io

containerd 配置文档说明

containerd 启动之后会加载默认启动配置文件:/etc/containerd/config.toml

获取默认配置文件:containerd config default > /etc/containerd/config.toml

以上的配置需要注意 grpc.address 的配置,默认的配置为:"/run/containerd/containerd.sock",一会安装 crictl 时候会用的到。

containerd 默认 systemd 服务配置,默认 /usr/lib/systemd/system/containerd.service

  • 网络转发配置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
cat <<EOF | tee /etc/modules-load.d/optimize.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

cat <<EOF > /etc/sysctl.d/containerd.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sysctl -p /etc/sysctl.d/containerd.conf

registry 块配置参考文档Registry 配置项参考文档

注意:[plugins.“io.containerd.grpc.v1.cri”] 部分特定于 CRI,并且不能被其它 containerd 客户端(例如 ctr、nerdctl 和 Docker/Moby)识别。

镜像加速配置就在 cri 插件配置块下面的 registry 配置块:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[plugins]
 
    [plugins."io.containerd.grpc.v1.cri".registry]
      # config_path = "/etc/containerd/certs.d"
      config_path = ""
      
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://9ebf40sv.mirror.aliyuncs.com"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
          endpoint = ["https://registry.aliyuncs.com/google_containers"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
          endpoint = ["https://registry.aliyuncs.com/google_containers"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
          endpoint = ["xxx"]
  • registry.mirrors.“xxx” : 表示需要配置 mirror 的镜像仓库。例如,registry.mirrors."docker.io" 表示配置 docker.io 的 mirror。
  • endpoint : 表示提供 mirror 的镜像加速服务。

containerd 配置 registry mirror,旧的配置格式已经失效了。

最新的 containerd (v1.6.16) 已经修改为类似 docker 的配置方式,具体可以参考 containerd 仓库的 readme

修改 config_path 默认目录命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
sed -i '/config_path/s/""/"\/etc\/containerd\/certs.d"/' /etc/containerd/config.toml
mkdir -p /etc/containerd/certs.d

# 配置镜像仓库
mkdir -p /etc/containerd/certs.d/docker.io
cat <<EOF > /etc/containerd/certs.d/docker.io/hosts.toml
server = "https://docker.io"

[host."https://9ebf40sv.mirror.aliyuncs.com"]
  capabilities = ["pull", "resolve"]
  skip_verify = false
EOF

systemctl daemon-reload && systemctl restart containerd

自定义镜像仓库配置:hosts.toml 配置说明

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ tree /etc/containerd/certs.d
/etc/containerd/certs.d
└── docker.io
    └── hosts.toml

$ cat /etc/containerd/certs.d/docker.io/hosts.toml
server = "https://docker.io"

[host."https://registry-1.docker.io"]
  capabilities = ["pull", "resolve"]
  # capabilities = ["pull", "resolve", "push"]
  # skip_verify = true

虽然 Containerd 和 Kubernetes 默认使用旧版 cgroupfs 驱动程序来管理 cgroup,但建议在基于 systemd 的主机上使用 systemd 驱动程序,以符合 cgroup 的 “单写入者” 规则。

配置 containerd 使用 systemd 驱动:

1
2
3
4
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

指定命令:

1
2
3
sed -i '/SystemdCgroup/s/false/true/' /etc/containerd/config.toml
# sandbox pause 改为国内镜像
sed -i '/sandbox_image/s/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/containerd/config.toml

containerd 有两个不同的存储路径,一个用来保存持久化数据,一个用来保存运行时状态。

1
2
root = "/var/lib/containerd"
state = "/run/containerd"
  • root 用来保存持久化数据,包括 Snapshots, Content, Metadata 以及各种插件的数据。
  • 每一个插件都有自己单独的目录,containerd 本身不存储任何数据,它的所有功能都来自于已加载的插件,模块化设计。

containerd 常用命令行工具

nerdctl 是 containerd 兼容 Docker 的 CLI (command-line interface),nerdctl 下载地址

  • 安装步骤
1
2
3
wget https://github.com/containerd/nerdctl/releases/download/v1.5.0/nerdctl-1.5.0-linux-amd64.tar.gz
mkdir nerdctl && tar -zxf nerdctl-1.5.0-linux-amd64.tar.gz -C nerdctl
mv nerdctl/nerdctl /usr/local/bin/ && rm -rf nerdctl
  • 测试 containerdnerdctl 是否安装成功
1
nerdctl run hello-world

CNI (Container Network Interface) - 容器网络接口。CNI 插件下载

默认 cni 网络接口插件 bin 路径:/etc/containerd/config.toml cni 下配置定义。

1
2
3
4
5
[plugins]

    [plugins."io.containerd.grpc.v1.cri".cni]
      bin_dir = "/opt/cni/bin"
      conf_dir = "/etc/cni/net.d"
  • cni 插件安装
1
2
3
# cni 网络配置
mkdir -p /opt/cni/bin/
tar -zxf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin/

buildkitnerdctlDockerfile 构建镜像所需的构建工具包。buildkit 下载链接

1
2
3
wget https://github.com/moby/buildkit/releases/download/v0.12.2/buildkit-v0.12.2.linux-amd64.tar.gz
mkdir buildkit && tar -zxf buildkit-v0.12.2.linux-amd64.tar.gz -C buildkit
cp buildkit/bin/buildctl buildkit/bin/buildkitd buildkit/bin/buildkit-runc /usr/local/bin/ && rm -rf buildkit
  • systemd buildkit 系统服务 /usr/lib/systemd/system/buildkitd.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
cat <<EOF > /usr/lib/systemd/system/buildkitd.service
[Unit]
Description=BuildKit
After=network.target
Documentation=https://github.com/moby/buildkit

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

systemctl start buildkitd && systemctl enable buildkitd
  • 测试 Dockerfile 构建镜像
1
2
3
FROM alpine
RUN echo "built with BuildKit!" >  file
CMD ["/bin/sh"]

构建:nerdctl build -t alpine:v1 .

运行:nerdctl run --rm alpine:v1 ls /

Kubelet 容器运行时接口 (CRI) 的 CLI 和验证工具。

cri-tools 旨在为 Kubelet CRI 提供一系列调试和验证工具,其中包括:

1
2
tar -zxf crictl-v1.28.0-linux-amd64.tar.gz -C /usr/local/bin/
tar -zxf critest-v1.28.0-linux-amd64.tar.gz -C /usr/local/bin/

crictl 配置:/etc/crictl.yaml

1
2
3
4
5
6
cat <<EOF > /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
pull-image-on-create: false
EOF

相关内容