我有一个使用kubeadm(而不是minikube)安装了kubernetes的VM。该VM充当集群的单个节点,删除了污点,以允许它同时充当主节点和工作节点(如kubernetes文档中所示)。我已经在其中保存、传输和加载了my app:test 映像。我可以使用docker run轻松地运行带有它的容器。当我运行 sudo docker images 时,它会显示出来。
创建使用此映像的部署/pod并指定 Image-PullPolicy时:IfNotPresent 或 Never,我仍然有 ImagePullBackoff 错误。描述命令显示它试图从dockerhub拉取图像...
注意,当我尝试使用 * 由于创建另一个pod而被拉取的本地映像 * 时,ImagePullPolicies似乎可以工作,没有问题。尽管 * 映像在我运行sudo docker images --all* 时没有出现。
如何在kubernetes中使用本地pod映像?有没有不使用私有存储库的方法?
4条答案
按热度按时间u91tlkcl1#
当我运行sudo
docker images --all
时,图像不出现根据您的评论,您使用的是K8s v1.22,这意味着您的集群可能使用的是
containerd
容器运行时,而不是docker
(您可以使用kubectl get nodes -o wide
进行检查,并查看最后一列)。尝试使用
crictl images
列出图像,并使用crictl pull <image_name>
进行拉取,以便在节点上预加载图像。shstlldc2#
如果使用containerd,则可以使用crictl和ctr的组合来执行此操作。
1-在节点(在我的例子中是VM)上获得映像后,确保它在归档文件(. tar)中,可以使用
docker save
或ctr image export
命令来完成此操作。2-在与存档图像相同的目录中使用
sudo ctr -n=k8s.io images import myimage.tar
,将其添加到kubernetes用来跟踪其图像的名称空间中的containerd。现在,当您运行sudo crictl images
时,它应该会出现。按照建议,我尝试使用crictl列出图像,但我的app:test没有出现。然而,尝试通过crictl导入我的本Map像似乎也不起作用。我使用 * crictl pull app:test *,它显示以下错误消息:
FATA [0000]提取映像失败:rpc错误:代码=未知描述=无法提取和解压缩映像"www.example.com":无法解析引用"docker.io/library/app:test":docker.io/library/app:test服务器消息:作用域不足:授权失败。 insufficient_scope: authorization failed.
然而,当跟随these steps时,我的图像最终被识别为kubernetes中的现有本Map像,它们实际上与crictl github文档中建议的相同
如何解释这个问题?图片如何在kubernetes集群中注册?为什么crictl不能导入图片?我可能会发布另一个问题来问这个问题...
yhuiod9q3#
您的群集被封装在虚拟机中,因此您称为本地的内容对于该虚拟机中的群集来说始终是远程的。Kubernetes尝试拉取这些映像的原因是它在虚拟机中找不到这些映像。
Dockerhub是默认的容器下载位置,但是你可以设置kubernetes从aws(ECR)、azure(ACR)、github软件包(GCR)和你自己的私有服务器上下载。
你有大约100种方法来解决这个问题,没有一种是简单的或有效的。
1 -最简单,将您的图像推送到Dockerhub,让您的群集从中提取。
2 -设置本地私有容器注册表并将kubernetes虚拟机设置为从其中提取(see this)
3 -在kubernetes集群中设置私有容器注册表,并在本地env中设置脚本以将其推送到(see this)
qv7cva1a4#
这是另一个对我有效的解决方案。
最简单的解决方案是安装podman并加载镜像。我在manjaro上运行,使用CRI-O作为我的CRI和kubeadm。
保存你的图像从docker到一个.tar文件和加载图像从那里.(注意:运行podman与sudo是必要的)
运行时,它立即显示在图像寄存器中
像这样定义您的Kubernetes作业:
并开始作业