containerd拉取私库镜像失败(kubelet)

这篇具有很好参考价值的文章主要介绍了containerd拉取私库镜像失败(kubelet)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在跟着高塔老师的教程用二进制的方式搭建k8s

kubernetes v1.20.0     我没有使用最新的版本,是因为内部网络问题。

containerd  v1.5.2        之前并没有使用过,但对docker比较熟悉

我所处的环境是一个内网环境,无法连接互联网,更无法连接国际互联网,

内网环境下部署了Harbor(private registry),用作镜像仓库来使用,是以http形式来进行服务的,即 insecure registry,ip地址为192.168.1.8

还有6台虚拟机节点,分为 3台主节点(master)和3台工作节点(worker),而192.168.1.1为网关路由器地址,所以从2开始,2-4为master,5-7为worker

192.168.1.2/192.168.1.3/192.168.1.4/192.168.1.5/192.168.1.6/192.168.1.7

第12步骤部署CoreDNS部分出现了containerd无法拉取私库里面的镜像的问题。

首先我在自己的私库Harbor是存在沙箱镜像pause:3.2 ,我使用docker能正常拉取,说明我的Harbor是没有问题的。docker是由/etc/docker/daemon.json  insecure-registries :["192.168.1.8"]进行配置的。

当我安装高塔老师的步骤执行到:

$ kubectl get pods -l k8s-app=kube-dns -n kube-system --kubeconfig=admin.kubeconfig

一直会出现容器正在创建的状态,于是通过describe看一下具体问题。

执行如下命令后,具体错误为:

$ kubectl describe pod coredns-xxxx-xxx  -n kube-system --kubeconfig=admin.kubeconfig

第一个问题: 出现了kubelet去k8s.gcr.io/pause:3.5拉取镜像了,并没有去私库拉取镜像,导致沙箱镜像无法下载,也就是无法运行coreDNS镜像。

而我在内网的harbor pause镜像地址为: 192.168.1.8/kubernetes/pause:3.2

那如何解决这个问题呢? 

我一开始以为是出现的错误是由于kubelet的配置所在,所以重新找到高塔老师的文档,又看了一遍,没有发现蛛丝马迹。

然后又找到了containerd的官方文档,发现在默认生成的/etc/containerd/config.toml中包含了要拉取sandbox_image地址,也就是说containerd告诉kubelet去gcr.io拉取镜像,我们通过修改这个地址来让kubelet去我们的私库拉取镜像。

