上家公司虽然有这样那样的问题,但在能让我掌控的服务器资源自由度上,也不是随便在哪家公司就能有的。能随便申请个半打一打的4核8G的虚机来搞事情什么的。。。跳槽后就只有自己的Windows工作机了。Docker Desktop搞了半天也没法启用Kubernetes,这也是为什么之前的“Kubernetes实战”系列到7月就戛然而止的原因。
只靠Docker Desktop,平时开发的时候起个数据库或redis是足够用了,但像service mesh之类的就玩不了了。趁年前有空,搭了一套Minikube,把步骤顺便记录一下。原本想合并到之前kubeadm安装的那篇里,但可能会翻起来不方便,还是单独另开一篇吧。
后续“Kubernetes实战”系列都会基于minikube环境来搭建。
1. 软硬件条件
现在内存也不值钱了,插个16G足够玩了。
操作系统上,虽然Windows 10家庭版+VirtualBox/VMWare也可以,但从硬件利用率角度,还是用Windows 10企业版/专业版/教育版+Hyper-V比较好。
在控制面板->程序->启动或关闭Windows 功能 里面打开所有Hyper-V选项然后重启。
重启后运行systeminfo,看到如下内容,说明操作系统层面已经ok了:
1 | Hyper-V 要求: 已检测到虚拟机监控程序。将不显示 Hyper-V 所需的功能。 |
Docker Desktop是否安装不影响,但在安装Minikube的过程中最好不要启动。在安装过程中报过一个create: precreate: no External vswitch nor Default Switch found
的报错,不确定是不是相关。
顺带提一句,如果装了Docker Desktop,可以在Settings->Daemon->Registry mirrors里填写:https://dockerhub.azk8s.cn
、http://hub-mirror.c.163.com
和https://docker.mirrors.ustc.edu.cn
另外感谢这篇docker/kubernetes国内源/镜像源解决方式 - xinkun的博客 | Xinkun Blog的整理,我也复制一下备忘:
global | proxy in China | format | example |
---|---|---|---|
dockerhub (docker.io) | dockerhub.azk8s.cn | dockerhub.azk8s.cn/<repo-name>/<image-name>:<version> |
dockerhub.azk8s.cn/microsoft/azure-cli:2.0.61 dockerhub.azk8s.cn/library/nginx:1.15 |
gcr.io | gcr.azk8s.cn | gcr.azk8s.cn/<repo-name>/<image-name>:<version> |
gcr.azk8s.cn/google_containers/hyperkube-amd64:v1.13.5 |
quay.io | quay.azk8s.cn | quay.azk8s.cn/<repo-name>/<image-name>:<version> |
quay.azk8s.cn/deis/go-dev:v1.10.0 |
2. 网络条件
以防万一请先关闭Windows防火墙。
因为你懂的那个原因,需要本地搞个SS的梯子。如果哪个步骤因为网络原因卡住了,可以切成代理再试一次。
3. 安装步骤
3.1 安装Minikube
首先注意一下,后续的步骤都需要用管理员权限的命令行来执行。Powershell应该也行。
安装步骤在官方文档里有详细描述,但似乎遗漏了需要先安装Kubernetes Cli的提示。
所以最彻底的方法是通过Chocolatey来安装,它会帮忙把该装的都装好:
1 | choco install minikube |
3.2 Minikube初始启动
接下来就可以通过start命令来启动了。第一次启动可能会因为kubeadm和kubelet镜像下载失败而失败。不过不用担心,可以反复执行的,大不了用minikube delete重置重来。第一次启动主要是看个版本号。
1 | minikube start --vm-driver=hyperv --cpus=2 --memory=6g --image-repository="registry.cn-hangzhou.aliyuncs.com/google_containers" |
PS1. memory参数建议在start的时候就加上。通过minikube config set memory 4096
来调整,需要delete了重新start。
PS2. 有些步骤里会加上一个--registry-mirror=https://registry.docker-cn.com
的参数。但实际Docker的国内站已经挂了(公司都快撑不下去了,有点惨),加个image-repository的参数就足够了。这里image-repository用的是阿里的镜像。
PS3. 如果怀疑是网络问题想通过代理下载,可以添加HTTP_PROXY等参数,例如:
1 | minikube start --vm-driver=hyperv --cpus=2 --memory=6g --image-repository="registry.cn-hangzhou.aliyuncs.com/google_containers" --docker-env HTTP_PROXY=http://127.0.0.1:1080 --docker-env HTTPS_PROXY=http://127.0.0.1:1080 --docker-env NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24 |
3.3 手动下载kubeadm和kubelet
第一次启动可能会非常花时间(视你的网络而定)。如果失败的话,可以根据kubeadm和kubelet下载失败报错信息,来确定k8s的版本。我安装的minikube使用的版本是v1.17.0。
然后可以手动从googleapis网站下载(Windows机器默认没有curl,也可以通过Chocolatey安装,参考这篇:
1 | curl -Lo kubeadm http://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kubeadm |
下载后扔到C:\Users\用户名\.minikube\cache\版本号
的目录里。
如果其他K8S的组件下载失败,也可以使用类似的方式下载后扔到C:\Users\用户名\.minikube\cache\images\registry.cn-hangzhou.aliyuncs.com\google_containers
的目录里。例如kube-proxy:
1 | curl -Lo kube-proxy_v1.17.0 http://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kube-proxy |
但这招对版本号不一样的例如etcd没用。这个我是靠重试多次硬抗的。
对于国内网络来说,这个步骤很花时间,不要急慢慢等。
3.4 更新minikube kubectl
如果同时装了Docker Desktop和minkube,会提示Docker下的kubectl.exe的版本不够高。
1 | * 完成!kubectl 已经配置至 "minikube" |
接下来先用minikube stop
停止,然后用minikube kubectl options
的命令,会提示下载最新版本的kubectl:
1 | $ minikube kubectl options |
最新版的kubectl会下载到C:\Users\用户\.minikube\cache\v版本
的目录里,然后复制到Docker的bin目录(例如C:\Program Files\Docker\Docker\Resources\bin\)里覆盖即可。
4. 验证
安装好后就可以验证了。先看看是不是所有系统容器都启动了:
1 | kubectl get pod -A |
然后可以看看dashboard。本机就是好不用token:
1 | minikube dashboard |
然后也可以照官方的Example里的,创建个echo server来验证。需要注意image里的k8s.gcr.io
需要替换为registry.cn-hangzhou.aliyuncs.com/google_containers
:
1 | kubectl create deployment hello-minikube --image=registry.cn-hangzhou.aliyuncs.com/google_containers/echoserver:1.4 |
最后一句minikube service <service名>
的作用是获取本地集群中指定服务的kubernetes URL。对于以NodePort对外暴露的服务,会自动打开浏览器并跳转到对应的ip+端口。注意对应的ip是Hyper-V管理器中的“vEthernet (Default Switch)”。
5. 启用ingress
minikube启用ingress还是挺简单的,可以参考Installation Guide - NGINX Ingress Controller,一句命令启动:
1 | minikube addons enable ingress |
但有可能会遇到Back-off pulling image
的报错信息。看到image的名字里包含<quay.io>就可以知道又是被墙拦住了。对于类似的问题,可以采用以下的步骤,从Azure拉取后打tag。对于ingress,命令如下:
1 | minikube ssh |
部署完成后可以通过kubectl get pod -n kube-system
的命令来确认ingress是否有安装成功。如果失败的话,最坏结果有可能需要minikube delete后重新start。
6. 常见问题
6.1 minikube delete失败
遇到过一次minikube delete失败,报的是C:\Users\用户名.minikube\machines下某个conf文件找不到。尝试手动删除该目录会报文件被锁定,无法删除。重启后文件夹依然被锁定。
这个时候打开services.msc,停止“Hyper-V 虚拟机管理”服务后,就可以删除了。删除完把这个服务重新启用即可。
6.2 Unable to connect to the server
在kubectl apply命令的时候有些时候会出现Unable to connect to the server
的报错。这种情况下kubectl get node
的命令也会失败。电脑重启后问题解决。原因暂不明。。。可能是minikube的bug。
7. 参考资料
常用操作可以参考这个官方文档:
使用 Minikube 安装 Kubernetes - Kubernetes