首页 > 其他分享 >kubernetes镜像拉取失败解决方法 ErrImagePull

kubernetes镜像拉取失败解决方法 ErrImagePull

时间:2024-11-13 15:19:57浏览次数:1  
标签:kubernetes 拉取 密码 secret ErrImagePull 镜像 docker com

被这个问题卡住了最少一个下午的时间。。。。不过就当熟悉k8s的命令了吧。。。只能这么安慰自己了

最近在捣鼓k8s部署.net core的后端(我是在windows上部署docker desktop来做测试的),在拉取我阿里云镜像仓库的私有镜像,搞来搞去搞了好久都没用

dock pull registry.cn-hangzhou.aliyuncs.com/xxxx/servicea_repo 这个私有地址能拉取成功(意味着我的账号密码没输错)

一搜一堆的资料不说了,要注意  imagePullSecrets 这个值,要指定一个secret,要先用命令创建一个secret的资源,如下:

kubectl create secret docker-registry mysecretaliyun --docker-server=registry.cn-hangzhou.aliyuncs.com [email protected] --docker-password=abdecc!@#!>!~ 

坑点:我的密码包含了">"这个字符串,用命令创建secret的时候,">"这个字符串以及它后面的字符串会被忽略,也就是说我在命令行输入的密码是 abdecc!@#!>!~  但是被保存到他们的配置文件的值却是 abdecc!@#!>!~  ,所以会死活都没用,因为密码根本没对

验证保存在secret里面的密码和你实际是否有出入的方法:

你设定好secret后,使用命令:

kubectl get secret mysecretaliyun -o yaml

户出现一个json,把  .dockerconfigjson: 后面的base64的值复制下来,找一个base64解码工具解码一下这个值,就可以看到实际被保存的密码,我当初要是知道这么核对一下,我就不会卡住半天了,base64一解码就发现我的密码变为abdecc!@#! 而不是我原来输入的  abdecc!@#!>!~  

这个坑点在于要么不允许输入,允许输入就全盘接受,结果允许我输入直接截断我的输入,真的是神奇了,我估计是因为我是windows 部署的原因?没去linux系统上论证,反正windows上 > 符号以及它后面的字符串都被截断没设置进去了。

以下是找问题的时候,发现一篇文章介绍,就是跟着这篇文章去做的,一开始用chatgpt,chatgpt没有教我这么去验证(估计它也不知道密码会被截断),有一说一,chatgpt查资料是又快又准,除非遇到这种实在没办法的问题,才会用搜索引擎了,整体学k8s和docker,已经能打包自己镜像,上传镜像,k8s部署,Ingress访问等等,这些除了这个问题chatgpt没搞定,其他全部是chatgpt教的,真的没想过有一天会有这么一个好用的工具出现在这个世界上,让获取知识变得简单了很多很多(最起码写代码学代码又快又准了)

 

Docker Hub以及利用开源harbor项目搭建的镜像仓库服务,对于Docker Client发起的docker login、docker push、docker pull等命令都会做基本的用户认证, 最简单常用的认证方式就是Basic Auth,即在发起的http请求头中添加一个Authorization,其值为base64(username:password),当前Docker Client都是这么处理。

在Kubernetes中,Secret资源对象用来存储和管理一些敏感信息,比如密码、Auth Token以及SSH keys,把这些敏感信息放入Secret对象中,相对来说更安全更灵活。 Kubernetes可以通过环境变量、文件挂载等方式将Secret信息推到每一个Pod中,通过文件挂载形式还能使Secret在pod中实时更新,Kubernetes统一管理。

Kubernetes中调度Pod成功之后,则开始拉取指定镜像启动容器,在Deployment对象中有几个与镜像拉取相关的重要配置参数。

  • spec.template.spec.containers[n].image,容器启动时的镜像
  • spec.template.spec.imagePullSecrets,Secret中定义了镜像所在仓库的用户名密码
  • spec.template.spec.containers[n].imagePullPolicy,定义了镜像拉取策略