$ containerd config default > /etc/containerd/config.toml
[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    sandbox_image="k8s.gcr.io/pause:3.5"

下面是修改后的配置,然后重启三个worker节点的containerd

[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    sandbox_image="192.168.1.8/kubernetes/pause:3.2"
$ systemctl restart containerd

第二个问题:我继续通过kubectl descirbe命令来查看情况,这次的结果是地址确实变化了,但是还是没有从私库上拉取下来。

我找了很多文档,包括github的issues和discussions有不少人都遇到了这个问题,但是都没有一个详细的解决办法,尤其是看了这篇手册https://github.com/containerd/containerd/blob/release/1.5/docs/cri/registry.md,按照手册配置了半天,没有任何效果,有点浪费时间。

总结一下:无外乎就是修改config.toml里面的 insecure_skip_verify及在[plugins."io.containerd.grpc.v1.cri".registry]新增mirrors、auths或configs,但结果都是无效的。

并且issues的人 说ctr无法使用cri的config,也就是说config.toml是cri的配置,可以通过:

$ ctr images pull --plain-http  192.168.1.8/kubernetes/pause:3.2

进行拉取,但是kubelet并不认识ctr,是因为ctr没有实现cri接口,具体表现为:

$ ctr images pull --plain-http  192.168.1.8/kubernetes/pause:3.2

$ ctr images ls   //我们发现就有了这个镜像,但是当我们执行

$ crictl images   //并没有发现刚刚拉取下来的pause:3.2镜像

也就是还是无法让kubelet从私库拉取pause:3.2镜像的问题,都是如下错误:

Failed CreatePodSandBox 7s(x22 over 4m42s) kubelet Failed to create pod sandbox: rpc error: code=Unknown desc = failed to get sandbox image "192.168.1.8/kubernetes/pause:3.2" :failed to pull image "192.168.1.8/kubernetes/pause:3.2": failed to pull and unpack image "192.168.1.8/kubernetes/pause:3.2": failed to resolve reference "192.168.1.8/kubernetes/pause:3.2": failed to do request: Head "https://192.168.1.8/v2/kubernetes/pause/manifests/3.2": dial tcp 192.168.1.8:443: connect:connection refused 

我重新又找文档,又鏖战了一天的时间,发现在containerd:配置hosts 中有一个Bypass TLS Verification Example,我按照教程立刻配了一下,问题立刻解决。

解决方法为:

$ tree /etc/containerd/certs.d
/etc/containerd/certs.d
└── docker.io
    └── hosts.toml
$ cat /etc/containerd/certs.d/docker.io/hosts.toml
server = "https://docker.io"

[host."http://192.168.1.8:80"]
  capabilities = ["pull", "resolve","push"]
  skip_verify = true

还有就是修改你的config.toml中的192.168.1.8为docker.io ,对,你没看错,一定要修改这里。

[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    sandbox_image="docker.io/kubernetes/pause:3.2"

这是因为containerd已经设置了hosts,你可以理解为拦截器,将访问docker.io的链接替换为上面咱们hosts.toml里面设置的私库地址。

以后你的所有的私库中的镜像地址都不是 192.168.1.8/repo/image:version ,而是docker.io/repo/image:version 

也就是说更改的是你的yaml文件里面image镜像地址,改为docker.io/repo/image:version  ,但是harbor不用任何更改。

$ systemctl restart containerd

别忘重启所有worker节点。

参考链接:

1.高塔老师:kubernetes the hard way 

GitHub - kelseyhightower/kubernetes-the-hard-way: Bootstrap Kubernetes the hard way on Google Cloud Platform. No scripts.

2.containerd: 配置registry 

https://github.com/containerd/containerd/blob/release/1.5/docs/cri/registry.md 

3.containerd:配置hosts

 https://github.com/containerd/containerd/blob/release/1.5/docs/hosts.md文章来源地址https://www.toymoban.com/news/detail-484165.html

到了这里,关于containerd拉取私库镜像失败(kubelet)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 新版K8s:v1.28拉取Harbor仓库镜像以及本地镜像(docker弃用改用containerd,纯纯踩坑)

    使用Kuboard作为k8s集群的管理平台,Harbor作为镜像仓库,拉取Harbor镜像仓库的镜像运行。 从K8s1.24版本之后,k8s就逐渐弃用了docker,采用containerd来管理,这个很重要。 服务器 IP地址 备注 K8sMaster 192.168.2.138 kuboard,Master管理节点 K8sWorker01 192.168.2.139 Worker工作节点 K8sWorker02 192.168.

    2024年01月20日
    浏览(60)
  • K8S 自动拉取镜像失败,手动拉取镜像成功

    新创建的Deploy在创建Pod时成功,但Pod报错,提示拉取镜像失败。 通过ssh登录到具体的K8S node上,手动执行docker pull 命令,却能成功拉取到对应的镜像。 根本原因:具体的命名空间缺少imagePullSecrets,不同的命名空间不能直接使用default中的imagePullSecrets。 准备K8S环境时,仅在d

    2024年01月18日
    浏览(44)
  • docker pull拉取镜像失败问题解决

    docker pull Retrying in 1 second 问题解决办法: 使用阿里云加速器 1、首先进入阿里云的docker库https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 2、注册账号,并进入控制台管理; 3、选择镜像加速器选项,进入到镜像加速器选项,可以看到加速器地址,可以根据提示的修改步骤进行修

    2024年02月08日
    浏览(58)
  • docker pull 拉取失败,设置docker国内镜像

    最近在拉取nginx时,显示如下错误: Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: request canceled (Client.Timeout exceeded while awaiting headers) 。 这个的问题是 拉取镜像超时 ,通过检索发现可以通过 配置国内镜像的方式解决 ,镜像地址很多,这里只说阿里云的镜像地

    2024年04月17日
    浏览(50)
  • Docker拉取jdk8镜像失败解决方案

    Docker拉取jdk8失败解决方案 最近使用docker部署demo时,需要配置java环境变量,拉取jdk8时,拉取失败,本文记录解决方案: 拉取镜像时,使用的命令是: docker pull java:8 出现了以下情况 : 解决方案: 使用以下拉取命令即可: docker pull openjava:8 使用命令 docker images 查看镜像,可

    2024年02月11日
    浏览(50)
  • 初学K8s错误:本地镜像拉取失败!

    报错:Container image \\\"wangyanglinux/myapp:v1\\\" is not present with pull policy of Never 这个地方我报错,原因很简单,一个是对原理的理解还有欠缺,一方面是自己眼瞎看不见,日志里其实写得很清楚了,我们来看一下是什么原因:  我们这里的报错是说没有在本地找到此镜像,为什么呢?看

    2024年02月10日
    浏览(38)
  • 迁移kubelet、docker和containerd工作目录

    kubelet、docker和containerd 的工作目录默认都在 /var/lib 下。 但是我们学校实验室租的线上机器挂载在 / 的磁盘空间很小,挂载在 /mnt/data_mnt/ 的数据盘空间大。 应该是因为工作目录的原因,当 / 占用超过 80% 时, kubelet 会认为磁盘空间不足,因为 DiskPressure 而进入 NotReady 状态。

    2024年02月07日
    浏览(79)
  • 【容器运行时】一文理解 OCI、runc、containerd、docker、shim进程、cri、kubelet 之间的关系

    docker,containerd,runc,docker-shim 之间的关系 Containerd shim 进程 PPID 之谜 内核大神教你从 Linux 进程的角度看 Docker RunC 简介 OCI和runC Containerd 简介 从 docker 到 runC Dockershim究竟是什么 技术干货|Docker和 Containerd 的区别,看这一篇就够了 Docker,containerd,CRI,CRI-O,OCI,runc 分不清?

    2024年02月05日
    浏览(59)
  • Docker拉取镜像失败报错Error response from daemon: Get https://registry-1.docker.io解决办法

    无法拉取镜像的解决方法: 1、打开终端,sudo -i 输入密码。 2、打开 daemon.json(若没有自行创建) 3、写入以下内容: 4.重启docker设置生效: 5.docker info  看有没有生效 6.把114.114.114.114 换成8.8.8.8 添加 如下图所示

    2024年02月02日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包