【问题标题】:127.0.0.1:5000: getsockopt: connection refused in Minikube127.0.0.1:5000:getsockopt:Minikube 中的连接被拒绝
【发布时间】:2018-12-25 16:10:29
【问题描述】:

在我的本地 Ubuntu 工作站上使用 minikube 和 docker 我在 Minikube Web UI 中收到以下错误:

Failed to pull image "localhost:5000/samples/myserver:snapshot-180717-213718-0199": rpc error: code = Unknown desc = Error response from daemon: Get http://localhost:5000/v2/: dial tcp 127.0.0.1:5000: getsockopt: connection refused

在我创建了以下部署配置后:

kubectl apply -f hello-world-deployment.yaml

hello-world-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello-world
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-world
        tier: backend
    spec:
      containers:
      - name: hello-world
        image: localhost:5000/samples/myserver:snapshot-180717-213718-0199
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 8080

以及来自 docker 图像的输出:

REPOSITORY                                 TAG                           IMAGE ID            CREATED             SIZE
samples/myserver                           latest                        aa0a1388cd88        About an hour ago   435MB
samples/myserver                           snapshot-180717-213718-0199   aa0a1388cd88        About an hour ago   435MB
k8s.gcr.io/kube-proxy-amd64                v1.10.0                       bfc21aadc7d3        3 months ago        97MB

根据本指南: How to use local docker images with Minikube?

我也跑过:

eval $(minikube docker-env)

并基于此:

https://github.com/docker/for-win/issues/624

我已添加:

    "InsecureRegistry": [
        "localhost:5000",
        "127.0.0.1:5000"
    ],

/etc/docker/daemon.json

有什么建议可以让我在 minikube 中使用图像拉取功能吗?

我已按照以下答案中的步骤进行操作,但是当我执行此步骤时:

$ kubectl port-forward --namespace kube-system $(kubectl get po -n kube-system | grep kube-registry-v0 | awk '{print $1;}') 5000:5000

它只是这样挂起:

$ kubectl port-forward --namespace kube-system $(kubectl get po -n kube-system | grep kube-registry-v0 | awk '{print $1;}') 5000:5000
Forwarding from 127.0.0.1:5000 -> 5000
Forwarding from [::1]:5000 -> 5000

创建部署配置后,我在 minikube 仪表板中收到相同的错误。

根据 BMitch 的回答,我现在尝试创建一个本地 docker 存储库并将图像推送到它:

$ docker run -d -p 5000:5000 --restart always --name registry registry:2
$ docker pull ubuntu
$ docker tag ubuntu localhost:5000/ubuntu:v1
$ docker push localhost:5000/ubuntu:v1

接下来,当我做 docker 图像时,我得到:

$ docker images
REPOSITORY                                      TAG                           IMAGE ID            CREATED             SIZE
ubuntu                                          latest                        74f8760a2a8b        4 days ago          82.4MB
localhost:5000/ubuntu                           v1                            74f8760a2a8b        4 days ago          82.4MB

然后我将我的部署配置 hello-world-deployment.yaml 更新为:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello-world
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-world
        tier: backend
    spec:
      containers:
      - name: hello-world
        image: localhost:5000/ubuntu:v1
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 8080

kubectl create -f hello-world-deployment.yaml

但在 Minikube 中我仍然遇到类似的错误:

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

所以好像 Minikube 不能看到我刚刚创建的本地注册表?

【问题讨论】:

    标签: docker minikube


    【解决方案1】:

    您的计算机上的 localhostlocalhost 似乎在 minikube VM 的上下文中使用时遇到问题。 要使注册表正常工作,您必须设置额外的端口转发。

    如果您的minikube 安装由于多次尝试修复注册表问题而被破坏, 我建议重启 minikube 环境:

    minikube stop && minikube delete && rm -fr $HOME/.minikube &&  minikube start
    

    接下来,获取 kube 注册表 yaml 文件:

    curl -O https://gist.githubusercontent.com/coco98/b750b3debc6d517308596c248daf3bb1/raw/6efc11eb8c2dce167ba0a5e557833cc4ff38fa7c/kube-registry.yaml
    

    然后,在 minikube 上应用:

    kubectl create -f kube-registry.yaml
    

    测试 minikube VM 中的注册表是否有效:

    minikube ssh && curl localhost:5000
    

    在 Ubuntu 上,将端口转发到端口 5000 的注册表:

    kubectl port-forward --namespace kube-system $(kubectl get po -n kube-system | grep kube-registry-v0 | awk '{print $1;}') 5000:5000
    

    如果您想从您的机器上共享您的私有注册表,您可能对sharing local registry for minikube 博客条目感兴趣。

    【讨论】:

    • 我已按照上述步骤操作,但在我的 deploymentconfig 中指定 docker 映像的路径时仍然遇到相同的错误:localhost:5000/samples/myserver:snapshot-180717-213718-0199跨度>
    • 你提到的yaml文件已经过时了,我把它弄到工作状态并在这里发布,gist.github.com/dinukasal/302300d6d7c48885f574c3fae65eeefc
    【解决方案2】:

    如果您将图像源指定为本地注册表服务器,则需要在其中运行一个注册表服务器,并将您的图像推送到它。

    您可以使用多个第 3 方选项自行托管注册表服务器,或者运行打包在 docker 容器中的注册表服务器:https://hub.docker.com/_/registry/

    这仅适用于单节点环境,除非您设置 TLS 密钥、信任 CA 或告诉所有其他节点额外的不安全注册表。

    您还可以将 imagePullPolicy 指定为从不。


    这两种解决方案都已经在您的链接问题中,我没有看到任何证据表明您在这个问题中尝试过。在不显示您是如何尝试这些步骤并遇到不同问题的情况下,这个问题可能应该作为重复关闭。

    【讨论】:

    • 但是我已经在本地安装了 docker 并且可以使用 'docker images' 看到我的本地图像,为什么我不能将我的本地 docker 安装用作“registry”/“repository”?另外据我了解,Minikube 仅支持单节点集群,因此应涵盖该部分。
    • @u123 如果你只想运行本地构建的镜像,那么答案可能不是 kubernetes。你可以用 docker 做到这一点。如果你想讨论 Kubernetes 架构的设计,我可能是问错人了,我只是来尝试解决你遇到的问题。
    • 不,我想在 minikube/kubernetes 中运行它以了解该设置,我只是很困惑为什么我需要创建一个本地注册表,而我认为我在安装 docker 时默认已经有了它。但显然这是另一回事。
    • @u123 docker engine != docker 注册服务器。您不需要在 localhost 上托管您的图像,可以将它们放在云(docker hub)或其他一些本地服务器中,因此 docker 不会在引擎上附带一个。由于启动只需要 30 秒,我不知道为什么会出现这样的问题。
    • 这不是一个真正的问题,只是想了解设置。我现在已经创建了一个本地注册表并按照您的建议将图像推送到它,但似乎仍然不允许 minikube 提取图像。我已经用一个例子更新了我原来的帖子。
    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 2015-08-01
    • 1970-01-01
    • 2021-01-13
    • 2017-05-23
    • 1970-01-01
    • 2018-10-01
    • 2011-07-26
    相关资源
    最近更新 更多