Containerd和加速

一、Containerd 介绍

1、安装 Containerd

方式一:下载二进制压缩包

curl -LO https://github.com/containerd/containerd/releases/download/v1.6.6/containerd-1.6.6-linux-amd64.tar.gz

tar Cxzvf /usr/local containerd-1.6.6-linux-amd64.tar.gz

mkdir -p /usr/local/lib/systemd/system/ && \
curl -L https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -o /usr/local/lib/systemd/system/containerd.service && \
systemctl daemon-reload && \
systemctl enable --now containerd

方式二:使用国内源安装

以 Ubuntu 24.04.1 LTS 、阿里源为例

# 安装依赖
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

# 添加 containerd GPG 密钥(阿里云镜像)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

# 添加 containerd 仓库(使用官方源,阿里云也镜像了)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y containerd.io

2、命令行工具 ctr(containerd native CLI)

1、ctr:containerd 相比于docker , 多了namespace概念

每个image和container 都会在各自的namespace下可见, 目前k8s会使用k8s.io 作为命名空间

2、ctr(containerd native CLI)
  • 由 containerd 官方提供,随 containerd 一并安装。
  • 直接调用 containerd 原生 gRPC API,不经过 CRI 层。
  • 面向“单机调试、开发测试、底层排障”,与 Kubernetes 无关。
  • 支持 namespace 隔离(k8s.io、moby、default 等),因此需要显式指定 -n 才能看到 K8s 创建的容器/镜像

3、使用 ctr 手动调试容器

# =========================
# containerd 镜像管理
# =========================

# 删除镜像
ctr -n k8s.io images rm k8s.gcr.io/pause:3.2

# 拉取镜像(直接落在 k8s.io 命名空间)
ctr -n k8s.io images pull -k k8s.gcr.io/pause:3.2

# 推送镜像
ctr -n k8s.io images push -k k8s.gcr.io/pause:3.2

# 导出镜像到 tar 文件
ctr -n k8s.io images export pause.tar k8s.gcr.io/pause:3.2

# 从 tar 文件导入镜像
ctr -n k8s.io images import pause.tar

# 从 Docker Hub 拉取镜像(默认落在 default 命名空间)
ctr images pull docker.io/library/nginx:1.25

# 导入到 k8s.io 命名空间,以便 kubelet 可见
ctr -n k8s.io images tag docker.io/library/nginx:1.25 nginx:1.25

# =========================
# containerd 容器管理
# =========================

# 创建并运行容器(使用 host 网络)
ctr -n k8s.io container create --net-host nginx:1.25 nginx-debug
ctr -n k8s.io task start -d nginx-debug

# 进入容器调试
ctr -n k8s.io task exec --exec-id shell1 -t nginx-debug sh

# 停止并删除容器
ctr -n k8s.io task kill -9 nginx-debug
ctr -n k8s.io container rm nginx-debug

# =========================
# 注意事项
# =========================
# ctr 不支持 build 或 commit 镜像操作

3、命令行工具 crictl(CRI client CLI)

1、crictl 是为k8s使用containerd而制作的

其他非k8s的创建的 crictl是无法看到和调试的, 也就是说用ctr run 运行的容器无法使用crictl 看到

2、crictl(CRI client CLI)

  • 由 Kubernetes SIG-Node 维护,二进制包名叫 cri-tools
  • 仅通过 CRI(Container Runtime Interface) 与 containerd 通信,语义和 kubelet 完全一致。
  • 专为 K8s 节点运维设计,只能看到 k8s.io namespace 下的资源,且不需要也不能用 -n 参数
  • 在 K8s 1.24+ Dockershim 移除后,成为节点调试的“官方标配”。

3、作为依赖会被安装

或者直接安装apt install cri-tools

# apt install -y kubeadm=1.32.* kubelet=1.32.* kubectl=1.32.* 

# apt-cache depends kubeadm
kubeadm
  Depends: cri-tools

4、首次使用前必须配置端点

sudo crictl config \
--set runtime-endpoint=unix:///run/containerd/containerd.sock \
--set image-endpoint=unix:///run/containerd/containerd.sock \
--set timeout=10 \
--set debug=false

4、常见误区与注意事项

1、镜像不可见问题

  用 ctr images pull 默认放在 default namespace,导致 kubelet 无法感知。

  解决:拉取后执行 ctr -n k8s.io images tag/import,或直接 crictl pull

2、ctr 运行容器 ≠ K8s Pod

  ctr 创建的容器没有 sandbox、无 CNI 网络,也不会被 kubelet 管理;仅用于本地验证。

  crictl 不能跨 namespace

3、若系统同时跑 Docker 与 containerd,Docker 创建的容器在 moby namespace,crictl 永远看不到。

