cri-containerd运行时使用私有镜像仓库

介绍

k8s缺省使用docker运行时,但是1.12.x开始支持使用containerd运行时,这样调用路径从原来的kubelet->dockershim->dockerd->containerd->runc-shim->runc 优化为kublet->cri->containerd->runc->shim->runc, 而且cri还是作为containerd的一个插件跑在一个进程空间,看起来是提高了性能,但是如果习惯于在节点用docker命令的话就不要切换了,或者只切换部分节点。
我就是只切换了一个节点作为实验,方法其实很简单,只是修改下kubelet的启动命令就好了,但是如果你是用的私有镜像仓库的话会碰到一些问题,这里我主要目的是记录下cri-containerd使用私有镜像仓库时碰到的问题。

从docker切换到containerd

修改kubelet的启动命令添加如下参数--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock

systemctl daemon-reload
systemctl restart kubelet

注意kubelet是通过/run/containerd/containerd.sock和containerd通信的,安装有docker(新一点的版本)的节点都会有个daemon进程,如果是全新没有安装docker的节点,只要先创建配置文件,然后手动或者以服务方式启动containerd进程即可。

containterd config default > /etc/containerd/config.toml, 
/usr/bin/conainerd

正常情况下如果你只是使用官方镜像库,pod就可以调度到这个使用containerd的节点了,但是如开头说的,如果是私有仓库,还有几个问题要解决

cri-containerd使用私有镜像仓库的注意事项

不支持使用plain-http的镜像仓库

现象是调度到该节点的pod都启动失败,kubectl describe pod/xxx 显示的出错信息server gave HTTP response to HTTPS client, 我是用docker registry搭建的简易本地仓库,没有启用tls, 很明显cri-containerd是希望ssl加密传输的,不过containerd本身是

