Minikube无法从本地Docker容器注册表中拉取镜像

3
我正在尝试将容器部署到本地Kubernetes中。目前,我已经安装了Docker守护进程、Minikube和Minikube仪表板,它们都正常工作。我还在端口5000上设置了本地容器库。我已经推送了两个应用程序镜像,并且可以在浏览器上看到它们:http://localhost:5000/v2/_catalog。现在,当我尝试使用Minikube启动Pod时。
kubectl apply -f ./docker-compose-k.yml --record

我在仪表板上遇到了这样的错误:

Failed to pull image "localhost:5000/coremvc2": rpc error: code = Unknown desc = Error response from daemon: Get http://localhost:5000/v2/: dial tcp 127.0.0.1:5000: connect: connection refused 

下面是我的Compose文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: core23
  labels:
    app: codemvc
spec:
  replicas: 1
  selector:
    matchLabels:
      app: coremvc
  template:
    metadata:
      labels:
        app: coremvc
    spec:
      containers:
      - name: coremvc
        image: localhost:5000/coremvc2
        ports:
        - containerPort: 80
        imagePullPolicy: Always

我不知道为什么这些镜像不能作为Docker守护程序和Kubernetes在同一台机器上运行。我也尝试使用Dockerhub的镜像,它可以正常工作,但我想使用本地镜像来完成。请给我提示或任何指导。
谢谢。

“我不知道为什么这些镜像没有被Docker守护进程和Kubernetes拉取,因为两者都在同一台机器上。”“你确定吗?通常,Minikube会使用虚拟机驱动程序,如VirtualBox或KVM2。” - Jonathan Beber
你是怎么启动minikube的?你是在virtualbox里运行它吗?还是直接在docker中使用 minikube start --vm-driver=none 命令启动的? - Marc ABOUCHACRA
实际上你已经做了。当你输入 minikube start 时,默认驱动程序是 virtualbox。这就是为什么 localhost 不起作用。它指的是你的 virtualbox VM。 - Marc ABOUCHACRA
那么我需要用Hyper-V或KVM2来启动它吗? - Vinit Patel
在这里,“localhost”的含义很复杂:主机、minikube虚拟机和每个单独的容器都认为它指的是自己。你可能需要一个更具体的指针来指向注册表的位置。 - David Maze
显示剩余2条评论
3个回答

1
根据评论,您使用 minikube start 启动了 minikube(没有指定驱动程序)。
这意味着 minikube 正在运行在一个 Virtualbox VM 中。为了使您的用例正常工作,您有两个选择:
  1. 困难的方式 设置 VM 和主机之间的连接,并使用主机 IP。
  2. 简单的方式 使用 minikube ssh 连接到您的 VM 并在其中安装您的注册表。然后您的部署应该可以使用 VM 的 IP 正常工作。
如果您不想使用 VirtualBox,则应阅读 文档 以了解其他现有驱动程序以及如何使用它们。
希望这能帮助您!

0

localhost:5000 指向该 pod 本身。

如果 Docker 注册表运行在 minikube 运行的同一主机上:

  • 获取主机的IP地址(例如使用ifconfig)。假设它是10.0.2.15

  • 给镜像打标签:

    docker tag coremvc2:latest 10.0.2.15:5000/coremvc2:latest
    
  • 将已打标签的镜像推送到本地注册表:

    docker push 10.0.2.15:5000/coremvc2:latest
    
  • 在部署中进行更改:

    image: localhost:5000/coremvc2
    

    变为

    image: 10.0.2.15:5000/coremvc2:latest
    

编辑:如果出现“...http: server gave HTTP response to HTTPS client”错误,您可以通过编辑/etc/docker/daemon.json(如果不存在,请创建)将本地Docker守护程序的本地Docker注册表配置为不安全的注册表

{ 
... any other settings or remove this line ...
  "insecure-registries": ["10.0.2.15:5000"] 
}

...然后重新启动Docker:

 sudo service docker restart

不确定您如何运行本地Docker注册表,但这是一种方法:

 docker run -d -p 5000:5000 --name registry registry:2

我尝试了你的方法,但是出现了“无法拉取镜像“10.150.0.4:5000/my-alpine”:rpc错误:代码=未知描述=守护程序的错误响应:从https://10.150.0.4:5000/v2/获取:http:服务器向HTTPS客户端提供了HTTP响应”的问题。 - Vinit Patel
@VinitPatel,我今天早些时候已经尝试过了。请阅读我的答案。解决方案要么是正确设置(使用https),要么只在minikube内部。我已经提供了如何执行的命令。 - Nick
明白了,@VinitPatel。让我补充一点答案以解决这个问题。 - gears
@gears,我昨天尝试了不安全的注册表。但是当您尝试创建部署时,它并不能解决问题。然而,我没有进行任何重要的研究,因为无法想象在具有Registry和minikube的主机上运行生产环境。 - Nick
@Nick - 这个问题是关于minikube和本地注册表的,因此我回答了它。当我使用minikube时,这个设置已经运行了很长时间。要在本地设置安全注册表并从minikube访问它,需要来自可靠CA的有效证书和密钥,即使是Let's Encrypt也是如此,对于有些人来说,仅在本地运行不安全的注册表就足够了。干杯 - gears

0
问题在于您已在主机上设置了Docker注册表,而Minikube在虚拟化环境中运行(根据您的示例,它是Virtualbox)。
这就是为什么在尝试在端口5000上获取映像时会收到“连接被拒绝”的错误。根本原因是Minikube内部没有进程监听5000端口。您的注册表部署在Minikube“外部”。
正如Marc所说,有两种方法可以解决这个问题,我已经复制了这两种方法。 困难的方法 将带您到:
Failed to pull image "10.150.0.4:5000/my-alpine": rpc error: code = Unknown desc = Error response from daemon: Get https://10.150.0.4:5000/v2/: http: server gave HTTP response to HTTPS client

因此,您需要根据Docker文档设置安全的Docker注册表。

最简单的方法是在minikube上设置它。

my@linux-vm2:~$ minikube ssh
$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
...
Status: Downloaded newer image for registry:2

$ docker pull nginx:latest
...
Status: Downloaded newer image for nginx:latest

$ docker tag alpine:latest localhost:5000/my-nginx
$ docker push localhost:5000/my-nginx
$ logout

my@linux-vm2:~$ kubectl apply -f ./docker-compose-k.yml --record
deployment.apps/core23 created


my@linux-vm2:~$ kubectl get  pods
NAME                     READY   STATUS    RESTARTS   AGE
core23-b44b794cb-vmhwl   1/1     Running   0          4s

my @linux-vm2:~$ kubectl describe pods
...
Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned default/core23-b44b794cb-vmhwl to minikube
  Normal  Pulling    9s         kubelet, minikube  Pulling image "localhost:5000/my-nginx"
  Normal  Pulled     9s         kubelet, minikube  Successfully pulled image "localhost:5000/my-nginx"
  Normal  Created    9s         kubelet, minikube  Created container coremvc
  Normal  Started    9s         kubelet, minikube  Started container coremvc

请注意,在此示例中,我使用的是nginx而不是coremvc2(但步骤仍然相同)。
总之,有几种不同的方法可以实现您需要的结果。请尝试并告诉我们进展如何。干杯 :)

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