Containerd容器运行时的私有仓库镜像推送push和镜像拉取问题解决

本文记录了在使用Contanerd时遇到的私有仓库镜像推送push和拉取pull的问题及解决方案。在推送镜像时,nerdctl命令出现错误,通过修改containerd配置并使用ctr命令可以成功推送。而在拉取镜像时,crictl命令报错,同样通过更新containerd配置后,crictl能够正常拉取镜像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文记录Contanerd容器运行时,进行私有仓库的构建过程中,进行image镜像的推送push,和image镜像拉取的问题记录和解决方案

1. 镜像推送push问题

问题记录如下

使用nerdctl命令往私有仓库推送镜像,出现的问题如下

[root@k8s-master ~]# nerdctl push 192.168.23.160:5000/flink:1.15.0-scala_2.12-wordcount
manifest-sha256:23a421d7ea703af6c659c09d5abefe9f8c629493649c096483688a19bb266610: waiting        |--------------------------------------| 
layer-sha256:9fb5b36aafb93bcc52f03dd17cf420f6be4b081172eb13164563f5b20b374a59:    waiting        |--------------------------------------| 
config-sha256:8c6b3c27cc675895f9c28934a311ed8974202056b0564855e6960efc5bd22f6e:   waiting        |--------------------------------------| 
layer-sha256:67e8aa6c8bbc76b1f2bccb3864b0887671833b8667dc1f6c965fcb0eac7e6402:    waiting        |--------------------------------------| 
layer-sha256:627e6c1e105548ea4a08354eea581f137cf368d91aeb0ad47dcb706fca54fd8b:    waiting        |--------------------------------------| 
layer-sha256:0670968926f6461e3135c82ba2c0ad3ebdedc0d0f41b18bda4a1e41104b8be8a:    waiting        |--------------------------------------| 
layer-sha256:65e458027cc21c1550d8d2ca4b36cd45889abb22dc7945f460014254e4276c6a:    waiting        |--------------------------------------| 
layer-sha256:6e07b100903dfabd0c5ee512f754810fee8af4d6189459d873c8753a98663ad7:    waiting        |--------------------------------------| 
layer-sha256:bbf92622a61b817a7696e452f66d238710c0e7722f6fed7d0d8f4e224762a0a5:    waiting        |--------------------------------------| 
layer-sha256:e10b6fee624561f4f50bf5fd09c7734c75f559c8ba430bad0b6d756c62bb8e9e:    waiting        |--------------------------------------| 
layer-sha256:9f2d839593974441b014c89a092d74a6ed980bd8a5e558f29dce564926329620:    waiting        |--------------------------------------| 
layer-sha256:7a37825ce891ec0855e3992d806c99d2d9205b506e08b87d7ff466f805f3649a:    waiting        |--------------------------------------| 
layer-sha256:ddd741668e8e73c8ea5740c2a3a629f9b02b27e7ccb3de2eed1c990b6e0c48f1:    waiting        |--------------------------------------| 
layer-sha256:b4bbe30ab5e7a617dd4a2bedb493aa64be2da5ef624a6866b4d98be4aa832704:    waiting        |--------------------------------------| 
layer-sha256:e18ab33fd60ec489b647dc68b1f4250de47b21f35c96af95d47c175e2224abf7:    waiting        |--------------------------------------| 
layer-sha256:42daf0f51ba307f3cca3912bb9728600f197db66d624c2f60bc0077e056755c3:    waiting        |--------------------------------------| 
elapsed: 0.1 s                                                                    total:   0.0 B (0.0 B/s)                                         
FATA[0000] failed to do request: Head "https://192.168.23.160:5000/v2/flink/blobs/sha256:9fb5b36aafb93bcc52f03dd17cf420f6be4b081172eb13164563f5b20b374a59": http: server gave HTTP response to HTTPS client 
[root@k8s-master ~]#

向/etc/containerd/config.toml配置添加如下新的endpoint配置,然后重启containerd服务。也无法解决