<think>我们正在处理用户的问题:如何配置containerd以从私有仓库拉取镜像。用户提到私有仓库,可能是不安全的(HTTP)或需要认证的。根据引用资料,我们可以总结以下步骤:1.修改containerd的配置文件(通常位于/etc/containerd/config.toml),添加私有仓库的配置。-对于需要认证的私有仓库,需要在`[plugins."io.containerd.grpc.v1.cri".registry.configs]`下为私有仓库地址配置auth(用户名和密码)和tls(如果需要CA证书)。-对于不安全的HTTP仓库,需要配置tls部分为`insecure_skip_verify= true`,并且可能还需要在pull命令中使用`--plain-http`(但最好在配置中解决)。2.重启containerd服务。3.使用`ctr`命令测试拉取镜像,注意可能需要指定`--plain-http`(如果仓库是HTTP且未在配置中设置为安全)。但是,引用[1]中提到的问题是因为尝试从HTTP仓库拉取镜像而containerd默认使用HTTPS。因此,我们需要在配置中指定该仓库为不安全的。引用[3]提供了配置示例:```toml[plugins."io.containerd.grpc.v1.cri".registry][plugins."io.containerd.grpc.v1.cri".registry.configs][plugins."io.containerd.grpc.v1.cri".registry.configs."your-private-registry.com".auth]username ="your-username"password ="your-password"[plugins."io.containerd.grpc.v1.cri".registry.configs."your-private-registry.com".tls]insecure_skip_verify= true#或者如果是HTTP仓库,可以设置ca_file(如果仓库有自签名证书)或者设置insecure_skip_verify为true```另外,对于不安全的仓库(HTTP),我们还需要在`[plugins."io.containerd.grpc.v1.cri".registry.mirrors]`中为仓库地址设置端点,但更重要的是,我们需要在配置中告诉containerd该仓库使用HTTP协议。实际上,containerdCRI插件支持为每个仓库设置`tls`配置,其中`insecure_skip_verify`跳过证书验证,但并不能直接改变协议(HTTP还是HTTPS)。为了使用HTTP协议,我们需要在`mirrors`部分设置`endpoint`为`http://...`,并且还需要在`configs`中为这个仓库地址设置tls为不安全?更准确的做法是(参考containerd官方文档):-对于私有仓库,我们可以通过设置`endpoint`为HTTP地址来覆盖,然后在`configs`中配置认证和tls。但是,在引用[3]中,我们看到在pull使用了`--plain-http`选项,这表示在命令行中指定使用HTTP。但如果我们希望默认配置就支持,那么需要在配置文件中设置。实际上,containerd的配置中,我们可以为每个仓库设置一个mirror,并且指定协议。例如:```toml[plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."my-registry.com"]endpoint= ["http://my-registry.com"] ```这样,当拉取`my-registry.com`的镜像,就会使用HTTP。因此,完整的配置步骤:1.编辑`/etc/containerd/config.toml`文件。2.在`[plugins."io.containerd.grpc.v1.cri".registry]`部分下,配置`mirrors`和`configs`。-在`mirrors`中,为私有仓库地址设置一个端点,使用`http://`(如果是HTTP)或`https://`(如果是HTTPS但证书有问题,可以配合`insecure_skip_verify`)。-在`configs`中,为私有仓库地址设置认证信息(如果有)和tls配置(例如跳过验证)。示例配置(假设私有仓库地址为`private-registry.example.com`,使用HTTP协议,且需要用户名密码认证):```toml[plugins."io.containerd.grpc.v1.cri".registry][plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."private-registry.example.com"]endpoint= ["http://private-registry.example.com"][plugins."io.containerd.grpc.v1.cri".registry.configs][plugins."io.containerd.grpc.v1.cri".registry.configs."private-registry.example.com".auth]username= "your-username"password= "your-password"[plugins."io.containerd.grpc.v1.cri".registry.configs."private-registry.example.com".tls]insecure_skip_verify= true```注意:如果仓库使用HTTPS但证书是自签名的,可以将`endpoint`设置为`https://...`,并设置`insecure_skip_verify =true`。3.保存配置文件,然后重启containerd服务:```bashsudosystemctlrestart containerd```4.测试拉取镜像:```bashctrimages pull--plain-http private-registry.example.com/namespace/image:tag```注意:如果我们在配置文件中已经指定了端点使用HTTP,那么理论上可以不使用`--plain-http`。但是,如果配置没有生效,可以尝试加上这个选项。引用[1]中提到的错误“http:server gaveHTTP responseto HTTPSclient”就是因为客户端尝试使用HTTPS而服务器返回HTTP。因此,通过配置端点使用HTTP,就可以避免这个错误。另外,引用[4]提到了GPG签名验证错误,但这个问题与私有仓库的配置无关,而是镜像的签名问题。如果用户遇到类似问题,需要单独处理。最后,引用[5]提到了安装containerd,但版本不是最新的,用户应确保containerd版本足够新以支持所需的配置。因此,回答用户的问题,我们可以给出以下步骤:</think>### 配置 Containerd私有仓库拉取镜像 在 Containerd 中从私有仓库拉取镜像需完成以下配置步骤: --- #### 1. **修改 Containerd 配置文件** 编辑 `/etc/containerd/config.toml`,添加私有仓库认证信息: ```toml [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."your-registry.com".auth] # 替换为私有仓库地址 username = "your-username" password = "your-password" [plugins."io.containerd.grpc.v1.cri".registry.configs."your-registry.com".tls] insecure_skip_verify = true # 跳过 TLS 验证(仅限 HTTP 仓库) ``` > **关键参数说明**: > - `insecure_skip_verify = true`:适用于 HTTP 非安全仓库(解决 `http: server gave HTTP response to HTTPS client` 错误)[^1][^3]。 > -使用 HTTPS 自签名证书,需配置 `ca_file = "/path/to/ca.pem"`[^3]。 --- #### 2. **重启 Containerd 服务** ```bash sudo systemctl restart containerd ``` --- #### 3. **拉取私有镜像** 使用 `ctr` 命令拉取需显式指定协议: ```bash # 对于 HTTP 仓库 ctr image pull --plain-http your-registry.com/namespace/image:tag # 对于 HTTPS 仓库 ctr image pull your-registry.com/namespace/image:tag ``` > **注意**: > - `--plain-http` 标志强制使用 HTTP 协议(非安全仓库必需)[^3]。 > - 镜像地址需包含完整仓库域名(如 `your-registry.com/nginx:latest`)。 --- #### 常见问题排查 - **TLS 证书错误**: 若遇到 `Invalid GPG signature` 或证书错误,检查 `tls.ca_file` 是否指向有效 CA 证书[^4]。 - **配置未生效**: 确认 Containerd 版本 ≥1.5(旧版本配置路径不同)[^5]。 - **认证失败**: 检查 `username/password` 是否正确,或尝试使用 `crictl pull --creds` 测试认证[^3]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值