minikube使用virtualbox创建host only虚拟网络

用过docker machine的朋友,使用minikube后就能感觉到它其实跟docker machine很像,默认都是使用virtualbox作为虚拟化驱动,在创建虚拟机的同时,也会创建相关虚拟网络,一般情况下,都是创建host only的虚拟网络,mac下安装完virtualbox可以使用命令vboxmanager list hostonlyifs列出已经创建好的虚拟网络。

由于我之前通过vagrant创建过很多虚拟机,虽然都已经destroy了,但对应的虚拟网络会残留下来,结果在使用minikube start的时候,发生了以下的错误:

大概意思就是minikube需要创建并使用一个192.168.60.1网段的虚拟网络,但现在这个网段已经被占用了,必须删除原有创建的。乍一看觉得可以理解,就手动通过vboxmanager hostonlyif remove vboxnet0删除了所有原来存在的虚拟网络。

再次运行minikube start,不再报错了,成功创建了虚拟机。处于好奇,使用vboxmanager list hostonlyif查看了minikube创建的虚拟网络:

命令结果里显示的是创建了192.168.99.1网段的虚拟网络,那之前却因为192.168.60.1这个网段冲突导致初始化失败,感觉很奇怪。等看完源代码,再来给大家讲解。

2016-12-24更新:

关于为什么会因为192.168.60.1这个网段报错,通过查询源代码,找到了报错的那行代码:

%e5%b1%8f%e5%b9%95%e5%bf%ab%e7%85%a7-2016-12-24-%e4%b8%8b%e5%8d%881-16-35

可以看到,事实上这段代码来自docker machine这个project,报错的方法是listHostOnlyAdapters,主要就是gets all host-only adapters in a map keyed by NetworkName。报错的那行的逻辑是,如果同一个network出现两次就报错,也就是说,我本地有两个virtualbox虚拟机使用了同样的network(我的case就是192.168.60.1),就会引起这个方法报错。而本身这个错其实不会影响minikube的创建,minikube默认的使用网段是192.168.99.1。所以是因为引用了其他库的代码导致了主项目发生了逻辑上不怎么合理的错误。

2016-12-24更新完毕

minikube使用的镜像都是gcr.io,需要科学上网

在跑hello world pod的时候,一直没有运行起来,凭着经验判断,估计是镜像没拉下来。通过minikube ssh登录到虚拟机里,查看/var/log/docker.log发现:

time="2016-12-20T05:01:26.946388096Z" level=error msg="Handler for GET /v1.23/images/gcr.io/google_containers/echoserver:1.4/json returned error: No such image: gcr.io/google_containers/echoserver:1.4"

果不其然,没有成功pull完目标镜像,因为是gcr.io这个google旗下的镜像仓库,所以,你懂的。。。对于这种常见情况,我的处理套路是

  1. 找一台国外的vps,docker pull 目标镜像,save成tar包
  2. 就地起一个http file server,wget到本地
  3. 如果虚拟机和宿主机之间有共享文件夹,那就直接同步过去,如果没有,宿主机起一个http file server,从虚拟机里wget目标镜像的tar包
  4. 虚拟机里docker load目标tar包,完成。

一切正常后,看下docker ps结果:

k8s相关的容器起了不少啊! 下回给大家一一讲解。

发表评论

电子邮件地址不会被公开。 必填项已用*标注