......省略部分......
    [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."192.168.23.160:5000"]
          endpoint = ["http://192.168.23.160:5000"]
    [plugins."io.containerd.grpc.v1.cri".image_decryption]
      key_model = ""
    [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
......省略部分......

解决办法

可以通过ctr命令进行镜像推送,这样推送就不会出现问题了

[root@k8s-master ~]# ctr images push --plain-http=true 192.168.23.160:5000/flink:1.15.0-scala_2.12-wordcount
manifest-sha256:23a421d7ea703af6c659c09d5abefe9f8c629493649c096483688a19bb266610: done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:9fb5b36aafb93bcc52f03dd17cf420f6be4b081172eb13164563f5b20b374a59:    done           |++++++++++++++++++++++++++++++++++++++| 
config-sha256:8c6b3c27cc675895f9c28934a311ed8974202056b0564855e6960efc5bd22f6e:   done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:67e8aa6c8bbc76b1f2bccb3864b0887671833b8667dc1f6c965fcb0eac7e6402:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:627e6c1e105548ea4a08354eea581f137cf368d91aeb0ad47dcb706fca54fd8b:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:0670968926f6461e3135c82ba2c0ad3ebdedc0d0f41b18bda4a1e41104b8be8a:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:65e458027cc21c1550d8d2ca4b36cd45889abb22dc7945f460014254e4276c6a:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:6e07b100903dfabd0c5ee512f754810fee8af4d6189459d873c8753a98663ad7:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:bbf92622a61b817a7696e452f66d238710c0e7722f6fed7d0d8f4e224762a0a5:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:e10b6fee624561f4f50bf5fd09c7734c75f559c8ba430bad0b6d756c62bb8e9e:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:9f2d839593974441b014c89a092d74a6ed980bd8a5e558f29dce564926329620:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:7a37825ce891ec0855e3992d806c99d2d9205b506e08b87d7ff466f805f3649a:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:ddd741668e8e73c8ea5740c2a3a629f9b02b27e7ccb3de2eed1c990b6e0c48f1:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:b4bbe30ab5e7a617dd4a2bedb493aa64be2da5ef624a6866b4d98be4aa832704:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:e18ab33fd60ec489b647dc68b1f4250de47b21f35c96af95d47c175e2224abf7:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:42daf0f51ba307f3cca3912bb9728600f197db66d624c2f60bc0077e056755c3:    done           |++++++++++++++++++++++++++++++++++++++| 
elapsed: 5.9 s                                                                    total:  537.3  (91.1 MiB/s)                                      
[root@k8s-master ~]#

2. 镜像拉取pull问题

问题记录

通过crictl为k8s拉取镜像,会出现rpc错误,如下所示

[root@k8s-master ~]# crictl pull 192.168.23.160:5000/flink:1.15.0-scala_2.12-wordcount
E0527 19:13:48.191793   32946 remote_image.go:218] "PullImage from image service failed" err="rpc error: code = Unknown desc = failed to pull and unpack image \"192.168.23.160:5000/flink:1.15.0-scala_2.12-wordcount\": failed to resolve reference \"192.168.23.160:5000/flink:1.15.0-scala_2.12-wordcount\": failed to do request: Head \"https://192.168.23.160:5000/v2/flink/manifests/1.15.0-scala_2.12-wordcount\": http: server gave HTTP response to HTTPS client" image="192.168.23.160:5000/flink:1.15.0-scala_2.12-wordcount"
FATA[0000] pulling image: rpc error: code = Unknown desc = failed to pull and unpack image "192.168.23.160:5000/flink:1.15.0-scala_2.12-wordcount": failed to resolve reference "192.168.23.160:5000/flink:1.15.0-scala_2.12-wordcount": failed to do request: Head "https://192.168.23.160:5000/v2/flink/manifests/1.15.0-scala_2.12-wordcount": http: server gave HTTP response to HTTPS client 
[root@k8s-master ~]#

解决办法
向/etc/containerd/config.toml配置添加如下新的endpoint配置,然后重启containerd服务

