原文作者: Cheney Dong
原文链接: https://cheneydc.me/2018/03/24/deploy-minikube-on-windows/
k8s上的部署官方给了几种方式,机器多可以用kubeadm,自己只有一个机器,可以用minikube来弄个单机的虚拟机环境进行学习。当然也有kubespray可以搞定生产环境级别的k8s环境部署。最近葱苦于笔记本上没有环境使用只能先试试minikube了,最难能可贵的是minikube支持多种虚拟化方式,我windows的机器也可以试试啦!按照官方知道还是很便捷的,所有部署方式中,最麻烦的莫过于镜像啦,因为镜像在那头,我在这头……
准备镜像
既然镜像是最麻烦的,那我就先准备镜像吧,我的方案是:
- 将所有使用到的镜像写到放到自己的github上的Dockerfile里
- 在阿里云的
容器镜像服务
里面,创建自己的镜像仓库,分别关联第1步
中的Dockerfile - 通过上一步构建的自己的镜像仓库进行拉取镜像,然后将镜像打上相应的tag
最开始自己用kubeadm的时候就用这样的方式实践了下,手动操作着实繁琐,而且没想到有这么多镜像,自己的github也是弄的一堆,索性单独创建了一个organiztion的repo(k8simage),把k8s的镜像都放到里面还算方便些。
具体操作很简单,以pause镜像为例,dockerfile这样就可以了,:
FROM k8s.gcr.io/pause-amd64:3.0
MAINTAINER cheneydc <cheneydc@gmail.com>
这样就搞定dockerfile了,实际需要的镜像不止一个:
k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.5
k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.5
k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.5
gcr.io/google-containers/kube-addon-manager:v6.5
k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.1
gcr.io/google_containers/pause-amd64:3.0
gcr.io/k8s-minikube/storage-provisioner:v1.8.1
阿里云上面目前容器镜像服务首先要自己创建个命名空间,就不啰嗦了,创建后才能在命名空间里创建仓库,针对我们上面的镜像创建一个仓库,贴个图吧:
[站外图片上传中…(image-7bf690-1521861075193)]
这里按照提示把必填项些上就可以了。需要注意的是GitHub选择自己相应的dockerfile,registry会使用这个dockerfile进行构建。最重要的,构建设置中
有一个海外机器构建
,这个一定要勾选,因为一些你懂的原因只有选择海外机器构建,我们k8s的镜像才能顺利build然后再拉取回来,这也是为什么用ali的原因啦。最后设置好相应的分支等信息就可以了。
创建好镜像仓库第一次需要手动构建:
[站外图片上传中…(image-c880a-1521861075194)]
构建失败可以点击日志查看失败原因,一般也就是dockerfile写的有问题,目前没有遇到过其他毛病。
使用的话点击上图中的基本信息,阿里有很详细的说明怎样拉取镜像了,就不说了。
安装工具
部署前需要确认自己的机器开启虚拟化了,可以在BIOS中查看:
VT-x or AMD-v virtualization must be enabled in your computer’s BIOS.
虚拟化支持
官方文档点这里,基本流程就是确认好自己本机的虚拟化方式是否支持,目前支持4中方式:
- virtualbox
- vmwarefusion
- kvm
- hyperkit
OS X可以安装virtualbox\VMware Fusion\HyperKit。
Linux可以安装Virtualbox\KVM。
Windows可以安装Virtualbox\HyperKit
我自己是windows的机器,如果专业版的化可以开启hyper-v,我家庭版(哪个大佬支持我升级下)就装个virtualbox好了,virtualbox万能啊,所以minkube默认选择的也是virtualbox。
安装kubectl
官方安装说明,点击这个链接。不过windows实际就下一个exe的文件就能用了,不过这个链接想下载也要科学上网,我把它放到了自己的qiniu上,这里的版本是v1.9.0:
- 原始链接: https://storage.googleapis.com/kubernetes-release/release/v1.9.0/bin/windows/amd64/kubectl.exe
- 葱的qiniu链接:http://7xqb88.com1.z0.glb.clouddn.com/kubectl.exe
下载下来了不要随意放在下载目录,你要把它放好,照顾好它,别不小心删了,丢了……因为你得最终把它所在的目录的路径,添加到系统的PATH
环境变量中,这样在后面才能顺利的使用kubectl命令行。
安装minikube
然后安装minikube,这个支持多种平台啦,在这个页面下载,我选择的是minikube-installer.exe
安装的,也可以直接下载minikube-windows-amd64
,然后重命名minikube.exe
,在把所在目录添加到系统的PATH
环境变量中。
开始部署
到了开始部署的时候啦,windows里面要注意,命令行使用powershell
,并且以管理员身份
打开并执行,别问为啥,踩过的坑。
开始执行吧:
> minikube start
Starting local Kubernetes v1.9.0 cluster...
Starting VM...
Downloading Minikube ISO
E0324 08:45:11.787290 3020 start.go:159] Error starting host: Error attempting to cache minikube ISO from URL: Error downloading Minikube ISO: failed to download: failed to download to temp file: download failed: 5 error(s) occurred:
报错了,这里可以看到minikube会先拉取一个iso镜像,用来启动minikube虚拟机的,这个iso也是在那头,所以需要科学上网,我这里下载的是0.25.1版本的iso:
- 原始链接: https://storage.googleapis.com/minikube/iso/minikube-v0.25.1.iso
- 葱qiniu的链接:http://7xqb88.com1.z0.glb.clouddn.com/minikube-v0.25.1.iso
把iso下载下来,minikube默认放在了C:\Users\<你自己的用户名>\.minikube\cache\iso
里面,所以把iso复制过来就好了。
还有localkube也需要下载:
这个放在C:\Users\<你自己的用户名>\.minikube\cache\localkube
这里就可以了。
然后再次执行:
> minikube start
There is a newer version of minikube available (v0.25.2). Download it here:
https://github.com/kubernetes/minikube/releases/tag/v0.25.2
To disable this notification, run the following:
minikube config set WantUpdateNotification false
Starting local Kubernetes v1.9.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Downloading localkube binary
162.41 MB / 162.41 MB [============================================] 100.00% 0s
0 B / 65 B [----------------------------------------------------------] 0.00%
65 B / 65 B [======================================================] 100.00% 0sSetting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.
这时没有错误了,按照提示kubectl应该已经配置好并能使用了,查看一下pod:
> kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system kube-addon-manager-minikube 0/1 ContainerCreating 0 9m
查看minikube的日志:
> minikube logs
...
Mar 24 01:45:44 minikube localkube[3003]: E0324 01:45:44.934732 3003 healthcheck.go:317] Failed to start node healthz on 0: listen tcp: address 0: missing port in address
Mar 24 01:45:53 minikube localkube[3003]: E0324 01:45:53.893556 3003 remote_runtime.go:92] RunPodSandbox from runtime service failed: rpc error: code = Unknown desc = failed pulling image "gcr.io/google_containers/pause-amd64:3.0": Error response from daemon: Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Mar 24 01:45:53 minikube localkube[3003]: E0324 01:45:53.893723 3003 kuberuntime_sandbox.go:54] CreatePodSandbox for pod "kube-addon-manager-minikube_kube-system(c4c3188325a93a2d7fb1714e1abf1259)" failed: rpc error: code = Unknown desc = failed pulling image "gcr.io/google_containers/pause-amd64:3.0": Error response from daemon: Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Mar 24 01:45:53 minikube localkube[3003]: E0324 01:45:53.893745 3003 kuberuntime_manager.go:647] createPodSandbox for pod "kube-addon-manager-minikube_kube-system(c4c3188325a93a2d7fb1714e1abf1259)" failed: rpc error: code = Unknown desc = failed pulling image "gcr.io/google_containers/pause-amd64:3.0": Error response from daemon: Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Mar 24 01:45:53 minikube localkube[3003]: E0324 01:45:53.893832 3003 pod_workers.go:186] Error syncing pod c4c3188325a93a2d7fb1714e1abf1259 ("kube-addon-manager-minikube_kube-system(c4c3188325a93a2d7fb1714e1abf1259)"), skipping: failed to "CreatePodSandbox" for "kube-addon-manager-minikube_kube-system(c4c3188325a93a2d7fb1714e1abf1259)" with CreatePodSandboxError: "CreatePodSandbox for pod \"kube-addon-manager-minikube_kube-system(c4c3188325a93a2d7fb1714e1abf1259)\" failed: rpc error: code = Unknown desc = failed pulling image \"gcr.io/google_containers/pause-amd64:3.0\": Error response from daemon: Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)"
...
大部分都是拉取镜像有问题,好,这时候我们最前面准备的镜像就有用了,手动将镜像拉取到环境中然后重新tag,这需要我们进入到minikube的虚拟机中操作,minikube提供了进入的命令行:
> minikube ssh
_ _
_ _ ( ) ( )
___ ___ (_) ___ (_)| |/') _ _ | |_ __
/' _ ` _ `\| |/' _ `\| || , < ( ) ( )| '_`\ /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )( ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)
$
这样就成功登陆到minikube的虚拟机中了,在这里依次pull镜像打tag就行了,重复的操作放在脚本里了
#!/bin/bash
# sidecar
docker pull registry.cn-hangzhou.aliyuncs.com/dck8s/k8s-dns-sidecar:latest
docker tag registry.cn-hangzhou.aliyuncs.com/dck8s/k8s-dns-sidecar:latest k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.5
# k8s-dns-kube-dns
docker pull registry.cn-hangzhou.aliyuncs.com/dck8s/k8s-dns-kube-dns:latest
docker tag registry.cn-hangzhou.aliyuncs.com/dck8s/k8s-dns-kube-dns:latest k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.5
# k8s-dns-dnsmasq-nanny
docker pull registry.cn-hangzhou.aliyuncs.com/dck8s/k8s-dns-dnsmasq-nanny:latest
docker tag registry.cn-hangzhou.aliyuncs.com/dck8s/k8s-dns-dnsmasq-nanny:latest k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.5
# kube-addon-manager
docker pull registry.cn-hangzhou.aliyuncs.com/dck8s/kube-addon-manager:latest
docker tag registry.cn-hangzhou.aliyuncs.com/dck8s/kube-addon-manager:latest gcr.io/google-containers/kube-addon-manager:v6.5
# kubernetes-dashboard
docker pull registry.cn-hangzhou.aliyuncs.com/dck8s/kubernetes-dashboard:latest
docker tag registry.cn-hangzhou.aliyuncs.com/dck8s/kubernetes-dashboard:latest k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.1
docker pull registry.cn-hangzhou.aliyuncs.com/dck8s/pause:latest
docker tag registry.cn-hangzhou.aliyuncs.com/dck8s/pause:latest gcr.io/google_containers/pause-amd64:3.0
docker pull registry.cn-hangzhou.aliyuncs.com/dck8s/storage-provisioner:latest
docker tag registry.cn-hangzhou.aliyuncs.com/dck8s/storage-provisioner:latest gcr.io/k8s-minikube/storage-provisioner:v1.8.1
也可以点这里clone下。
$ git clone https://github.com/k8simage/pullimage
cd pullimage
chmod +x minikube_pull_images.sh
./minikube_pull_images.sh
中间如果镜像不全可以按照上面的方式修改脚本,添加镜像啦。
脚本执行结束exit
退出minikube虚拟机,再次查看pods:
> kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system kube-addon-manager-minikube 1/1 Running 0 59m
kube-system kube-dns-54cccfbdf8-65rwt 3/3 Running 0 2m
kube-system kubernetes-dashboard-77d8b98585-cpl4f 1/1 Running 0 2m
kube-system storage-provisioner 1/1 Running 0 2m
这样都处于running的状态下就正常啦,如果有pod失败的直接删除会自动重建就可以了。
最后如果需要启动k8s的dashboard只需要执行:
> minikube dashboard
Opening kubernetes dashboard in default browser...
就会自动打开浏览器进入dashboard的页面啦:
[图片上传失败…(image-5f811c-1521861075194)]
大功告成!
参考链接
官方文档: https://kubernetes.io/docs/getting-started-guides/minikube/
后记
后续准备写个脚本把k8s相关镜像统一拉取到ali上,k8simage上的dockerfile按照标签与镜像标签统一,pullimages脚本可以自动拉取所有镜像并tag。