k8s初游: minikube启动docker镜像
minikube搭建集群
minikube是k8s新推出的快速搭建单节点的工具,详细介绍见github地址。 对于我初想尝试k8s的人来说,这个minikube搭建非常简单。
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.7.1/minikube-linux-amd64&&chmod +x minikube&&sudo mv minikube /usr/local/bin/
Linux下通过上述就可以安装好minikube工具。启动集群则使用minkube start.
生成kubectl程序
而kubectl,我是直接编译k8s源码生成的。
1.下载最新源码 git clone https://github.com/kubernetes/kubernetes.git
2.执行make
3. 在生成的_output目录中就能找到kubectl程序
创建pod资源
1.编写一个private-image-test-1.yaml文件,
2.执行kubectl create -f private-image-test-1.yaml
k8s将会创建一个pod,该pod中存在一个使用了busybox:latest镜像的容器。
问题
然而并没有这么的顺利。创建后查看Pod的状态,会发现pod一直处于ContainerCreating状态,容器无法正常启动。
1. 一开始我还以为是因为k8s不会自动从docker hub上拉取busybox镜像,直接在host上拉取了最新的busybox镜像。尝试后失败。
2. 查阅了资料后,发现minikube实际上利用virtual box启动了一个虚拟机,遂产生怀疑是不是因为虚拟机没有拉取busybox镜像,通过
minikube ssh 连接进虚拟机中,拉取了最新的镜像。尝试后仍然失败。
3. 找到问题原因: 最终通过kubectl describe pods test,会发现以下的错误提示:
因为GFW的问题,拉取gcr.io/google_containers/pause-amd64:3.0镜像失败导致的。可以查看以下在github上的讨论
https://github.com/kubernetes/kubernetes/issues/7090
https://github.com/kubernetes/kubernetes/issues/6888
https://github.com/kubernetes/kubernetes/issues/26873
第三个讨论提到了一个解决方法是修改pod-infra-container-image参数,但是基于kubelet工具的,在minikube上并没有这个参数。
我向k8s minikube研发人员提出了这个疑问,按照他们的说法,目前版本的minikube确实不支持这个参数,这是minikube在后续版本里需要添加的新特性。
https://github.com/kubernetes/minikube/issues/473
临时解决方法:
1. 想办法在一台机器上拉取gcr.io/google_containers/pause-amd64:3.0
2. 拉取成功后在通过打tag推送到私有仓库中
3. minikube ssh登录到minikube节点中
4. docker login , docker pull镜像后,重新tag成gcr.io/google_containers/pause-amd64:3.0
之后就能正常启动这个test pod了。