簡體   English   中英

如何在 docker 容器內運行 minikube?

[英]How to run minikube inside a docker container?

我打算測試一個重要的 Kubernetes 設置作為 CI 的一部分,並希望在 CD 之前運行整個系統。 我無法運行--privileged容器,並且正在使用docker run -v /var/run/docker.sock:/var/run/docker.sock將 docker 容器作為主機的同級容器運行

基本的 docker 設置似乎正在容器上工作:

linuxbrew@03091f71a10b:~$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

但是,minikube 無法在 docker 容器內啟動,報告連接問題:

linuxbrew@03091f71a10b:~$ minikube start --alsologtostderr -v=7
I1029 15:07:41.274378    2183 out.go:298] Setting OutFile to fd 1 ...
I1029 15:07:41.274538    2183 out.go:345] TERM=xterm,COLORTERM=, which probably does not support color
...
...
...
I1029 15:20:27.040213     197 main.go:130] libmachine: Using SSH client type: native
I1029 15:20:27.040541     197 main.go:130] libmachine: &{{{<nil> 0 [] [] []} docker [0x7a1e20] 0x7a4f00 <nil>  [] 0s} 127.0.0.1 49350 <nil> <nil>}
I1029 15:20:27.040593     197 main.go:130] libmachine: About to run SSH command:
sudo hostname minikube && echo "minikube" | sudo tee /etc/hostname
I1029 15:20:27.040992     197 main.go:130] libmachine: Error dialing TCP: dial tcp 127.0.0.1:49350: connect: connection refused                                                  

盡管網絡已鏈接並且端口已正確轉發,但仍會出現這種情況:

linuxbrew@51fbce78731e:~$ docker container ls
CONTAINER ID   IMAGE                                 COMMAND                  CREATED         STATUS         PORTS                                                                                                                                  NAMES
93c35cec7e6f   gcr.io/k8s-minikube/kicbase:v0.0.27   "/usr/local/bin/entr…"   2 minutes ago   Up 2 minutes   127.0.0.1:49350->22/tcp, 127.0.0.1:49351->2376/tcp, 127.0.0.1:49348->5000/tcp, 127.0.0.1:49349->8443/tcp, 127.0.0.1:49347->32443/tcp   minikube
51fbce78731e   7f7ba6fd30dd                          "/bin/bash"              8 minutes ago   Up 8 minutes                                                                                                                                          bpt-ci
linuxbrew@51fbce78731e:~$ docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
1e800987d562   bridge     bridge    local
aa6b2909aa87   host       host      local
d4db150f928b   kind       bridge    local
a781cb9345f4   minikube   bridge    local
0a8c35a505fb   none       null      local
linuxbrew@51fbce78731e:~$ docker network connect a781cb9345f4 93c35cec7e6f
Error response from daemon: endpoint with name minikube already exists in network minikube

當嘗試從主機curl甚至ssh響應時,minikube 容器似乎還活着並且很好:

mastercook@linuxkitchen:~$ curl https://127.0.0.1:49350
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 127.0.0.1:49350 

mastercook@linuxkitchen:~$ ssh root@127.0.0.1 -p 49350
The authenticity of host '[127.0.0.1]:49350 ([127.0.0.1]:49350)' can't be established.
ED25519 key fingerprint is SHA256:0E41lExrrezFK1QXULaGHgk9gMM7uCQpLbNPVQcR2Ec.
This key is not known by any other names

我錯過了什么,如何讓 minikube 正確發現正常工作的 minikube 容器?

因為minikube並沒有完成集群的創建,所以在(兄弟)Docker 容器中運行 Kubernetes 有利於kind

鑒於(兄弟)容器對其設置的了解不夠,網絡連接有點缺陷。 具體來說,即使實際容器位於主機 docker 中的不同 IP 上,也會在創建集群時按kind (和 minikube)選擇環回 IP。

為了糾正網絡,(兄弟)容器需要連接到實際托管 Kubernetes 鏡像的網絡。 為了實現這一點,該過程如下圖所示:

  1. 創建 Kubernetes 集群:
linuxbrew@324ba0f819d7:~$ kind create cluster --name acluster
Creating cluster "acluster" ...
 ✓ Ensuring node image (kindest/node:v1.21.1) 🖼
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-acluster"
You can now use your cluster with:

kubectl cluster-info --context kind-acluster

Thanks for using kind! 😊
  1. 驗證集群是否可訪問:
linuxbrew@324ba0f819d7:~$ kubectl cluster-info --context kind-acluster

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
The connection to the server 127.0.0.1:36779 was refused - did you specify the right host or port?

3.) 由於無法訪問集群,請檢索控制平面主 IP。 請注意集群名稱中添加的“-control-plane”:

linuxbrew@324ba0f819d7:~$ export MASTER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' acluster-control-plane)

4.) 使用實際的主 IP 更新 kube 配置:

linuxbrew@324ba0f819d7:~$ sed -i "s/^    server:.*/    server: https:\/\/$MASTER_IP:6443/" $HOME/.kube/config

5.) 這個 IP 仍然不能被(兄弟)容器訪問,為了將容器連接到正確的網絡,檢索 docker 網絡 ID:

linuxbrew@324ba0f819d7:~$ export MASTER_NET=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.NetworkID}}{{end}}' acluster-control-plane)

6.) 最后將(兄弟)容器 ID(應該存儲在$HOSTNAME環境變量中)與集群 docker 網絡連接:

linuxbrew@324ba0f819d7:~$ docker network connect $MASTER_NET $HOSTNAME

7.) 驗證更改后控制平面是否可訪問:

linuxbrew@324ba0f819d7:~$ kubectl cluster-info --context kind-acluster
Kubernetes control plane is running at https://172.18.0.4:6443
CoreDNS is running at https://172.18.0.4:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

如果kubectl返回 Kubernetes 控制平面和 CoreDNS URL,如上一步所示,則配置成功。

您可以在 docker容器中的 docker 中運行minikube 它將使用docker驅動程序。

docker run --name dind -d --privileged docker:20.10.17-dind 
docker exec -it dind 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!
...

另外,請注意--force用於使用docker驅動程序運行minikube ,我們不應該按照minikube說明執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM