如何在 kubernetes 部署中使用本地 docker 图像(不是 minikube)

How to use local docker images in kubernetes deployments (NOT minikube)

我有一个使用 kubeadm(不是 minikube)安装了 kubernetes 的虚拟机。 VM 充当集群的单个节点,删除了污点以允许它充当主节点和工作节点(如 kubernetes 文档中所示)。 我已将我的 app:test 图像保存、传输并加载到其中。我可以使用 docker 运行 轻松 运行 一个容器。 它出现在我 运行 sudo docker images.

当我创建一个使用此图像的 deployment/pod 并指定 Image-PullPolicy: IfNotPresentNever 时,我仍然出现 ImagePullBackoff 错误。 describe 命令显示它试图从 dockerhub...

拉取图像

请注意,当我尝试使用因创建另一个 pod 而被 拉取的本地图像时,ImagePullPolicies 似乎有效,没问题。尽管当我 运行 sudo docker images --all.

image 没有出现

如何在 kubernetes 中为 pods 使用本地镜像?有没有不使用私有存储库的方法?

您的集群被封装在您的 VM 中,因此对于该 VM 中的该集群,您所谓的本地始终是远程的。 kubernetes 试图拉取这些图像的原因是因为它无法在 VM 中找到它们。

Dockerhub 是下载容器的默认位置,但您可以将 kubernetes 设置为从 aws(ECR)、azure(ACR)、github 包(GCR)和您自己的私人服务器中提取。

您有大约 100 种方法来解决这个问题,none 其中很简单或会奏效。

1 - 最简单,将您的图像推送到 Dockerhub,然后让您的集群从中拉取。

2 - 设置本地私有容器注册表并设置您的 kubernetes VM 从中提取 (see this)

3 - 在您的 kubernetes 集群中设置私有容器注册表,并在您的本地环境中设置脚本以推送到它 (see this)

image doesn't appear when i run sudo docker images --all

根据您的评论,您使用的是 K8s v1.22,这意味着您的集群可能正在使用 containerd 容器运行时而不是 docker(您可以使用 kubectl get nodes -o wide,并查看最后一列)。

尝试使用 crictl images 列出您的图像并使用 crictl pull <image_name> 拉取以在节点上预加载图像。

如果使用 containerd,可以结合使用 crictl 和 ctr。

TLDR: these steps, which are also described in the crictl github documentation:

1- 在节点(在我的例子中是一个虚拟机)上获得图像后,确保它在存档中 (.tar)。您可以使用 docker savectr image export 命令执行此操作。

2- 在与存档图像相同的目录中使用 sudo ctr -n=k8s.io images import myimage.tar 将其添加到 kubernetes 用于跟踪其图像的名称空间中的 containerd。它现在应该在您 运行 sudo crictl images.

时出现

按照建议,我尝试使用 crictl 列出图像,但我的 app:test 没有出现。但是,尝试通过 crictl 导入我的本地图像似乎也没有用。我使用了 crictl pull app:test 并显示了以下错误消息:

FATA[0000] pulling image failed: rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/app:test": failed to resolve reference "docker.io/library/app:test": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed.

但是,当关注 these steps, my image is finally recognized as an existing local image in kubernetes. They are actually the same as suggested in the crictl github documentation

如何解释这一点?图像如何在 kubernetes 集群中“注册”?为什么 crictl 无法导入图像?我可能 post 另一个问题要问...