背景

K8s 1.24版本开始不再维护docker-shim,也就是删除了kubelet中关于与docker集成的代码,方便接入其他容器方案。
但是底层用的还是containerd,调用链短了,k8s性能更好。如果还想像以前一样在k8s中使用docker,
需要单独安装cri-docker(由docker公司开发,方便接入k8s)适配器,但是会影响k8s性能。docker构建的镜像同样适用于containerd。

替代后的使用

crictl作用于k8s集群,对其他容器不生效。主要用来调试k8s。
ctr时containerd自带工具,不走containerd的加速器配置。
nerdctl是conainerd子项目客户端,走加速器配置,镜像下载快。
nerdctl,使用效果与 docker 命令的语法一致,

下载链接:

https://github.com/containerd/nerdctl/releases

说明

精简 (nerdctl–linux-amd64.tar.gz): 只包含 nerdctl
完整 (nerdctl-full–linux-amd64.tar.gz): 包含 containerd, runc, and CNI 等依赖 nerdctl 的目标并不是单纯地复制 docker 的功能,
它还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)、镜像加密(imgcrypt)等。具体看 nerdctl。
Containerd 使用 Stargz Snapshotter 延迟拉取镜像 (opens new window),大致就是不拉取整个镜像文件,而是按需获取必要的文件
额外补充
当使用nerdctl启动一个容器服务后,便会在服务器上生成一个虚拟网卡,容器网络防火墙规则的优先级是比服务器上设置高的,也就意味着开了防火墙也管控不住端口的访问,此时可以使用类似与docker的主机网络模式(–net=host),但是做不了端口映射了。

nerdctl安装步骤

下载

wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-0.22.2-linux-amd64.tar.gz

解压

tar -xf nerdctl-0.22.2-linux-amd64.tar.gz
mv /opt/nerdctl /usr/bin/

打镜像标签与推送镜像

nerdctl -n k8s.io tag test.harbor.com/public/nginx-1.20.1-base:v1 test.harbor.com/public/nginx-1.20.1-base:v2
nerdctl login --username "admin" --password Harbor12345 test.harbor.com
nerdctl --insecure-registry --namespace=k8s.io push test.harbor.com/public/nginx-1.20.1-base:v2

安装buildkit支持构建镜像

  • 使用精简版 nerdctl 无法直接通过 containerd 构建镜像,需要与 buildkit 组全使用以实现镜像构建。buildkit 项目是 Docker 公司开源出来的一个构建工具包,支持 OCI 标准的镜像构建
    buildkit GitHub 地址:
    https://github.com/moby/buildkit

安装

wget https://github.com/moby/buildkit/releases/download/v0.10.4/buildkit-v0.10.4.linux-amd64.tar.gz
mkdir /usr/local/tools/
tar -xf buildkit-v0.10.4.linux-amd64.tar.gz  -C /usr/local/tools/

配置 buildkit 的启动文件,可以从这里下载:

https://github.com/moby/buildkit/tree/master/examples/systemd
buildkit 需要配置两个文件
/usr/lib/systemd/system/buildkit.socket
/usr/lib/systemd/system/buildkit.service

配置启动文件

cat > /usr/lib/systemd/system/buildkit.socket <<EOF
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
[Socket]
ListenStream=%t/buildkit/buildkitd.sock
SocketMode=0660
[Install]
WantedBy=sockets.target
EOF
/usr/lib/systemd/system/buildkit.service
cat > /usr/lib/systemd/system/buildkit.service << EOF
[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socket
Documentation=https://github.com/moby/buildkit
[Service]
# Replace runc builds with containerd builds
ExecStart=/usr/local/tools/bin/buildkitd --addr fd://
[Install]
WantedBy=multi-user.target
EOF

重载启动

systemctl daemon-reload
systemctl enable buildkit --now

测试构建

cat > Dockerfile <<EOF
FROM nginx:alpine
RUN echo 'Hello Nerdctl From Containerd' > /usr/share/nginx/html/index.html
EOF

重点说明

不加-n指定命名空间,crictl看不到,kubelet也不能使用它,默认在default命名空间下

nerdctl -n k8s.io build -t nginx:nerctl -f ./Dockerfile .

参数解释:
-t:指定镜像名称
. :当前目录Dockerfile
-f:指定Dockerfile路径
–no-cache:不缓存

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