如何在kubernetes部署中使用本地Docker映像(非minikube)

ipakzgxi  于 2023-03-01  发布在  Kubernetes
关注(0)|答案(4)|浏览(373)

我有一个使用kubeadm(而不是minikube)安装了kubernetes的VM。该VM充当集群的单个节点,删除了污点,以允许它同时充当主节点和工作节点(如kubernetes文档中所示)。我已经在其中保存、传输和加载了my app:test 映像。我可以使用docker run轻松地运行带有它的容器。当我运行 sudo docker images 时,它会显示出来。
创建使用此映像的部署/pod并指定 Image-PullPolicy时:IfNotPresentNever,我仍然有 ImagePullBackoff 错误。描述命令显示它试图从dockerhub拉取图像...
注意,当我尝试使用 * 由于创建另一个pod而被拉取的本地映像 * 时,ImagePullPolicies似乎可以工作,没有问题。尽管 * 映像在我运行sudo docker images --all* 时没有出现。
如何在kubernetes中使用本地pod映像?有没有不使用私有存储库的方法?

u91tlkcl

u91tlkcl1#

当我运行sudo docker images --all时,图像不出现
根据您的评论,您使用的是K8s v1.22,这意味着您的集群可能使用的是containerd容器运行时,而不是docker(您可以使用kubectl get nodes -o wide进行检查,并查看最后一列)。
尝试使用crictl images列出图像,并使用crictl pull <image_name>进行拉取,以便在节点上预加载图像。

shstlldc

shstlldc2#

如果使用containerd,则可以使用crictl和ctr的组合来执行此操作。

    • TLDR:**these steps,在crictl github文档中也有描述:

1-在节点(在我的例子中是VM)上获得映像后,确保它在归档文件(. tar)中,可以使用docker savectr 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不能导入图片?我可能会发布另一个问题来问这个问题...

yhuiod9q

yhuiod9q3#

您的群集被封装在虚拟机中,因此您称为本地的内容对于该虚拟机中的群集来说始终是远程的。Kubernetes尝试拉取这些映像的原因是它在虚拟机中找不到这些映像。
Dockerhub是默认的容器下载位置,但是你可以设置kubernetes从aws(ECR)、azure(ACR)、github软件包(GCR)和你自己的私有服务器上下载。
你有大约100种方法来解决这个问题,没有一种是简单的或有效的。
1 -最简单,将您的图像推送到Dockerhub,让您的群集从中提取。
2 -设置本地私有容器注册表并将kubernetes虚拟机设置为从其中提取(see this)
3 -在kubernetes集群中设置私有容器注册表,并在本地env中设置脚本以将其推送到(see this)

qv7cva1a

qv7cva1a4#

这是另一个对我有效的解决方案。
最简单的解决方案是安装podman并加载镜像。我在manjaro上运行,使用CRI-O作为我的CRI和kubeadm。

sudo pacman -Sy podman

保存你的图像从docker到一个.tar文件和加载图像从那里.(注意:运行podman与sudo是必要的)

sudo podman load -i your-local-image.tar

运行时,它立即显示在图像寄存器中

sudo crictl images

像这样定义您的Kubernetes作业:

#local-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: local-job
spec:
  template:
    spec:
      containers:
      - name: local-img-pod
        image: localhost/<Your-image-tag> 
        command: ["./your-app-binary","parameter1"]
        imagePullPolicy: Never
      restartPolicy: Never
  backoffLimit: 4

并开始作业

kubectl apply -f local-job.yaml

相关问题