使用 tar docker 镜像部署 kubernetes

zed*_*oul 5 docker kubernetes

我在通过 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
Run Code Online (Sandbox Code Playgroud)

我还使用 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
Run Code Online (Sandbox Code Playgroud)

谁能给我关于这个问题的任何建议?

Daw*_*ruk 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
Run Code Online (Sandbox Code Playgroud)

如果节点上已有镜像,则需要使用以下命令将其加载到本地 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
Run Code Online (Sandbox Code Playgroud)

使用本地映像创建部署

最后一部分是使用 nginx-local 映像创建部署。

请注意:

  • 图像版本yaml 文件中显式输入。
  • ImagePullPolicy 设置为Never图片拉取策略

如果没有此选项,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
Run Code Online (Sandbox Code Playgroud)

使用命令创建此部署: $ 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
Run Code Online (Sandbox Code Playgroud)

此操作成功,但我建议您使用本地 docker 存储库。它将简化图像的管理过程,并将位于您的基础设施内。相关文档的链接: 本地 Docker 注册表