按照文档 《Kubernetes heapster监控插件安装》 和 《Kubernetes Metrics Server安装》 完成Heapster和Metrics Server之后,想尝试通过kubectl top nodes
查看安装效果,结果抛出下面的错误:
$ kubectl top nodes
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
我用下面一张图简单描述了一下APIService、Service、Pod、kubelet四者的关系,APIService负责对外提供服务,Pod访问个节点的kubelet抓取节点上各种指标数据,然后提供给APIService。
APIService、Service、Pod、kubelet的关系
所以,我首先查看了一下APIService的状态,看APIService是否正常。通过下面的命令查看kube-system/metrics-server
APIService 的状态,可以看到有下面的报错信息:
$ kubectl describe apiservice v1beta1.metrics.k8s.io
Status:
Conditions:
Last Transition Time: 2019-11-28T03:21:59Z
Message: no response from https://10.108.78.78:443: Get https://10.108.78.78:443: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Reason: FailedDiscoveryCheck
Status: False
Type: Available
Events: <none>
从上面信息可以看到,APIService访问后端服务无响应,所以我再去查看Pod的日志:
$ kubectl get pods -n kube-system | grep 'metrics'
metrics-server-799c767987-lxtfk 1/1 Running 0 6h10m
$ kubectl logs metrics-server-799c767987-lxtfk -n kube-system
... unable to get a valid timestamp for metric point for container "filebeat" in pod xxx ...
..., discarding data: no non-zero timestamp on either CPU or memory]
从错误信息可以看到:metrics-server在调用各节点的kubelet获取对应节点上的指标信息时,指标数据没有有效的时间戳
。
根本原因是:某些pod或node没有正常运行
,如下图所示。只要保证pod或node运行正常后,这些错误信息就会消失。
pod运行异常
然而,这个错误并不是根本原因,在纠结了两天之后,我突然想到,既然https请求无法访问,是不是和代理有关系。
我之前在/etc/kubernetes/manifests/kube-apiserver.yaml
中加了一个https代理:
https代理
删掉这个代理问题就解决了,如果不能删除这个代理,也可以配置no_proxy
环境变量,把10.108.78.78加上。
env:
- name: no_proxy
value: 10.108.78.78