4、版本一致性

  ctr -v 显示 containerd 版本;

  crictl -v 显示 cri-tools 编译时对应的 K8s 版本,不匹配时可能字段缺失。

5、nerdctl :(替代 docker cli)

自从 Containerd 发布 1.5 以后,nerdctl 工具配合 Containerd 的情况下基本已经可以替换掉 Docker 和 Docker Compose;

nerdctl 官方发布包包含两个安装版本:

  • Minimal: 仅包含 nerdctl 二进制文件以及 rootless 模式下的辅助安装脚本
  • Full: 看名字就能知道是个全量包,其包含了 Containerd、CNI、runc、BuildKit 等完整组件

1、nerdctl 项目地址

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

 GitHub - containerd/nerdctl: Docker-compatible CLI for containerd, with support for Compose

2、nerdctl的下载安装

在k8s高版本中,采用Containerd 运行时,docker被舍弃,构建images将采用buildkit服务

##下载
wget  https://github.com/containerd/nerdctl/releases/download/v0.11.1/nerdctl-full-0.11.1-linux-amd64.tar.gz

##解压
tar Cxzvvf /usr/local nerdctl-full-0.11.1-linux-amd64.tar.gz

## 启动 containerd 和 buildkitd
systemctl enable --now containerd
systemctl enable --now buildkit

二、nerdctl 运用

1、pull  images

ctr image  pull  docker.io/cnrancher/rancher:v2.4.17-ent
nerdctl pull  rancher/cluster-proportional-autoscaler-amd64:1.0.0

2、查看所有的名称空间

nerdctl namespace ls

NAME        CONTAINERS    IMAGES    VOLUMES
buildkit    0             0         0
default     0             2         0
k8s.io      26            28        0

3、查看某个名称空间下的镜像

nerdctl   -n   k8s.io  images

4、指定名称空间重新打tag

nerdctl --namespace k8s.io   tag    calico/cni:v3.19.1  docker.harbor.com/ops/cni:v3.19.1

5、设置nerdctl子命令可以使用tab键

vim /etc/profile
source <(nerdctl completion bash)

# 让其生效
source /etc/profile

6、run 一个容器

nerdctl   run -d --privileged --restart=always  --name zjz-rancher  -p 80:80 -p 443:443  docker.io/cnrancher/rancher:v2.4.17-ent

三、配置加速地址

1、生成默认配置

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

2、修改镜像存储位置

cat /etc/containerd/config.toml

root = "/home/images/containerd"

3、镜像加速地址

在 [plugins."io.containerd.grpc.v1.cri".registry] 中添加镜像加速器

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  endpoint = [
    "https://registry.cn-hangzhou.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com",
    "https://docker.1panel.live",
    "https://hub.littlediary.cn",
    "https://docker.kejilion.pro",
    "https://docker.1ms.run",
    "https://lispy.org",
    "https://docker.xiaogenban1993.com",
    "https://docker.xuanyuan.me",
    "https://docker.mybacc.com",
    "https://docker-0.unsee.tech",
    "https://dockerpull.cn"
  ]

这样配置后,containerd 拉 Docker Hub 镜像就会自动走国内加速器,只要加速器可用,速度就会飞起来。

重启 containerd

systemctl daemon-reload
systemctl restart containerd

注意:必须用 crictl 或 Kubernetes 拉镜像测试,ctr 命令不会走加速器

 crictl pull nginx:1.27

使用 ctr plugins ls 来查看当前加载的插件和支持的操作。

[root@zjz ~]# ctr plugins ls
TYPE                            ID                       PLATFORMS      STATUS
io.containerd.content.v1        content                  -              ok
io.containerd.snapshotter.v1    aufs                     linux/amd64    skip
io.containerd.snapshotter.v1    devmapper                linux/amd64    error

补充:.registry 用于配置 CRI(Container Runtime Interface)插件下的镜像仓库(registry)相关行为

  • 镜像拉取/推送时的 认证(auth)
  • 使用 TLS 时的安全策略(tls)
  • 为特定 registry 设置镜像加速(mirrors)
  • 请求时添加的自定义 HTTP header
  • Registry 的全局认证凭据(auths)

🔹 根节点:[plugins."io.containerd.grpc.v1.cri".registry]

这是 containerd 的 CRI 插件中 registry 模块的根配置项,所有子配置都隶属于它。

🔸 1. [plugins."io.containerd.grpc.v1.cri".registry.auths]

  • 作用:用于为 registry 配置全局认证信息(类似 ~/.docker/config.json 中的 auths)。
  • ⚠️ 当前为空,说明未在此层级设置通用凭据(可能凭据分散在 configs.*.auth 中配置)。

🔸 2. [plugins."io.containerd.grpc.v1.cri".registry.configs]