......省略部分......
    [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."192.168.23.160:5000"]
          endpoint = ["http://192.168.23.160:5000"]
    [plugins."io.containerd.grpc.v1.cri".image_decryption]
      key_model = ""
    [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
......省略部分......

再次拉取镜像,就可以拉取了,如下所示:

[root@k8s-master ~]# crictl pull 192.168.23.160:5000/flink:1.15.0-scala_2.12-wordcount
Image is up to date for sha256:8c6b3c27cc675895f9c28934a311ed8974202056b0564855e6960efc5bd22f6e
[root@k8s-master ~]#
<think>嗯,用户想知道怎么用containerd镜像推送到Harbor私有仓库。我之前可能回答过类似的问题,不过需要仔细想想步骤是否正确。首先,containerd默认使用ctr命令管理镜像,但用户可能更熟悉docker,所以也许需要提到nerdctl作为替代工具。 首先,用户需要安装配置containerd。可能得确认containerd是否已经安装,如果是从Docker安装的,可能已经自带。然后配置/etc/containerd/config.toml,启用CRI插件并配置Harbor的镜像仓库地址。特别是对于自签名的HTTPS仓库,需要添加insecure_skips部分,否则可能会遇到证书错误。 接下来,如何修改镜像标签。使用ctr命令公共镜像,然后重新打标签,指向Harbor的地址。比如,将alpine:latest标记为harbor.example.com/library/alpine:latest。这里要注意Harbor的项目结构,比如library是默认项目,用户可能需要根据实际项目调整路径。 然后是登录认证的问题。Harbor需要认证,所以需要生成认证文件。ctr没有直接登录命令,需要手动创建auth.json文件,放在用户的.docker目录或者配置文件中指定的路径。需要提醒用户注意用户名密码的安全,或者使用其他认证方式比如机器人账户。 推送镜像候,使用ctr image push命令,可能需要带上--plain-http参数如果Harbor没有配置HTTPS。但最好建议用户配置HTTPS,因为insecure方式不安全,适合测试环境。生产环境应该正确配置证书。 另外,用户可能更习惯使用nerdctl,因为它更接近docker的命令行工具。安装nerdctl后,可以用nerdctl loginnerdctl push,这样步骤更简单,适合从docker转过来的用户。这部分可以作为替代方案提供,让用户选择方便的工具。 常见问题方面,证书错误是常见的,特别是自签名证书。需要确保containerd信任该证书,或者配置insecure。权限问题的话,用户可能没有正确设置Harbor项目的权限,或者认证信息有误。网络问题需要检查Harbor服务是否可达,防火墙设置等。 最后生成相关问题,需要覆盖镜像管理工具的比较,安全配置,Harbor项目权限,以及containerd与Kubernetes的集成。这些扩展问题可以帮助用户进一步了解相关主题,解决可能遇到的更深层次问题。 需要确保步骤中的命令正确无误,特别是路径占位符替换成用户的实际Harbor地址项目名。另外,提醒用户根据实际情况调整配置,比如如果不是自签名证书,就不需要跳过验证。总的来说,分步骤讲解,提供两种工具的选择,并覆盖常见问题,应该能有效解决用户的需求。</think>### 使用containerd推送镜像到Harbor私有仓库的步骤 #### 1. **安装与配置containerd** - 确保已安装`containerd`并启用CRI插件。若使用Docker作为运行containerd可能已默认安装。 - 修改containerd配置文件`/etc/containerd/config.toml`,添加Harbor仓库地址(若使用自签名HTTPS证书需配置`insecure_skip_verify`): ```toml [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.example.com"] endpoint = ["https://harbor.example.com"] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.example.com".tls] insecure_skip_verify = true # 仅用于自签名证书测试环境[^2] ``` - 重启服务:`systemctl restart containerd` #### 2. **并标记镜像** - 使用`ctr`命令公共镜像并重新标记为Harbor地址: ```bash ctr image pull docker.io/library/alpine:latest ctr image tag docker.io/library/alpine:latest harbor.example.com/library/alpine:latest ``` #### 3. **配置Harbor认证** - 创建认证文件`~/.docker/config.json`(或`/root/.docker/config.json`): ```json { "auths": { "harbor.example.com": { "auth": "base64(username:password)" } } } ``` - 生成base64编码:`echo -n 'username:password' | base64` #### 4. **推送镜像到Harbor** - 使用`ctr image push`命令(需指定`--platform`参数): ```bash ctr image push --platform linux/amd64 harbor.example.com/library/alpine:latest ``` - 若使用HTTP而非HTTPS,需添加`--plain-http`参数[^3]。 #### 5. **验证推送结果** - 登录Harbor Web界面,检查`library`项目中是否包含`alpine:latest`镜像。 --- ### 替代方案:使用`nerdctl` 若已安装`nerdctl`(兼容Docker CLI的工具): 1. 登录Harbor: ```bash nerdctl login harbor.example.com --username admin --password Harbor12345 ``` 2. 标记并推送镜像: ```bash nerdctl tag alpine:latest harbor.example.com/library/alpine:latest nerdctl push harbor.example.com/library/alpine:latest ``` --- ### 常见问题排查 - **证书错误**:确保Harbor的CA证书被系统信任,或配置`insecure_skip_verify`(仅限测试环境)。 - **权限不足**:检查Harbor用户是否对目标项目有`推送`权限。 - **网络不通**:验证`curl -k https://harbor.example.com/v2/`是否返回API版本信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值