【问题标题】:Access minikube from inside docker/docker-compose on Linux在 Linux 上从 docker/docker-compose 内部访问 minikube
【发布时间】:2021-12-29 04:43:10
【问题描述】:

设置:

我有一个 minikube 设置和一个 docker-compose 设置并排运行。通过这种方式,我可以轻松地在 docker/docker-compose 中开发我的应用程序,并在 minikube 中运行其他服务。我正在使用 Linux (Ubuntu)。

问题:

我想使用 cURL 在 docker-compose 内运行的 docker 容器中访问 minikube API。

我尝试过的:

  • 使用代理设置访问 minikube:curl http://localhost:8080/api(当使用 kubectl 代理 kubectl proxy --port=8080 时)但这当然行不通,因为 localhost 是容器的本地主机。这导致curl: (7) Failed to connect to localhost port 8080: Connection refused
  • 通过 docker 内部主机访问 minikube:curl http://host.docker.internal:8080/api。这也导致curl: (7) Failed to connect to host.docker.internal port 8080: Connection refused
  • 通过以下脚本中的 api/credentials 访问 minikube:
APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
SECRET_NAME=$(kubectl get secrets | grep ^default | cut -f1 -d ' ')
TOKEN=$(kubectl describe secret $SECRET_NAME | grep -E '^token' | cut -f2 -d':' | tr -d " ")

curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

但这一切都失败了。

我也将它添加到我的 docker-compose.yml 文件中:

    extra_hosts:
      - "host.docker.internal:host-gateway"

当我在 docker 容器外尝试上述命令时,一切正常。 如何从 docker 容器内访问 minikube?

提前致谢!

【问题讨论】:

    标签: docker kubernetes curl minikube


    【解决方案1】:

    我强烈建议您也使用 kubernetes 清单来包装您的开发,并将您的服务部署在集群中。只需一次设置,然后您可以测试多次,而不是使用 docker-compose 方式进行开发设置。

    话虽如此,我尝试了您的上述设置(但我在 mac、minikube 和 docker for mac 中尝试过)。有效的解决方案正是这样做:

    1. extra_hosts 添加到docker-compose:
    version: "3.9"
    services:
      busy1:
        image: progrium/busybox
        command: sleep 3600
        extra_hosts:
         - "host.docker.internal:host-gateway"
    
    1. 运行一个 hello-world 示例并使用 minikube 中的服务公开它(这类似于创建部署和服务清单)
    minikube kubectl -- create deployment node-hello --image=gcr.io/google-samples/node-hello:1.0 --port=8080 
    minikube kubectl -- expose deployment node-hello --port=8080
    
    1. 运行带有标志 --disable-filter=true 的 minikube 以克服 forbidden 作为响应。

    minikube kubectl -- proxy --disable-filter=true --port=8080

    1. 在 docker 中运行的容器中使用 host.docker.internal 访问主机
    curl http://host.docker.internal:8080/api/  
    {
      "kind": "APIVersions",
      "versions": [
        "v1"
      ],
      "serverAddressByClientCIDRs": [
        {
          "clientCIDR": "0.0.0.0/0",
          "serverAddress": "192.168.49.2:8443"
        }
      ]
    }
    

    所以基本上流程是,容器 -> host.docker.internal -> kubectl 代理 -> kubernetes 服务 -> kubectl 部署

    这完全取决于您的 kubernetes 服务配置,以便代理可以正常工作。但是就像我之前说的,使用 Kubernetes 优先模式进行开发,这样您就可以专注于逻辑和业务功能,而不必担心网络复杂性。所有这些都因 docker 版本、平台(linux、mac、windows 等)、服务配置(或入口)等、桥接或覆盖或使用的主机网络而异。祝你好运。

    【讨论】:

    • 感谢您的回复。但这仍然对我不起作用。我知道我的开发环境不是它应该的样子。您能教我如何正确设置 K8S 开发环境吗?
    • 起作用的是在 docker-compose 文件中将 network_mode 设置为“host”。在那种情况下,我可以从 localhost 调用代理。
    • 好的,在 Mac 的 docker 中“network_mode”似乎不起作用。
    • 关于开发设置的顺便说一句。我的意思是您将根据代码的组织方式围绕您的镜像编写 kubernetes 清单,并且您可以轻松地在集群中推出新的镜像更改,而不是通过单独的 docker 容器运行它。
    • 这听起来不错,但到目前为止,我还没有找到任何可以在本地运行 docker 以加快开发周期的好选择。只需更改代码(在本例中为 php)并点击刷新。完毕。 Skaffold 之类的工具非常接近,但我必须在 docker 之外工作才能让它工作,而且我喜欢将所有工具都放在一个容器中。也许我错过了什么?
    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 2021-11-29
    • 2020-07-11
    • 2021-03-09
    • 2020-08-24
    • 2019-08-08
    • 2020-12-21
    • 2019-09-29
    相关资源
    最近更新 更多