特定 registry(按域名或 IP+端口)提供细粒度配置,可分别指定:

  • TLS 行为(如跳过证书校验)
  • 认证凭据(username/password)
  • HTTP header(如 User-Agent)

🔸 3. [plugins."io.containerd.grpc.v1.cri".registry.headers]

  • 作用:为所有 registry 请求添加全局 HTTP header(如定制 User-AgentX-Request-ID)。
  • 当前为空,未设置。

🔸 4. [plugins."io.containerd.grpc.v1.cri".registry.mirrors]

核心功能:配置镜像加速(mirror)和重定向

当拉取 docker.io/library/nginx:latest 时,containerd 会优先尝试从 mirrors."docker.io".endpoint 列出的地址拉取(如国内镜像站),提升拉取速度、绕过网络限制。

[plugins."io.containerd.grpc.v1.cri".registry]

      [plugins."io.containerd.grpc.v1.cri".registry.auths]

      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."easzlab.io.local:5000".tls]
          insecure_skip_verify = true

        [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.easzlab.io.local:8443".tls]
          insecure_skip_verify = true

        [plugins."io.containerd.grpc.v1.cri".registry.configs."ip:7080".tls]
          insecure_skip_verify = true
        [plugins."io.containerd.grpc.v1.cri".registry.configs."ip:7080".auth]
          username = "xxxxxxx"
          password = "xxxxxxx"

        [plugins."io.containerd.grpc.v1.cri".registry.configs."ip:7443".tls]
          insecure_skip_verify = true
        [plugins."io.containerd.grpc.v1.cri".registry.configs."ip:7443".auth]
          username = "xxxxxxx"
          password = "xxxxxxx"

        [plugins."io.containerd.grpc.v1.cri".registry.configs."ip:7443".tls]
          insecure_skip_verify = true
        [plugins."io.containerd.grpc.v1.cri".registry.configs."ip:7443".auth]
          username = "xxxxx"
          password = "xxxxxxxx"

      [plugins."io.containerd.grpc.v1.cri".registry.headers]

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."easzlab.io.local:5000"]
          endpoint = ["http://easzlab.io.local:5000"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.easzlab.io.local:8443"]
          endpoint = ["https://harbor.easzlab.io.local:8443"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."ip:7080"]
          endpoint = ["http://ip:7080"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."ip:7443"]
          endpoint = ["https://ip:7443"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."ip:7443"]
          endpoint = ["https://ip:7443"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://docker.nju.edu.cn/", "https://kuamavit.mirror.aliyuncs.com"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
          endpoint = ["https://gcr.nju.edu.cn"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
          endpoint = ["https://gcr.nju.edu.cn/google-containers/"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
          endpoint = ["https://quay.nju.edu.cn"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."ghcr.io"]
          endpoint = ["https://ghcr.nju.edu.cn"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."nvcr.io"]
          endpoint = ["https://ngc.nju.edu.cn"]

image 

四、 containerd连接harbor仓库

1、github项目地址介绍

cri/registry.md at master · containerd/cri · GitHub

2、containerd的配置文件(docker 的 daemon.json)

vim   /etc/containerd/config.toml

[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry-1.docker.io"] //到此为配置文件默认生成,之后为需要添加的内容
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."10.10.20.71:9998"]
endpoint = ["https://10.10.20.71:9998"]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."10.10.20.71:9998".tls]
insecure_skip_verify = true
[plugins."io.containerd.grpc.v1.cri".registry.configs."10.10.20.71:9998".auth]
username = "admin"
password = "Harbor12345"

其中“10.10.20.71.9998”是私人仓库地址。
insecure_skip_verify = true 意为跳过证书认证。

加速和对接harbor

保存并重启containerd服务即可

systemctl restart containerd

五、containerd配置nvidia

K3s 会在 /var/lib/rancher/k3s/agent/etc/containerd/config.toml 中为 containerd 生成 config.toml。

如果要对这个文件进行高级定制,你可以在同一目录中创建另一个名为 config.toml.tmpl 的文件,此文件将会代替默认设置。

config.toml.tmpl 是一个 Go 模板文件,并且 config.Node 结构会被传递给模板

k3s/pkg/agent/templates at master · k3s-io/k3s (github.com) 模版文件地址,复制` `内的内容

containerd 重启配置是会自动刷新的,每次重启 k3s 都会重新被默认配置覆盖掉,需要一个指定一个模版文件/var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl ,并且在模版文件里自定义配置加了一行

default_runtime_name = "nvidia"

高级选项和配置 | K3s

重启containerd、k3s,服务器(遇到都配好了,重启服务器才有效果)

 

posted @ 2021-08-31 23:33  凡人半睁眼  阅读(812)  评论(0)    收藏  举报