如何从 docker 容器内部访问 k3d Kubernetes 集群?

时间:2021-04-30 18:55:25

标签: docker kubernetes

我有一个正在运行的 k3d Kubernetes 集群:

$ kubectl cluster-info
Kubernetes master is running at https://0.0.0.0:6550
CoreDNS is running at https://0.0.0.0:6550/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://0.0.0.0:6550/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

我有一个 python 脚本,它使用 kubernetes 客户端 api 并管理命名空间、部署、pod 等。这在我的本地环境中运行良好,因为我安装了所有必要的 python 模块并且可以直接访问我的本地 k8s 集群.我的目标是进行容器化,以便为我的同事在他们的系统上成功运行相同的脚本。

在 docker 容器中运行相同的 python 脚本时,我收到连接错误:

urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='172.17.0.1', port=6550): Max retries exceeded with url: /api/v1/namespaces (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f8b637c5d68>: Failed to establish a new connection: [Errno 113] No route to host',))

172.17.0.1 是我的 docker0 桥地址,因此假设它将解析或转发流量到我的本地主机。我尝试从我的本地 .kube/config 加载 k8s 配置,它引用 server: https://0.0.0.0:6550 并使用 server: https://172.17.0.1:6550 创建一个单独的配置文件,两者都给出相同的 No route to host 错误(使用各自的 ip HTTPSConnectionPool(host=...)) 中的地址

我追求的一个想法是在容器外运行一个 socat 进程,并从容器内通过从外部安装的桥接套接字隧道传输流量,但看起来我需要使用的 docker 镜像没有安装 socat。但是,我觉得真正的解决方案应该比所有这些都简单得多。

当然,还有其他 docker 容器实例需要访问在 docker 网络之外提供服务的 k8s 集群。这种连接通常是如何建立的?

1 个答案:

答案 0 :(得分:0)

使用 docker network 命令创建预定义网络

您可以通过 --network 将 k3d 附加到现有的 Docker 网络,也可以通过 docker run 为另一个容器执行相同的操作

https://k3d.io/internals/networking/