imagePullPolicy决定了是否发起镜像下拉请求,它的值范围Always、Never、IfNotPresent,默认为IfNotPresent,但标签为:latest的镜像默认为Always。

  • Always,不管宿主机上镜像是否存在,都会发起一次下拉镜像请求
  • Never,不管宿主机上镜像是否存在,都不会发起下拉镜像请求
  • IfNotPresent,如果宿主机上镜像不存在,则向仓库发起下拉镜像请求

在Kubernetes中执行应用部署命令之后,通过命令kubectl get pods查看pod状态时,经常会遇见Pod的状态是ErrImagePull或者ImagePullBackOff,出现这种情况就一步一步分析。

kube-system       monitor-6c7fdcd477-jvqjc                 0/1       ImagePullBackOff   0          1h
  1. 执行命令

    kubectl describe pod monitor-6c7fdcd477-jvqjc -n kube-system
    

    或者kubectl get events,查看是否能发现具体的错误信息,由于kubernetes中错误信息不是很明显,通常只会展示error。

  2. 在宿主机上执行docker login 检查用户名密码是否正确,接着执行docker pull imageId,操作均成功,表示镜像仓库服务正常。

  3. 由于kubernetes中的pod网络可能与宿主机网络不一致,进入某个kubernetes的pod中,可以通过部署curl的pod用于网络测试,检查镜像仓库地址是否预期一致,不一致请把镜像仓库正确的域名或者host配置在集群dns中。

  4. 查看应用部署中的deployment对应yaml中的imagePullPolicy,如果机器上无镜像,同时imagePullPolicy为Never,则镜像无法拉取。

  5. 查看deployment对应yaml中的imagePullSecrets,其中的name就是secret的名字,如果拉取的是私有镜像,imagePullSecrets是必须的,没有secret,拉取镜像时请求 仓库的http请求头Authorization则为空,仓库授权校验肯定不通过直接返回401错误,而kubernetes则可能直接显示error。 注意secret是区分namespace的,容器启动时都是使用当前容器所在pod的namespace中的secret,执行命令检查secret是否存在。

    kubectl get secret xxx -n kube-system -o yaml
    
  6. 当前namespace下对应的secret也存在,那就继续检查secret中的信息,取出上一步执行结果中显示的dockercfg字段对应的value值,应该是一长串base64编码的字符串, 类似eyJodWIua2NlLmtzeXVeikkskseYELSH8sse,解码看一下具体的信息。

    echo 'eyJodWIua2NlLmtzeXVeikkskseYELSH8sse' | base64 --decode
    

    解码之后数据(mock数据,并非真实数据)

    {"hub.test.company.com":{"username":"98766743","password":"somebaby","email":"localhost","auth":"xxeieESrweSXs="}}
    
    Copy

    检查用户名、密码是否正确,用户名密码正确,还要查看域名是否与image包含的域名一致,如果deployment对应的yaml中的image为hub.test2.company.com/nginx/nginx:1.12.1, 如果这样,即使用户名、密码正确,kubernetes也不会将Authorization放在请求仓库的http header中,也会导致镜像下载失败。 7. 发现secret中信息不对,则可以将该secret删除,然后重新创建,假设deployment中对应的imagePullSecrets中的name为hub.test.company.com.key。 删除secret

    kubectl delete secret hub.test.company.com.key -n kube-system
    

    新建secret

    kubectl create secret docker-registry hub.test.company.com.key -n kube-system --docker-server=hub.test.company.com  
    --docker-username=2380997 --docker-password=RABC123456 [email protected]
    
    Copy

    注意创建时没指定namespace,那么默认为default。secret创建成功之后,重新部署即可。

标签:kubernetes,拉取,密码,secret,ErrImagePull,镜像,docker,com
From: https://www.cnblogs.com/Jerseyblog/p/18543238

