minikube 启动失败,并出现“libmachine:拨号 TCP 时出错:拨号 tcp 10.43.239.243:49167:连接:没有到主机的路由”错误。

rok*_*rok 5 docker kubernetes minikube docker-in-docker kubernetes-networking

minikube startlibmachine: Error dialing TCP: dial tcp 10.43.239.243:49167: connect: no route to host在以下设置中运行时失败并出现错误:

  • k8s 集群(作为containerd容器运行时)有 2 个 pod:一个带有 docker 客户端容器,第二个带有 docker 守护进程容器。

dind守护进程资源:

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: "" 
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: Service
metadata:
  name: dind  
spec:
  selector:
    app: dind
  type: ClusterIP
  ports:
  - name: daemon
    protocol: TCP
    port: 2375
    targetPort: 2375
Run Code Online (Sandbox Code Playgroud)

dind客户资源:

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"
Run Code Online (Sandbox Code Playgroud)
  • minikube start在 docker 客户端容器内运行

如何调试这个问题以及可能的原因是什么?10.43.239.243ClusterIP dind服务的ip。错误发生在minikube日志中的行之后:

I0804 09:46:35.049413     222 main.go:134] libmachine: About to run SSH command:
sudo hostname minikube && echo "minikube" | sudo tee /etc/hostname
Run Code Online (Sandbox Code Playgroud)

当两个容器在没有 kubernetes 的情况下运行时(使用 docker 守护进程),我尝试进行相同的实验。在这种情况下,两者都使用相同的docker网络,守护进程容器使用dind网络别名启动并minikube start成功。

下面是使用的命令:

  • docker 守护进程容器:

docker run --name dind -d --privileged --network dind --network-alias dind -e DOCKER_TLS_CERTDIR="" docker:dind

  • docker客户端容器:
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!
Run Code Online (Sandbox Code Playgroud)