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 中公开, 以供Horizo​​ntal 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。

参考

jefffff

Stay hungry. Stay Foolish COOL

Go backend developer

China Amoy