Metrics Server是一个可扩展的、高效的容器资源度量源,用于Kubernetes内置的自动伸缩管道。
kubectl top 可以查看node、pod 的实时资源使用情况:如CPU、内存。但需要预装 Metrics Server ,不然会出现如下错误提示:
kubectl top pods
error: Metrics API not available
Metrics Server 从 Kubelet 收集资源指标,并通过Metrics API在 Kubernetes apiserver 中公开, 以供Horizontal Pod Autoscaler和Vertical Pod Autoscaler使用。指标 API 也可以通过 访问kubectl top,从而更容易调试自动缩放管道。
今天主要介绍安装的过程,以及记录安装过程遇到一些问题。
开始安装
这里我们采用官网给的清单 components.yaml安装最新的 Metrics Server 版本:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
查看是否安装成功:
# kubectl get deployment metrics-server -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
metrics-server 0/1 1 0 118s
发现安装失败。
问题1:镜像拉取失败
查看pod详细信息:
# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
metrics-server-55c774cdbb-jmfz8 0/1 ErrImagePull 0 2m34s
查看pod日志:
# kubectl logs pods/metrics-server-55c774cdbb-jmfz8 -n kube-system
Error from server (BadRequest): container "metrics-server" in pod "metrics-server-55c774cdbb-jmfz8" is waiting to start: trying and failing to pull image
从日志可知是镜像拉取不下来,我们可以修改镜像地址。可以从dockerhub,查找最新版本,如作者安装的版本是:metrics-server:v0.6.1。打开components.yaml , 修改Deployment,spec.containers.coimage 为搜索到的,如“registry.aliyuncs.com/google_containers/metrics-server:v0.6.1",修改完详细如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: metrics-server
strategy:
rollingUpdate:
maxUnavailable: 0
template:
metadata:
labels:
k8s-app: metrics-server
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.1
更新部署deployment:
# kubectl delete deployment metrics-server -n kube-system
deployment.apps "metrics-server" deleted
# kubectl apply -f components.yaml
问题2:证书
更新后,发现另外一个问题:
# server.go:132] unable to fully scrape metrics: unable to fully scrape metrics from node docker-desktop: unable to fetch metrics from node docker-desktop: Get "https://192.168.1.88:10250/stats/summary?only_cpu_and_memory=true": x509: cannot validate certificate for 192.168.1.88 because it doesn't contain any IP SANs
从日志可知是权限验证(证书)出了问题,通过搜索github issues ,issue回复里提供了一个解决方法是在可以关闭证书验证,详细如下:
修改清单components.yam, 增加:
- --kubelet-insecure-tls
修改完 Deplyment详细如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: metrics-server
strategy:
rollingUpdate:
maxUnavailable: 0
template:
metadata:
labels:
k8s-app: metrics-server
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --kubelet-insecure-tls
- --metric-resolution=15s
其中:
–kubelet-preferred-address-types: 优先使用 InternalIP 来访问 kubelet,这样可以避免节点名称没有 DNS 解析记录时,通过节点名称调用节点 kubelet API 失败的情况(未配置时默认的情况);
–kubelet-insecure-tls: kubelet 的 10250 端口使用的是 https 协议,连接需要验证 tls 证书。–kubelet-insecure-tls 不验证客户端证书。
然后,检查是否启动成功:
#kubectl get deployment metrics-server -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
metrics-server 1/1 1 1 14m
success。