在 Linux 从 docker/docker-compose 内部访问 minikube
Access minikube from inside docker/docker-compose on Linux
设置:
我有一个 minikube 设置和一个 docker-compose 并排设置 运行ning。这样我就可以在 minikube 的 docker/docker-compose 和 运行 其他服务中轻松开发我的应用程序。我正在研究 Linux (Ubuntu).
问题:
我想在 docker 容器 运行 中访问 minikube API - 在 docker-compose 中使用 cURL。
我尝试过的:
- 使用代理设置访问 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?
提前致谢!
我强烈建议您也使用 kubernetes 清单包装您的开发并将您的服务部署在集群中。只需一次设置,然后您就可以测试多次,而不是 docker-compose 开发设置的方式。
话虽如此,我尝试了您的上述设置(但我在 mac、minikube 和 docker 中尝试了 mac)。有效的解决方案正是这样做的:
- 将
extra_hosts
添加到docker-撰写:
version: "3.9"
services:
busy1:
image: progrium/busybox
command: sleep 3600
extra_hosts:
- "host.docker.internal:host-gateway"
- 运行 一个 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
- 运行 带有标志
--disable-filter=true
的 minikube 以克服 forbidden
作为响应。
minikube kubectl -- proxy --disable-filter=true --port=8080
- 在 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 等)、服务配置(或入口)等、使用的桥接或覆盖或主机网络而异。祝你好运。
设置:
我有一个 minikube 设置和一个 docker-compose 并排设置 运行ning。这样我就可以在 minikube 的 docker/docker-compose 和 运行 其他服务中轻松开发我的应用程序。我正在研究 Linux (Ubuntu).
问题:
我想在 docker 容器 运行 中访问 minikube API - 在 docker-compose 中使用 cURL。
我尝试过的:
- 使用代理设置访问 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?
提前致谢!
我强烈建议您也使用 kubernetes 清单包装您的开发并将您的服务部署在集群中。只需一次设置,然后您就可以测试多次,而不是 docker-compose 开发设置的方式。
话虽如此,我尝试了您的上述设置(但我在 mac、minikube 和 docker 中尝试了 mac)。有效的解决方案正是这样做的:
- 将
extra_hosts
添加到docker-撰写:
version: "3.9" services: busy1: image: progrium/busybox command: sleep 3600 extra_hosts: - "host.docker.internal:host-gateway"
- 运行 一个 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
- 运行 带有标志
--disable-filter=true
的 minikube 以克服forbidden
作为响应。
minikube kubectl -- proxy --disable-filter=true --port=8080
- 在 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 等)、服务配置(或入口)等、使用的桥接或覆盖或主机网络而异。祝你好运。