使用tar Docker镜像部署Kubernetes

5

我有一个关于通过kubernetes部署docker镜像的问题。

其中一个问题是,我们无法使用任何docker镜像仓库服务,例如docker hub或任何云服务。但是,是的,我有作为.tar文件的docker镜像。

然而,它总是会失败,出现以下消息:

Warning  Failed     1s         kubelet, dell20    

Failed to pull image "test:latest": rpc
error: code = Unknown
desc = failed to resolve image "docker.io/library/test:latest":
failed to do request: Head https://registry-1.docker.io/v2/library/test/manifests/latest: dial tcp i/o timeout

我还使用IfNotPresent或Never更改部署描述。在这种情况下,它仍将由于ErrImageNeverPull而失败。

我的猜测是:Kubernetes仍然尝试使用Docker Hub,因为它使用https://registry-1.docker.io来拉取镜像。我只想使用本地磁盘上的tar Docker镜像,而不是从某些服务中拉取。

是的,该镜像在Docker中:

docker images
REPOSITORY  TAG    IMAGE ID      CREATED     SIZE
test        latest 9f4916a0780c  6 days ago  1.72GB

有人可以对这个问题给我建议吗?


你使用docker load加载了图片吗? - Yonah Dissen
每个工作节点上都有图像吗? - Louis Baumann
你必须使用Docker加载图像。此外,它必须在你的节点上可用。 - Srini M
@YonahDissen 是的。 - zedoul
@LouisBaumann 不,只在主节点上。那么,我需要手动将图像复制并粘贴到主节点和工作节点上吗?我刚刚测试了一下,在工作节点内有图像,但是我遇到了相同的问题... - zedoul
是的,它必须加载到所有工作节点。如果您仍然遇到此错误,可能是您的镜像拉取策略为“Always”,每次 Pod 启动时都会尝试拉取镜像。附注 - 您可以在您的网络中部署一个私有的 Docker 注册表,这是在私有网络中管理此问题的正确方式。 - Eldad Assis
1个回答

8

我在Kubernetes集群中成功使用了本地镜像。以下是我的解释和示例:

唯一的前提条件是您需要确保可以直接上传该镜像到节点。

创建镜像

使用以下命令从Docker注册表中拉取默认的Nginx镜像:

$ docker pull nginx:1.17.5

Nginx镜像仅用于演示目的。

使用以下命令将此镜像标记为新名称nginx-local:

$ docker tag nginx:1.17.5 nginx-local:1.17.5

执行以下命令将此镜像保存为nginx-local.tar:

$ docker save nginx-local:1.17.5 > nginx-local.tar

文档链接:docker save

文件nginx-local.tar将用作您的镜像。

将镜像复制到所有节点

这种技术的问题在于您需要确保所有节点都有此镜像。
缺少镜像将导致Pod创建失败。

您可以使用scp进行复制。这是一种在机器之间传输文件的安全方式。
示例scp命令:

$ scp /path/to/your/file/nginx-local.tar user@ip_adddress:/where/you/want/it/nginx-local.tar

如果镜像已经在节点上,则需要使用以下命令将其加载到本地docker镜像存储库中: $ docker load -i nginx-local.tar 为确保镜像已加载,请运行以下命令: $ docker images | grep nginx-local 文档链接:docker load
应该会显示类似于此的内容:
docker images | grep nginx
nginx-local                                           1.17.5              540a289bab6c        3 weeks ago         126MB

使用本地镜像创建部署

最后一步是使用nginx-local镜像创建部署。

请注意:

  • 镜像版本在yaml文件中明确指定
  • ImagePullPolicy设置为NeverImagePullPolicy

如果没有这些选项,Pod的创建将失败。

以下是使用该镜像的示例部署:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-local
  namespace: default
spec:
  selector:
    matchLabels:
      run: nginx-local
  replicas: 5 
  template:
    metadata:
      labels:
        run: nginx-local
    spec:
      containers:
      - image: nginx-local:1.17.5
        imagePullPolicy: Never
        name: nginx-local
        ports:
        - containerPort: 80

使用以下命令创建此部署: $ kubectl create -f local-test.yaml 结果是成功创建了 Pod,如下所示:
NAME                           READY   STATUS    RESTARTS   AGE
nginx-local-84ddb99b55-7vpvd   1/1     Running   0          2m15s
nginx-local-84ddb99b55-fgb2n   1/1     Running   0          2m15s
nginx-local-84ddb99b55-jlpz8   1/1     Running   0          2m15s
nginx-local-84ddb99b55-kzgw5   1/1     Running   0          2m15s
nginx-local-84ddb99b55-mc7rw   1/1     Running   0          2m15s

这个操作已经成功完成,但我建议您使用本地的Docker仓库。这样做可以更方便地管理镜像,并且可以在您的基础架构内部完成。 有关此信息的文档链接: 本地Docker仓库

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