【问题标题】:Docker/Kubernetes - failed to pull image from local repositoryDocker/Kubernetes - 无法从本地存储库中提取图像
【发布时间】:2020-03-01 20:19:24
【问题描述】:

我对 docker/kubernetes 很陌生。我在我的 AWS EC2 实例上构建了一个 docker 映像,我可以使用它来运行

sudo docker run imagename

这运行成功。当我运行时,我还可以看到图像存在于本地 docker 存储库中

sudo docker image ls

(注意:我必须使用 sudo 否则这些命令会给出权限错误)

现在我正在尝试让 kubernetes 启动一项使用该图像创建容器的工作,但是当我这样做时,我收到以下错误:

Failed to pull image "imagename": rpc error: code = Unknown desc = Error response from daemon: pull access denied for imagename, repository does not exist or may require 'docker login'

这是我用来尝试使用 kubernetes API 创建作业的 Python/flask 代码。该作业在服务器上成功创建,但是当我检查 kubernetes 日志时,我看到了错误。

config.load_kube_config()
api_client = client.BatchV1Api()

container = client.V1Container(
    name="premium",
    image="imagename",
    resources=client.V1ResourceRequirements(requests={'cpu':'.9'}, limits={'cpu':'2'}),
    env=[client.V1EnvVar(name='dataset', value=ds )]
    )

# Create and configurate a spec section
template = client.V1PodTemplateSpec(
    metadata=client.V1ObjectMeta(labels={"app": "premium"}),
    spec=client.V1PodSpec(restart_policy="Never", containers=[container]))

# Create the specification of deployment
spec = client.V1JobSpec(
    template=template,
    backoff_limit=4)

# Instantiate the job object
job = client.V1Job(
    api_version="batch/v1",
    kind="Job",
    metadata=client.V1ObjectMeta(generate_name = 'premium-job-'),
    spec=spec)

api_response = api_client.create_namespaced_job("default", job, pretty=True)

【问题讨论】:

  • 您的集群是否有权从您将其推送到的存储库中拉取此图像?
  • 它们在同一台服务器上,所以我认为是这样,但我不知道如何检查。我没有将存储库推送到任何地方,它只是在 EC2 实例上,通过运行sudo docker images ls 很明显。这就是我试图从中拉出来的地方。
  • docker image ls 显示您的 local 机器上的内容。 kubernetes 从镜像仓库中拉取
  • 因此,如果映像存在于 EC2 实例(本地)上,并且我的 kubernetes 运行在同一个实例上,我该如何弥补这一差距?我必须将它推送到外部存储库才能拉取它吗?
  • AWS 有一个您可以推送到的注册表。一般来说,为了启动一个 pod,它必须从注册表中提取。

标签: python docker flask kubernetes


【解决方案1】:

我假设 Docker 镜像在 Kubernetes 集群的所有节点上都可用。该图像应在所有节点上可用/您需要提及nodeSelector 属性。在您的图像所在的完全相同的节点上运行 pod。

现在来解决您的错误。我在本地图像中看到了类似的问题。 imagePullPolicy pod 的属性在这里出现问题。它的默认值是always,这意味着它k8s(更具体地说是kubelet)尝试拉取图像来拉取图像它尝试进行docker登录(可能只是为了比较远程和本地图像)并且失败了。

如何解决问题?将imagePullPolicy 设置为ifNotPresentnever,这样它就不会尝试拉取图像(也不会尝试进行docker 登录)。

read more here

我给出了一个独立 pod 的指针。对于工作来说应该是一样的。毕竟,它只在 pod 中运行。

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 2021-12-10
    • 2021-01-05
    • 1970-01-01
    • 2023-03-07
    • 2018-12-25
    • 1970-01-01
    • 2017-07-05
    相关资源
    最近更新 更多