×

windows上用minikube部署k8s(1.9.0)

96
cheneydc
2018.03.24 11:12* 字数 1870

原文作者: Cheney Dong
原文链接: https://cheneydc.me/2018/03/24/deploy-minikube-on-windows/

k8s上的部署官方给了几种方式,机器多可以用kubeadm,自己只有一个机器,可以用minikube来弄个单机的虚拟机环境进行学习。当然也有kubespray可以搞定生产环境级别的k8s环境部署。最近葱苦于笔记本上没有环境使用只能先试试minikube了,最难能可贵的是minikube支持多种虚拟化方式,我windows的机器也可以试试啦!按照官方知道还是很便捷的,所有部署方式中,最麻烦的莫过于镜像啦,因为镜像在那头,我在这头……

准备镜像

既然镜像是最麻烦的,那我就先准备镜像吧,我的方案是:

  1. 将所有使用到的镜像写到放到自己的github上的Dockerfile里
  2. 在阿里云的容器镜像服务里面,创建自己的镜像仓库,分别关联第1步中的Dockerfile
  3. 通过上一步构建的自己的镜像仓库进行拉取镜像,然后将镜像打上相应的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:

下载下来了不要随意放在下载目录,你要把它放好,照顾好它,别不小心删了,丢了……因为你得最终把它所在的目录的路径,添加到系统的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:

把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。

云计算
Web note ad 1