王海龙,Rancher中国社区技术经理,负责Rancher中国技术社区的维护和运营。拥有6年的云计算领域经验,经历了OpenStack到Kubernetes的技术变革,无论底层操作系统Linux,还是虚拟化KVM或是Docker容器技术都有丰富的运维和实践经验。
前 言Kubernetes 在 Changelog 中宣布自 Kubernetes 1.20 之后将弃用 Docker 作为容器运行时之后,containerd成为下一个容器运行时的热门选项。虽然 containerd 很早就已经是 Docker 的一部分,但是纯粹使用 containerd 还是给大家带来了诸多困扰,本文将介绍如何使用 containerd 配置镜像仓库和加速器。
本文将以K3s为例对containerd进行配置,如果您的环境未使用 K3s 而是使用的 Kubernetes,你也可以参考本文来配置 containerd 的镜像仓库,因为 containerd 的配置是通用的。
关于 K3s 和 containerdK3s 是一个轻量级 Kubernetes 发行版,二进制大小小于100MB,所需内存不到Kubernetes的一半。K3s 为了降低资源消耗,将默认的 runtime 修改为 containerd,同时也内置了 Kubernetes CLI 工具 crictl和ctr。
K3s 默认的 containerd 配置文件目录为/var/lib/rancher/k3s/agent/etc/containerd/config.toml,但直接操作 containerd 的配置文件去设置镜像仓库或加速器相比于操作 docker 要复杂许多。K3s 为了简化配置 containerd 镜像仓库的复杂度,K3s 会在启动时检查/etc/rancher/k3s/中是否存在 registries.yaml 文件,如果存在该文件,就会根据 registries.yaml 的内容转换为 containerd 的配置并存储到/var/lib/rancher/k3s/agent/etc/containerd/config.toml,从而降低了配置 containerd 镜像仓库的复杂度。
使用 K3s 配置私有镜像仓库K3s 镜像仓库配置文件由两大部分组成:mirrors和configs:
Mirrors 是一个用于定义专用镜像仓库的名称和 endpoint 的指令
Configs 部分定义了每个 mirror 的 TLS 和证书配置。对于每个 mirror,你可以定义auth和/或tls
containerd 使用了类似 K8S 中 svc 与 endpoint 的概念,svc 可以理解为访问名称,这个名称会解析到对应的 endpoint 上。也可以理解 mirror 配置就是一个反向代理,它把客户端的请求代理到 endpoint 配置的后端镜像仓库。mirror 名称可以随意填写,但是必须符合IP或域名的定义规则。并且可以配置多个 endpoint,默认解析到第一个 endpoint,如果第一个 endpoint 没有返回数据,则自动切换到第二个 endpoint,以此类推。
比如以下配置示例:
mirrors: "172.31.6.200:5000": endpoint: - "http://172.31.6.200:5000" "rancher.ksd.top:5000": endpoint: - "http://172.31.6.200:5000" "docker.io": endpoint: - "https://fogjl973.mirror.aliyuncs.com" - "http://registry-1.docker.io"可以通过 crictl pull 172.31.6.200:5000/library/alpine 和 crictl pull rancher.ksd.top:5000/library/alpine获取到镜像,但镜像都是从同一个仓库获取到的。
root@rancher-server:/etc/rancher/k3s# systemctl restart k3s.service root@rancher-server:/etc/rancher/k3s# crictl pull 172.31.6.200:5000/library/alpine Image is up to date for sha256:a24bb4013296f61e89ba57005a7b3e52274d8edd3ae2077d04395f806b63d83e root@rancher-server:/etc/rancher/k3s# crictl pull rancher.ksd.top:5000/library/alpine Image is up to date for sha256:a24bb4013296f61e89ba57005a7b3e52274d8edd3ae2077d04395f806b63d83e root@rancher-server:/etc/rancher/k3s# 非安全(http)私有仓库配置配置非安全(http)私有仓库,只需要在 endpoint 中指定 http 协议头的地址即可。
在没有 TLS 通信的情况下,需要为 endpoints 指定 ,否则将默认为 https。
无认证如果你使用的是非安全(http)私有仓库,那么可以通过下面的参数来配置 K3s 连接私有仓库:
root@ip-172-31-13-117:~# cat >> /etc/rancher/k3s/registries.yaml <<EOF mirrors: "172.31.6.200:5000": endpoint: - "http://172.31.6.200:5000" EOF systemctl restart k3s然后可以通过 crictl 去 pull 镜像:
root@ip-172-31-13-117:~# crictl pull 172.31.6.200:5000/my-ubuntu Image is up to date for sha256:9499db7817713c4d10240ca9f5386b605ecff7975179f5a46e7ffd59fff462ee接下来,在看一下 containerd 的配置,可以看到文件末尾追加了如下配置:
root@ip-172-31-13-117:~# cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml [plugins.cri.registry.mirrors] [plugins.cri.registry.mirrors."172.31.6.200:5000"] endpoint = ["http://172.31.6.200:5000"] [plugins.cri.registry.mirrors."rancher.ksd.top:5000"] endpoint = ["http://172.31.6.200:5000"] 有认证如果你的非安全(http)私有仓库带有认证,那么可以通过下面的参数来配置 k3s 连接私有仓库:
mirrors: "35.182.134.80": endpoint: - "http://35.182.134.80" configs: "35.182.134.80": auth: username: admin # this is the registry username password: Harbor12345 # this is the registry password EOF systemctl restart k3s通过 crictl 去 pull 镜像:
root@ip-172-31-13-117:~# crictl pull 35.182.134.80/ksd/ubuntu:16.04 Image is up to date for sha256:9499db7817713c4d10240ca9f5386b605ecff7975179f5a46e7ffd59fff462ee