相关文章

  • Kubernetes基础——Kubectl指令原理
    一、查看指令1、查看所有namespaces下的pods信息kubectlgetpods-Akubectlgetpods-nkube-system2、查看所有pods的configmap文件kubectlgetcm-Akubectlgetcm-nkube-system 3、查看没有命名空间的资源kubectlapi-resources--namespaced=false4、查看使用......
  • Kubernetes
    基本概念用Docker进行容器化管理之后方便了很多,容器少的话,可以使用Shell脚本来管理。但随着容器越来越多,容器也越来越难以管理,项目架构也越来越复杂,如何管理和维护这些容器,就是Kubernetes要解决的问题。Kubernetes组件通过架构逐渐升级和演进的过程,一步步引入K8s中的......
  • 【模块一】kubernetes容器编排进阶实战之kubeadm部署kubernetes
    kubeadm部署kubernetes准备环境主机名IP地址k8s-master1        10.0.0.121k8s-node110.0.0.101k8s-node210.0.0.102k8s-node310.0.0.103注:提前安装好docker或者containerd环境安装kubeadm、kubectl、kubelet#分别在所有主机依次执行一下命令apt-getupdate&&......
  • VMware Tanzu CLI 1.5.0 - VMware Kubernetes 发新版的命令行工具
    VMwareTanzuCLI1.5.0-VMwareKubernetes发新版的命令行工具VMware构建、签名和支持的开源Kubernetes容器编排平台的完整分发版请访问原文链接:https://sysin.org/blog/vmware-tanzu-cli/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgVMwareTanzu命令行......
  • 【模块一】kubernetes容器编排进阶实战之containerd安装及nerdctl客户端⼯具
    安装containerdapt/yum安装#验证仓库版本[root@k8s-node3~]#apt-cachemadisoncontainerdcontainerd|1.7.12-0ubuntu2~22.04.1|https://mirrors.aliyun.com/ubuntujammy-updates/mainamd64Packagescontainerd|1.6.12-0ubuntu1~22.04.3|https://mirrors.aliyu......
  • 【模块一】kubernetes容器编排进阶实战之k8s基础概念
    kubernetes基本介绍kubernetes组件简介   -master:       主人,并不部署服务,而是管理salve节点。      后期更名为:controllplane,控制面板。         etcd:      2379(客户端通信)、2380(集群内部通信)         ......
  • Kubernetes 中实现 MySQL 的读写分离
    Kubernetes中实现MySQL的读写分离在Kubernetes中实现MySQL的读写分离,可以通过主从复制架构来实现。在这种架构中,MySQL主节点(Master)负责处理所有写操作,而MySQL从节点(Slave)负责处理所有读操作。下面是一个详细的步骤指南:步骤1:创建Kubernetes集群确保你有一个运行良......
  • 【K8S问题系列】Kubernetes Pod节点CrashLoopBackOff 状态【已解决】
    在Kubernetes中,Pod的状态为CrashLoopBackOff表示某个容器在启动后崩溃,Kubernetes尝试重启该容器,但由于持续崩溃,重启的间隔时间逐渐增加。下面将详细介绍CrashLoopBackOff状态的原因、解决方案及相关命令的输出解释。一、CrashLoopBackOff状态的详细介绍描述C......
  • 常见的Kubernetes面试题总结
    常见的Kubernetes面试题总结1、简述etcd及其特点etcd是CoreOS团队发起的开源项目,是一个管理配置信息和服务发现(servicediscovery)的项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于Go语言实现。特点:简单:支持REST风格的HTTP+JSONAPI安全:支持HTTPS方式的访问......
  • Kubernetes 备忘录
    Kubernetes备忘录Kubernetes备忘清单查看资源信息节点资源名称:nodes,缩写:no$kubectlgetno#显示所有节点信息#显示所有节点的更多信息$kubectlgetno-owide$kubectldescribeno#显示节点详情#以yaml格式,显示节点详情$kubectlget......