如何在Kubernetes部署中引用从tar文件加载的本地Docker镜像?

3

我正在尝试使用本地的Docker镜像创建Kubernetes部署。并且将imagePullPolicy设置为Never,以便Kubernetes从通过tar导入的本地Docker镜像中获取它。

环境

  •  SingleNodeMaster  # one node deployment
    

尽管本地docker镜像存在,但Kubernetes始终试图获取私有存储库。

请提供有关如何调试和解决问题的任何指针,以便Kubernetes将从本地docker注册表中选择镜像。谢谢。

执行的步骤

  • docker load -i images.tar
  • docker images # 显示来自myprivatehub.com/nginx/nginx-custom:v1.1.8的镜像
  • kubectl create -f local-test.yaml,图像拉取策略为Never

错误

Pulling  pod/nginx-custom-6499765dbc-2fts2   Pulling image "myprivatehub.com/nginx/nginx-custom:v1.1.8" 
Failed   pod/nginx-custom-6499765dbc-2fts2   Error: ErrImagePull   
Failed   pod/nginx-custom-6499765dbc-2fts2   Failed to pull image "myprivatehub.com/nginx/nginx-custom:v1.1.8": rpc error: code = Unknown desc = failed to pull and unpack image "myprivatehub.com/nginx/nginx-custom:v1.1.8": failed to resolve reference "myprivatehub.com/nginx/nginx-custom:v1.1.8": failed to do request: Head "https://myprivatehub.com/v2/nginx/nginx-custom/manifests/v1.1.8": dial tcp: lookup myprivatehub.com: no such host

docker pull <imagename>

Error response from daemon: Get https://myprivatehub.com/v2/: dial tcp: lookup myprivatehub.com on 172.31.0.2:53: no such host

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-custom
  namespace: default
spec:
  selector:
    matchLabels:
      run: nginx-custom
  replicas: 5 
  template:
    metadata:
      labels:
        run: nginx-custom
    spec:
      containers:
      - image: myprivatehub.com/nginx/nginx-custom:v1.1.8
        imagePullPolicy: Never
        name: nginx-custom
        ports:
        - containerPort: 80

我删除了我的回答,因为它没有解决你的问题。你可以将“docker pull <imagename>”的结果添加到问题中。 - P....
@P.... 将docker pull imagename的结果添加到问题中。请让我知道您的意见。谢谢。 - Mozhi
请查看此链接:https://docs.docker.com/registry/recipes/mirror/#how-does-it-work - P....
由于您在 docker images 中有镜像存在,尝试将策略从 never 更改为 IfNotPresent。不确定如何强制使用缓存。 - P....
@P... 我在问题中发布的相同问题出现了,它试图从注册表中获取而不是引用本地的Docker镜像。 - Mozhi
显示剩余2条评论
2个回答

2

这是由于容器运行时不同于Docker引起的。我正在使用containerd,将容器运行时切换到Docker后,它开始工作了。


1
很高兴你解决了这个问题,我们本应该从这里开始! - P....
@Mozhi,您能告诉我从containerd转换到docker的过程吗?我也遇到了同样的问题。执行"get nodes -o wide"命令返回的是"containerd://"而不是docker。 - Soumya
1
@Soumya,请按照此链接 https://kubernetes.io/docs/tasks/administer-cluster/migrating-from-dockershim/change-runtime-containerd/ 进行操作(不幸的是,我不完全记得我所做的步骤),但上述链接应该是一个很好的开始。谢谢。 - Mozhi

1
这是更新另一种实现类似结果的方法。在这种情况下,可以使用Docker Registry。 Docker Registry文档 我们可以在运行Kubernetes和docker的机器上创建一个Docker注册表。实现相同的最简单方法之一如下所示:
1. 创建本地私有Docker注册表。如果不存在registry:2镜像,则会下载并运行它。
sudo docker run -d -p 5000:5000 --restart=always --name registry registry:2
  1. 根据需要构建镜像或从tar文件中加载镜像。在我的例子中,我正在创建它以将其添加到本地仓库。
sudo docker build -t coolapp:v1 .

一旦构建完成,创建一个标签,使其表示主机和端口。
sudo docker tag coolapp:v1 localhost:5000/coolapp:v1

将新标签推送到本地私有仓库。
sudo docker push localhost:5000/coolapp:v1

现在在 Kubernetes 的 YAML 文件中,我们可以按照以下方式指定部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mycoolapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mycoolapp
  template:
    metadata:
      labels:
        app: mycoolapp
    spec:
      containers:
        - name: mycoolapp
          image: localhost:5000/coolapp:v1
          ports:
            - containerPort: 3000

我们使用YAML进行应用

sudo kubectl apply -f deployment.yaml

一旦完成这个步骤,我们就能看到 Kubernetes 已经从本地私有仓库拉取了镜像并且正在运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接