You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在K8s的Docker-in-Docker环境启动minikube报错的排查与原因分析

问题描述

在基于containerd作为容器运行时的K8s集群中,部署了两个Pod:一个docker客户端容器,一个docker守护进程(dind)容器。在docker客户端容器内执行minikube start时,出现以下错误:

libmachine: Error dialing TCP: dial tcp 10.43.239.243:49167: connect: no route to host

其中10.43.239.243是dind服务的ClusterIP,错误发生在minikube执行完以下SSH命令之后:

I0804 09:46:35.049413     222 main.go:134] libmachine: About to run SSH command:
sudo hostname minikube && echo "minikube" | sudo tee /etc/hostname

相关资源配置

dind守护进程资源

StatefulSet配置:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: dind  
spec:
  selector: 
    matchLabels:
      app: dind
  serviceName: "dind"
  template:
    metadata:
      labels:
        app: dind
    spec:
      containers:
        - name: dind-daemon 
          image: docker:20.10.17-dind
          securityContext: 
            privileged: true
          env: 
            - name: DOCKER_TLS_CERTDIR
              value: "" 

Service配置:

apiVersion: v1
kind: Service
metadata:
  name: dind  
spec:
  selector:
    app: dind
  type: ClusterIP
  ports:
  - name: daemon
    protocol: TCP
    port: 2375
    targetPort: 2375

docker客户端Pod配置

apiVersion: v1
kind: Pod
metadata:
  name: "docker-client"
  labels:
    app: "docker-client"
spec:
  containers:
  - name: docker-client
    image: "docker:latest"
    env:
    - name: DOCKER_HOST
      value: "tcp://dind:2375"

对比实验

在非K8s环境下,将两个容器放在同一自定义Docker网络中运行,minikube start执行成功,所用命令如下:

  • 启动dind守护进程容器:
docker run --name dind -d --privileged --network dind --network-alias dind -e DOCKER_TLS_CERTDIR=""  docker:dind
  • 启动docker客户端容器并执行minikube:
docker run --name dind-client -it  --network dind  -e DOCKER_HOST="tcp://dind:2375" docker sh
/ # wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
/ # mv minikube-linux-amd64 minikube
/ # chmod +x minikube 
/ # ./minikube start --force
...
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
/ # ./minikube kubectl -- run --image=hello-world
/ # ./minikube kubectl -- logs pod/hello
Hello from Docker!
可能原因
  1. Service端口转发限制:当前dind的ClusterIP Service仅暴露了2375端口(Docker API端口),而minikube启动后会随机分配一个端口用于SSH连接(这里是49167),该端口未被Service转发,导致客户端Pod无法通过ClusterIP访问这个随机端口。
  2. K8s网络隔离:K8s集群的网络插件(如Calico、Flannel)或NetworkPolicy可能限制了Pod间非Service端口的直接访问,即使客户端Pod能通过ClusterIP访问2375端口,也无法访问dind Pod上的其他随机端口。
  3. 网络平面不互通:K8s Pod的网络与dind容器内部的Docker网络属于不同网络平面,minikube在dind内部创建的节点,其SSH端口映射到dind容器后,K8s客户端Pod无法通过ClusterIP路由到这个端口。
  4. ClusterIP访问局限性:ClusterIP仅用于集群内部Pod间访问Service暴露的端口,无法直接访问后端Pod的其他未暴露端口,而minikube需要访问的是dind Pod上的随机SSH端口,而非Service暴露的2375端口。
调试步骤
  • 验证Docker API连通性:在docker客户端Pod内执行curl http://dind:2375/version,确认2375端口能正常访问,排除基础连接问题。
  • 检查dind容器内端口映射:进入dind Pod(kubectl exec -it dind-0 -- sh),执行docker ps查看minikube容器的端口映射,确认49167端口是否映射到minikube节点的SSH端口;同时执行ip addr确认dind容器自身能访问该端口。
  • 测试Pod直接IP的端口连通性:先获取dind Pod的IP(kubectl get pod dind-0 -o jsonpath='{.status.podIP}'),然后在客户端Pod内执行telnet <dind-pod-ip> 49167或nc -zv <dind-pod-ip> 49167:
    • 如果能连通,说明问题出在ClusterIP Service未转发该随机端口;
    • 如果不能连通,检查K8s网络插件的规则或是否存在NetworkPolicy限制。
  • 查看网络策略与插件配置:检查集群是否存在针对dind Pod的NetworkPolicy,是否阻止了非2375端口的入站流量;同时确认网络插件是否允许Pod间的全端口通信。
  • 尝试修改网络部署方式:
    • 临时将dind的Service改为NodePort,直接通过节点IP访问dind Pod的随机端口;
    • 将docker客户端与dind容器部署在同一个Pod中(共享网络命名空间),客户端可直接通过localhost访问dind内部的所有端口;
  • 获取minikube详细日志:执行minikube start --v=7,查看更详细的网络连接日志,定位具体的路由或端口访问失败原因。

内容的提问来源于stack exchange,提问作者rokpoto.com

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 04:24:46