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
|
- 测试
containerd
和 nerdctl
是否安装成功
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"
|
1
2
3
|
# cni 网络配置
mkdir -p /opt/cni/bin/
tar -zxf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin/
|
buildkit 是 nerdctl
由 Dockerfile 构建镜像所需的构建工具包。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
|
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
|