由于我国局域网的现状,我在安装minikube的时候出现了问题。
按照官网教程下载来了minikube和kubectl,然后按照官网教程minikube start
。我是在Virtualbox里面的Ubuntu18.04虚拟机里面装的,所以不能嵌套虚拟机,因此采用docker作为容器。
因此,命令变为 minikube start --driver=none
。然而直接运行就会显示
VM is unable to access k8s.gcr.io, you may need to configure a proxy or set --image-repository
然后在之后出现大量报错,类似如下错误
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.18.0: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
为此,我配置了proxy(electron-ssr)。配置proxy的时候遇到了巨多的坑,如下:
-
在设置proxy的时候,一定要注意环境变量是分大小写的,如果一开始设置错了HTTP_PROXY,后来设置了http_proxy,也是会有问题的,必须用
export -n HTTP_PROXY
删除之。 -
即便使用了
export -n HTTP_PROXY
删除了环境变量,如果直接在当前的Shell使用minikube start
命令,也是会出错的,因为此时该变量是从环境变量里删除了,依然存在于当前的Shell中,比如通过echo $HTTP_PROXY
依然可以显示出来。因此要设置HTTP_PROXY=""
来删除这个Shell变量。注意这里等号两边不能有空格! -
一般
minikube start
需要sudo,这样子又会导致一个问题:不使用sudo设置的环境变量在sudo时会丢失,因此可以用以下的方法:sudo export ...
- 更改
/etc/sudoers
,在里面的Defaults env_keep=
后面加上HTTP_PROXY HTTPS_PROXY http_proxy https_proxy NO_PROXY no_proxy
,注意要通过空格分离。
-
官方文档 已经提示设置代理之后需要设置
NO_PROXY
环境变量防止访问本地网络被阻隔。但是在我自己运行的时候,依然会报错:but your NO_PROXY environment does not include the minikube IP (10.0.2.15)
因此需要在
NO_PROXY
里面加上这一项。注意到这里面多个地址并列的时候逗号之间也不能有空格。
在这些设置完之后,也要把环境变量传给Docker。因此命令要变为
export http_proxy="http://127.0.0.1:1081"
export https_proxy="http://127.0.0.1:1081"
export NO_PROXY="localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24,10.0.2.15"
sudo https_proxy=$https_proxy minikube start --driver=none \
--docker-env http_proxy=$http_proxy \
--docker-env https_proxy=$https_proxy \
--docker-env NO_PROXY=$NO_PROXY,$(sudo minikube ip)
这里$(sudo minikube ip)
就是10.0.2.15
。
注意到要用minikube delete
来删除一下之前的安装文件。多次尝试之后,终于出现了如下的输出:
▪ kubelet.resolv-conf=/run/systemd/resolve/resolv.conf
> kubelet.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubeadm.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubectl.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubeadm: 37.96 MiB / 37.96 MiB [---------------] 100.00% 3.41 MiB p/s 11s
> kubectl: 41.98 MiB / 41.98 MiB [-------------] 100.00% 867.31 KiB p/s 50s
> kubelet: 108.01 MiB / 108.01 MiB [---------] 100.00% 578.07 KiB p/s 3m11s
之前一直在kubelet.resolv-conf那里卡着。正当我以为minikube终于要成功start时,又出现了一堆错误:
💥 initialization failed, will try again: run: /bin/bash -c "sudo env PATH=/var/lib/minikube/binaries/v1.18.0:$PATH kubeadm init --config
…
stderr:
W0329 14:24:09.463412 31628 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.18.0: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1…
To see the stack trace of this error execute with --v=5 or higher
💣 Error starting cluster: run: /bin/bash -c “sudo env PATH=/var/lib/minikube/binaries/v1.18.0:$PATH kubeadm init --config /var/tmp/minikube/kubeadm.yaml --ignore-preflight-errors=DirAvailable–etc-kubernetes-manifests,DirAvailable–var-lib-minikube,DirAvailable–var-lib-minikube-etcd,FileAvailable–etc-kubernetes-manifests-kube-scheduler.yaml,FileAvailable–etc-kubernetes-manifests-kube-apiserver.yaml,FileAvailable–etc-kubernetes-manifests-kube-controller-manager.yaml,FileAvailable–etc-kubernetes-manifests-etcd.yaml,Port-10250,Swap,SystemVerification”: exit status 1
stdout:
[init] Using Kubernetes version: v1.18.0
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using ‘kubeadm config images pull’stderr:
W0329 14:33:01.162969 22356 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.18.0: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager:v1.18.0: output: Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
, error: exit status 1…
To see the stack trace of this error execute with --v=5 or higher
😿 minikube is exiting due to an error. If the above message is not useful, open an issue:
👉 https://github.com/kubernetes/minikube/issues/new/choose
看着这么一长串的报错真的令人崩溃,于是我决定关闭代理,直接用镜像。通过查找多方资料,把命令变为
export http_proxy="http://127.0.0.1:1081"
export https_proxy="http://127.0.0.1:1081"
export NO_PROXY="localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24,10.0.2.15"
sudo https_proxy=$https_proxy minikube start --driver=none \
--registry-mirror=https://docker.mirrors.ustc.edu.cn \
--image-mirror-country=cn \
--docker-env http_proxy=$http_proxy \
--docker-env https_proxy=$https_proxy \
--docker-env NO_PROXY=$NO_PROXY,$(sudo minikube ip)
在等待一段时间后,终于显示:
🏄 Done! kubectl is now configured to use “minikube”
再通过
sudo kubectl cluster-info
可以看到如下信息:
Kubernetes master is running at https://10.0.2.15:8443
KubeDNS is running at https://10.0.2.15:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
如果minikube start
成功之后出现如下信息:
To further debug and diagnose cluster problems, use ‘kubectl cluster-info dump’.
The connection to the server 10.0.2.15:8443 was refused - did you specify the right host or port?
很可能是代理问题导致的,注意设置NO_PROXY
变量。