Docker kubernetes无法提取本地映像

Docker kubernetes无法提取本地映像,docker,kubernetes,docker-registry,Docker,Kubernetes,Docker Registry,我在一台机器上使用kubernetes进行测试,我已经从nginx docker映像构建了一个自定义映像,但是当我尝试在kubernetes中使用映像时,我得到了一个映像拉取错误 我的POD YAML 种类:吊舱 版本:v1 元数据: 名称:yumserver 标签: 名称:frontendhttp 规格: 容器: -姓名:myfrontend 图片:my/nginx:最新版本 端口: -集装箱港口:80 名称:“http服务器” 体积数量: -挂载路径:“/usr/share/nginx/ht

我在一台机器上使用kubernetes进行测试,我已经从nginx docker映像构建了一个自定义映像,但是当我尝试在kubernetes中使用映像时,我得到了一个映像拉取错误

我的POD YAML

种类:吊舱
版本:v1
元数据:
名称:yumserver
标签:
名称:frontendhttp
规格:
容器:
-姓名:myfrontend
图片:my/nginx:最新版本
端口:
-集装箱港口:80
名称:“http服务器”
体积数量:
-挂载路径:“/usr/share/nginx/html”
姓名:多年电价确定
你的秘密:
-姓名:myregistrykey
卷数:
-姓名:多年电价确定
persistentVolumeClaim:
索赔名称:myclaim-1
我的KUBERNETES命令

kubectl创建-f pod-yumserver.yaml

错误

kubectl描述pod yumserver
名称:yumserver
名称空间:默认值
图片:my/nginx:最新版本
节点:127.0.0.1/127.0.0.1
开始时间:2016年4月26日星期二16:31:42+0100
标签:name=frontendhttp
状态:待定
原因:
信息:
IP:172.17.0.2
控制器:
容器:
我的前端:
容器ID:
图片:my/nginx:最新版本
图像ID:
QoS层:
记忆:最佳努力
cpu:最佳努力
国家:等待
原因:错误
就绪:错误
重新启动计数:0
环境变量:
条件:
类型状态
准备错误
卷数:
多年电价确定:
类型:PersistentVolumeClaim(对同一命名空间中PersistentVolumeClaim的引用)
索赔名称:myclaim-1
只读:false
default-token-64w08:
类型:Secret(应填充此卷的密钥)
SecretName:default-token-64w08
活动:
子对象路径类型原因消息中的FirstSeen LastSeen计数
--------- --------    -----   ----            -------------           --------    ------          -------
13s 13s 1{default scheduler}正常调度已成功将yumserver分配给127.0.0.1
13s 13s 1{kubelet 127.0.0.1}警告丢失ClusterDNS kubelet未配置ClusterDNS IP,无法使用“ClusterFirst”策略创建Pod。退回到DNSDEFULT策略。
12s 12s 1{kubelet 127.0.0.1}spec.containers{myfrontend}正常拉取图像“my/nginx:latest”
8s 8s 1{kubelet 127.0.0.1}spec.containers{myfrontend}警告未能拉取映像“my/nginx:latest”:错误:找不到映像my/nginx:latest
8s 8s 1{kubelet 127.0.0.1}警告同步pod失败,跳过:无法使用ErrImagePull为“myfrontend”启动“StartContainer”:“错误:映像我的/nginx:未找到最新版本”

进一步分析
ErrImagePull
问题的最简单方法是使用ssh连接到节点,并尝试通过执行
docker pull my/nginx:latest
手动拉取映像。我从未在一台机器上设置过Kubernetes,但可以想象,由于某种原因,Docker守护进程无法从节点访问。徒手拉应该提供更多信息


所以你的机器上有图像。然而,它仍然试图从Docker Hub中提取图像,这可能不是您在单机设置中想要的。这是因为最新标记将imagePullPolicy设置为始终隐式。您可以尝试将其设置为IfNotPresent显式或更改为除latest之外的其他标记Timo Reimann 4月28日7:16

出于某种原因,Timo Reimann只是在上面发表了一条评论,但它肯定应该是这个问题的官方答案,所以我再次发布。

在建立您的形象之前运行eval$(minikube docker env)


完整答案:您是否在linux上使用minikube?你需要安装docker(我想),但你不需要启动它。Minikube会这么做的。尝试将KVM驱动程序与以下命令一起使用:

minikube start --vm-driver kvm
然后运行
eval$(minikube docker env)
命令以确保使用minikube docker环境。使用标签构建容器
build-t mycontainername:version.

如果然后键入
docker ps
,您应该会看到一堆minikube容器已经在运行。 kvm UTIL可能已经安装在您的计算机上,但可以在centos/rhel上这样安装:

yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python 
确保Docker Desktop中的“Kubernetes上下文”实际上是“Docker Desktop”(即,不是远程集群)


(右键单击Docker图标,然后在菜单中选择“Kubernetes”)

无论您是否使用minikube,该功能都应有效:

1) 启动本地注册表容器:

docker run -d -p 5000:5000 --restart=always --name registry registry:2
2) 执行
docker images
以查找本地映像的存储库和标记。然后为本地图像创建一个新标记:

docker tag <local-image-repository>:<local-image-tag> localhost:5000/<local-image-name>

就这样。现在您的ImagePullerError应该得到解决。

您需要做的只是从dockerfile执行docker构建,或者获取集群节点上的所有图像,执行适当的docker标记并创建清单

Kubernetes不会直接从注册表中提取。它首先在本地存储器上搜索图像,然后在docker注册表中搜索图像

  • 拉取最新的nginx图像

    docker pull nginx

    docker标签nginx:最新测试:test8970

  • 创建部署
    kubectl运行测试--image=test:test8970
    它不会转到docker注册表来提取图像。它会立即打开吊舱。

  • 如果本地计算机上不存在映像,它将尝试从docker注册表中提取映像,并失败,出现ErrImagePull错误。

  • 另外,如果更改imagePullPolicy:Never。它永远不会寻找注册表来提取映像,如果在er中找不到映像,它将失败
    docker tag <local-image-repository> localhost:5000/<local-image-name>
    
    docker push localhost:5000/<local-image-name>
    
    ...
    spec:
      containers:
      - name: <name>
        image: localhost:5000/<local-image-name>
        imagePullPolicy: IfNotPresent
    ...
    
    kind: Deployment
    metadata:
      labels:
        run: test
      name: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: test
      template:
        metadata:
          creationTimestamp: null
          labels:
            run: test
        spec:
          containers:
          - image: test:test8070
            name: test
            imagePullPolicy: Never
    
     spec:
      containers:
      - name: <name>
        image: <local-image-name>
        imagePullPolicy: Never
    
    eval $(minikube docker-env)
    
    docker build -t USERNAME/REPO .
    
    kubectl apply -f myfile.yaml