容器-14-国内Windows10环境安装Minikube

上家公司虽然有这样那样的问题,但在能让我掌控的服务器资源自由度上,也不是随便在哪家公司就能有的。能随便申请个半打一打的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.cnhttp://hub-mirror.c.163.comhttps://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
2
curl -Lo kubeadm http://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kubeadm
curl -Lo kubelet http://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kubelet

下载后扔到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
2
* 完成!kubectl 已经配置至 "minikube"
! C:\Program Files\Docker\Docker\Resources\bin\kubectl.exe is version 1.14.0, and is incompatible with Kubernetes 1.17.0. You will need to update C:\Program Files\Docker\Docker\Resources\bin\kubectl.exe or use 'minikube kubectl' to connect with this cluster

接下来先用minikube stop停止,然后用minikube kubectl options的命令,会提示下载最新版本的kubectl:

1
2
$ minikube kubectl options
* 正在下载 kubectl.exe v1.17.0

最新版的kubectl会下载到C:\Users\用户\.minikube\cache\v版本的目录里,然后复制到Docker的bin目录(例如C:\Program Files\Docker\Docker\Resources\bin\)里覆盖即可。

4. 验证

安装好后就可以验证了。先看看是不是所有系统容器都启动了:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7f9c544f75-j6cfj 1/1 Running 1 6h10m
kube-system coredns-7f9c544f75-wpcn7 1/1 Running 1 6h10m
kube-system etcd-minikube 1/1 Running 1 6h10m
kube-system kube-addon-manager-minikube 1/1 Running 1 6h10m
kube-system kube-apiserver-minikube 1/1 Running 1 6h10m
kube-system kube-controller-manager-minikube 1/1 Running 2 6h10m
kube-system kube-proxy-kbnsr 1/1 Running 1 6h10m
kube-system kube-scheduler-minikube 1/1 Running 1 6h10m
kube-system storage-provisioner 1/1 Running 1 6h10m
kubernetes-dashboard dashboard-metrics-scraper-7b64584c5c-6k8f8 1/1 Running 1 6h4m
kubernetes-dashboard kubernetes-dashboard-79d9cd965-565j6 1/1 Running 2 6h4m

然后可以看看dashboard。本机就是好不用token:

1
minikube dashboard

然后也可以照官方的Example里的,创建个echo server来验证。需要注意image里的k8s.gcr.io需要替换为registry.cn-hangzhou.aliyuncs.com/google_containers

1
2
3
kubectl create deployment hello-minikube --image=registry.cn-hangzhou.aliyuncs.com/google_containers/echoserver:1.4
kubectl expose deployment hello-minikube --type=NodePort --port=8080
minikube service hello-minikube

最后一句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
2
3
minikube ssh
docker pull quay.azk8s.cn/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1
docker tag quay.azk8s.cn/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1

部署完成后可以通过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

本文永久链接 [ https://galaxyyao.github.io/2020/01/22/容器-14-国内Windows10环境安装Minikube/ ]