前 言
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" - "https://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.serviceroot@rancher-server:/etc/rancher/k3s# crictl pull 172.31.6.200:5000/library/alpineImage is up to date for sha256:24bb4013296f61e89ba57005a7b3e5274d8edd3ae207d04395f806b63d83eroot@rancher-server:/etc/rancher/k3s# crictl pull rancher.ksd.top:5000/library/alpineImage is up to date for sha256:24bb4013296f61e89ba57005a7b3e5274d8edd3ae207d04395f806b63d83eroot@rancher-server:/etc/rancher/k3s#
非安全(http)配置私有仓库配置非安全(http)只需要在私人仓库 endpoint 中指定 http 协议头的地址就够了。
在没有 TLS 在通信的情况下,需要通信 endpoints 指定http://,否则将默认为 https。
无认证
如果使用不安全,(http)私有仓库可以通过以下参数配置 K3s 连接私人仓库:
root@ip-172-31-13-117:~# crictl pull 172.31.6.200:5000/my-ubuntuImage is up to date for sha256:9499db771713c4d10240ca9f536b605ecff79779ff5a46e7fffd59efffffffeefffe462eee
然后就可以通过了 crictl 去 pull 镜像:
root@ip-172-31-13-117:~# crictl pull 172.31.6.200:5000/my-ubuntuImage is up to date for sha256:9499db771713c4d10240ca9f536b605ecff79779ff5a46e7fffd59efffffffeefffe462eee
接下来,再看一遍 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 连接私人仓库:
root@ip-172-31-13-117:~# cat >> /etc/rancher/k3s/registries.yaml <<EOFmirrors: "35.182.134.80": endpoint: - "http:/35.182.134.80configs: "35.182.134.80": auth: username: admin # this is the registry username password: Harbor12345 # this is the registry passwordEOFsystemctl restart k3s
通过 crictl 去 pull 镜像:
root@ip-172-31-13-117:~# cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml[plugins.cri.registry.mirrors][plugins.cri.registry.mirrors."35.182.134.80" endpoint = ["http://35.182.134.80[plugins.cri.registry.configs."35.182.134.80".auth] username = "admin" password = Harbor12345
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."35.182.134.80" endpoint = ["http://35.182.134.80"[plugins.cri.registry.configs."35.182.134.80".auth] username = "admin" password = Harbor12345
安全(https)配置私有仓库所有以下示例都使用了认证,所以每个示例都配备了configs.auth,如果实际环境未配置认证,删除configs.auth配置即可。
使用授信 ssl 证书
与非安全(http)私人仓库配置相似,只需要配置 endpoint 相应的仓库地址是 https 即可。
root@ip-172-31-13-117:~# crictl pull harbor.kingsd.top/ksd/ubuntu:16.04Image is up to date for sha256:9499db771713c4d10240ca9f536b605ecff79779ff5a46e7fffd59efffffffeefffe462eee
通过 crictl 去 pull 镜像:
root@ip-172-31-13-117:~# cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml[plugins.cri.registry.mirrors][plugins.cri.registry.mirrors."harbor.kingsd.top"] endpoint = ["https://harbor.kingsd.top"][plugins.cri.registry.configs."harbor.kingsd.top".auth] username = "admin" password = Harbor12345
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."harbor.kingsd.top"] endpoint = ["https://harbor.kingsd.top"][plugins.cri.registry.configs."harbor.kingsd.top".auth] username = "admin" password = Harbor12345
使用自签 ssl 证书
如果后端仓库使用自签名, ssl 需要配置证书 CA 证书 用于 ssl 验证证书。
root@ip-172-31-13-117:~# cat >> /etc/rancher/k3s/registries.yaml <<EOFmirrors: "harbor-ksd.kingsd.top": endpoint: - "https://harbor-ksd.kingsd.top"configs: "harbor-ksd.kingsd.top": auth: username: admin # this is the registry username password: Harbor12345 # this is the registry password tls: ca_file: /opt/certs/ca.crtEOFsystemctl restart k3s
通过 crictl 去 pull 镜像:
root@ip-172-31-13-117:~# crictl pull harbor-ksd.kingsd.top/ksd/ubuntu:16.04Image is up to date for sha256:9499db771713c4d10240ca9f536b605ecff79779ff5a46e7fffd59efffffffeefffe462eee
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."harbor-ksd.kingsd.top"] endpoint = ["https://harbor-ksd.kingsd.top"][plugins.cri.registry.configs."harbor-ksd.kingsd.top".auth] username = "admin" password = Harbor12345[plugins.cri.registry.configs."harbor-ksd.kingsd.top".tls] ca_file = "/opt/certs/ca.crt"
ssl 双向认证
如果镜像仓库配备了双向认证,则需要 containerd 配置 ssl 证书用于 镜像仓库对 containerd 做认证。
root@ip-172-31-13-117:~# crictl pull harbor-ksd.kingsd.top/ksd/ubuntu:16.04Image is up to date for sha256:9499db771713c4d10240ca9f536b605ecff79779ff5a46e7fffd59efffffffeefffe462eee
通过 crictl 去 pull 镜像:
root@ip-172-31-13-117:~# crictl pull harbor-ksd.kingsd.top/ksd/ubuntu:16.04Image is up to date for sha256:9499db771713c4d10240ca9f536b605ecff79779ff5a46e7fffd59efffffffeefffe462eee
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."harbor-ksd.kingsd.top"] endpoint = ["https://harbor-ksd.kingsd.top"][plugins.cri.registry.configs."harbor-ksd.kingsd.top".auth] username = "admin" password = Harbor12345[plugins.cri.registry.configs."harbor-ksd.kingsd.top".tls] ca_file = "/opt/certs/ca.crt" cert_file = "/opt/certs/harbor-ksd.kingsd.top.cert" key_file = "/opt/certs/harbor-ksd.kingsd.top.key"
加速器配置Containerd 与 docker 都有默认仓库,都是 docker.io 。假如配置中没有指定 mirror 为 docker.io,containerd 之后会自动加载 docker.io 配置。与 docker 不同的是,containerd 可以修改 docker.io 对应的 endpoint(默认为https://registry-1.docker.io),而 docker 无法修改。
Docker 中可以通过 registry-mirrors 如果设置镜像加速地址。 pull 镜像没有仓库地址(项目名+镜像名:tag),镜像将从默认的镜像仓库中拉出。如果配备了镜像加速地址,您将首先访问镜像加速仓库,如果您没有返回数据,然后访问默认的镜像仓库。
Containerd 现在还没有直接配置镜像加速功能, containerd 中可以修改 docker.io 对应的 endpoint,所以可以通过修改 endpoint 实现镜像加速下载。因为 endpoint 是轮询访问,所以可以给 docker.io 配置多个仓库地址来实现 加速地址+默认仓库地址。以下配置示例:
cat >> /etc/rancher/k3s/registries.yaml <<EOFmirrors: "docker.io": endpoint: - "https://fogjl973.mirror.aliyuncs.com" - "https://registry-1.docker.io"EOFsystemctl restart k3s
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."docker.io"] endpoint = ["https://fogjl973.mirror.aliyuncs.com", "https://registry-1.docker.io"]
完整配置示例
mirrors: "192.168.50.119": endpoint: - "http:/192.168.119 "docker.io": endpoint: - "https:/fogjl973.mirror.aliyuncs.com" - "https://registry-1.docker.io"configs: "192.168.50.119": auth: username: '' # this is the registry username password: '' # this is the registry password tls: cert_file: '' # path to the cert file used in the registry key_file: '' # path to the key file used in the registry ca_file: '' # path to the ca file used in the registry "docker.io": auth: username: '' # this is the registry username password: '' # this is the registry password tls: cert_file: '' # path to the cert file used in the registry key_file: '' # path to the key file used in the registry ca_file: '' # path to the ca file used in the registry