在 minikube (kubernetes) 的早期版本中,使用 heapster 来对集群进行监控,从 1.8 版本之后就逐渐升级为使用 metrics-server 来完成资源监控的功能。 安装 metrics-server 很简单,但在经常会因为网络问题导致出现 ImagePullBackOff 的错误。
出错现象
在 minikube 中,为激活 metrics-server , 只需要简单的执行:
1 | minikube addons enable metrics-server |
系统会反馈:
1 | * The 'metrics-server' addon is enabled |
再执行 list 命令:
1 | minikube addons list |
也可以看得到 metrics-server 已经被激活了:
1 | |-----------------------------|----------|--------------| |
但如果这时我们执行 top 命令:
1 | kubectl top pod |
得到的却是如下的错误信息:
1 | Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io) |
说明 metrics-server 其实并没有安装好。 为什么呢?
通过执行 get pod 命令我们来找原因:
1 | kubectl get pod -n kube-system |
可以得到如下结果:
1 | NAME READY STATUS RESTARTS AGE |
可以看到,metrics-server 对应的 POD 没有启动成功, 现在处于: ImagePullBackOff 状态。
进一步执行 describe 命令,查看事件:
1 | describe pod metrics-server-6754dbc9df-lhp9p -n kube-system |
可以得到:
1 | Type Reason Age From Message |
这下比较清楚了,是因为不能访问 k8s.gcr.io 导致拉取不到镜像 metrics-server-amd64:v0.2.1 ,从而造成了不能正确启动所需要的 POD。
手动拉取镜像
要解决这个问题,我们首先需要拉取到镜像。因为不能访问 k8s.gcr.io, 那我们就从国内下载,一次执行以下命令:
- 登录到 minikube 虚拟机中
1 | minikube ssh |
- 从阿里的的仓库拉取镜像
1 | docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.2.1 |
- 为镜像加上标签
1 | docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.2.1 k8s.gcr.io/metrics-server-amd64:v0.2.1 |
这样在 minikube 中就有了 metrics-server 正确的镜像。
修改 metrics-server 的部署文件
在本地有了镜像后,你会发现 minikube 仍然要从 k8s.gcr.io 去取镜像,这个时候就需要修改 metrics-server 的部署文件了。执行:
1 | kubectl -n kube-system edit deployment metrics-server |
执行以后,会在你系统默认的编辑器里打开 metrics-server 文件,如下:
1 | # Please edit the object below. Lines beginning with a '#' will be ignored, |
在文件的 47 行, 可以看到当前的拉取模式是: Always, 也就是无论本地是否已经有了镜像,都会从 k8s.gcr.io 取。 将该策略改为: IfNotPresent, 让系统优先使用本地的镜像。 保存文件以后,系统会自动更新 POD, 不需要重新 enable 这个 addon。
完成以后步骤后,就可以执行 top 命令了:
1 | kubectl top pod |
在我的环境中,显示:
1 | NAME CPU(cores) MEMORY(bytes) |
当然,激活 metrics-server 部署为了执行这个简单的 top 命令,而是为了通过 metrics api 获取更多的监控信息,并可以配置根据条件自动化的伸缩应用。