• k8s资源指标API及metrics-server资源监控


    简述:

    在k8s早期版本中,对资源的监控使用的是heapster的资源监控工具。

    但是从 Kubernetes 1.8 开始,Kubernetes 通过 Metrics API 获取资源使用指标,例如容器 CPU 和内存使用情况。

    这些度量指标可以由用户直接访问,例如通过使用kubectl top 命令,或者使用集群中的控制器。

    Metrics API: 通过 Metrics API,您可以获得 node 或 pod 当前的资源使用情况(但是不存储)。

    metres-server比 heapster 优势在于: 访问不需要 apiserver 的代理机制,提供认证和授权等; 很多集群内组件依赖它(HPA,scheduler,kubectl top),因此它应该在集群中默认运行;

    k8s从1.11版开始,将集群的监控体系、数据的获取机制转移向metrics-server

    在集群中,若要获取集群内部的资源使用信息,需要通过metrics-server来实现。

    而若要使用metrics-server,就必须创建一个适用于metrics-server的API的资源指标。

    因为,集群中自带的API无法直接识别第三方的资源指标。

    所以这里就要用到自定义的资源指标API功能

    在k8s中,资源指标分两种:

      1.k8s自带的资源指标,也就是说集群内部的资源指标

      2.自定义资源指标,允许用户自定义资源指标来实现用户想要实现的功能

    我们可以通过命令:kubectl api-versions来查看集群中已存在的资源指标API

    重点说明一下:

    metres-server在GitHub项目地址有两个用的比较多的:

      官方稳定版的:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/metrics-server

      这个不知道是不是官方的,不过使用者也很多:https://github.com/kubernetes-incubator/metrics-server/tree/master/deploy

      首先说一下,其实两种方式的我都部署过,但是官方的最新版的metrics-server:v0.3.3和addon-resizer:1.8.5这两个组件,在默认使用资源清单部署时,试了无数次,镜像下载下来了,但死活Running不起来。

      找了好多文档,看了好多博客,就是起不来,可能是技术还没有到位。为了避免踩坑,这里建议使用早点的release-1.11版本,在:

      https://github.com/kubernetes/kubernetes/tree/release-1.11/cluster/addons/metrics-server这个版本中修改一下资源清单就可以Running起来

      第二个kubernetes-incubator没什么太大问题。

    一、使用官方资源清单部署:(release-1.11版)

      1.下载资源清单:

       使用for循环快速下载资源清单:

    1 for file in auth-delegator.yaml auth-reader.yaml metrics-apiservice.yaml metrics-server-deployment.yaml metrics-server-service.yaml resource-reader.yaml ;do wget https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.11/cluster/addons/metrics-server/$file;done

       2.修改资源清单参数:这里使用的镜像为metrics-server:v0.2.1和addon-resizer:1.8.3

     1 vim metrics-server-deployment.yaml
     2 ......
     3       containers:
     4       - name: metrics-server
     5         image: gcr.azk8s.cn/google_containers/metrics-server-amd64:v0.2.1   #修改镜像仓库地址
     6         command:
     7         - /metrics-server
     8 #        - --source=kubernetes.summary_api:''  #注释这行
     9         - --source=kubernetes.summary_api:https://kubernetes.default?kubeletHttps=true&kubeletPort=10250&insecure=true   #添加这行表示不验证客户端证书
    10         ports:
    11         - containerPort: 443
    12           name: https
    13 ......
     1 vim resource-reader.yaml
     2 ......
     3 rules:
     4 - apiGroups:
     5   - ""
     6   resources:
     7   - pods
     8   - nodes
     9   - nodes/stats   #添加这行,否则无法获取其他节点数据。
    10   - namespaces
    11 ......

      3.部署资源清单:

      切换到下载好资源清单的目录下

    1 kubectl apply -f ./

      4.验证:

        查看集群中是否构建metrics-server的API

    1 kubectl api-versions
    2 ......
    3 metrics.k8s.io/v1beta1
    4 ......

       查看metrics-server的pod是否Running

    1 kubectl get pods -n kube-system
    2 ......
    3 NAME                                     READY   STATUS    RESTARTS   AGE
    4 metrics-server-v0.2.1-55c4957fd4-9z65b   2/2     Running   0          8h

         查看kubectl top 命令是否可用:

     1 [root@K8s-master ~]# kubectl top pods
     2 NAME                           CPU(cores)   MEMORY(bytes)   
     3 myapp-deploy-9dc49d6f8-56s7k   0m           2Mi             
     4 myapp-deploy-9dc49d6f8-gsw8c   0m           3Mi             
     5 myapp-deploy-9dc49d6f8-z6mxv   0m           3Mi             
     6 [root@K8s-master ~]# kubectl top nodes
     7 NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
     8 k8s-master   290m         3%     1027Mi          59%       
     9 k8s-node1    46m          4%     463Mi           52%       
    10 k8s-node2    47m          4%     459Mi           52%

      5.疑问:

      即使pod可以Running起来,即使有metrics-server的API,即使可以使用kubectl top命令,但是addon-resizer:1.8.3容器中的日志依然有报错:

    1 [root@K8s-master ~]# kubectl logs kube-state-metrics-8578649b5-gj29z -n kube-system -c addon-resizer
    2 ERROR: logging before flag.Parse: I0605 10:34:09.624889       1 pod_nanny.go:65] Invoked by [/pod_nanny --container=kube-state-metrics --cpu=100m --extra-cpu=1m --memory=100Mi --extra-memory=2Mi --threshold=5 --deployment=kube-state-metrics]
    3 ERROR: logging before flag.Parse: I0605 10:34:09.624969       1 pod_nanny.go:81] Watching namespace: kube-system, pod: kube-state-metrics-8578649b5-gj29z, container: kube-state-metrics.
    4 ERROR: logging before flag.Parse: I0605 10:34:09.624972       1 pod_nanny.go:82] storage: MISSING, extra_storage: 0Gi
    5 ERROR: logging before flag.Parse: I0605 10:34:09.625799       1 pod_nanny.go:171] Failed to read data from config file "MISSING/NannyConfiguration": open MISSING/NannyConfiguration: no such file or directory, using default parameters
    6 ERROR: logging before flag.Parse: I0605 10:34:09.625829       1 pod_nanny.go:109] cpu: 100m, extra_cpu: 1m, memory: 100Mi, extra_memory: 2Mi
    7 ERROR: logging before flag.Parse: I0605 10:34:09.625838       1 pod_nanny.go:138] Resources: [{Base:{i:{value:100 scale:-3} d:{Dec:<nil>} s:100m Format:DecimalSI} ExtraPerNode:{i:{value:1 scale:-3} d:{Dec:<nil>} s:1m Format:DecimalSI} Name:cpu} {Base:{i:{value:104857600 scale:0} d:{Dec:<nil>} s:100Mi Format:BinarySI} ExtraPerNode:{i:{value:2097152 scale:0} d:{Dec:<nil>} s:2Mi Format:BinarySI} Name:memory}]

    期望有大佬可以给出解释

    二、使用kubernetes-incubator的资源清单部署 

      1.下载资源清单(我这里直接克隆整个项目):   

    1 git clone https://github.com/kubernetes-incubator/metrics-server.git

       2.进入目录,修改资源清单:

     1 cd metrics-server/deploy/1.8+/
     2 vim metrics-server-deployment.yaml
     3 ......
     4       containers:
     5       - name: metrics-server
     6         image: gcr.azk8s.cn/google_containers/metrics-server-amd64:v0.3.3  #修改镜像仓库地址
     7         imagePullPolicy: IfNotPresent
     8         command:                                                           #添加这行
     9             - /metrics-server                                              #添加这行        
    10             - --kubelet-preferred-address-types=InternalIP                 #添加这行
    11             - --kubelet-insecure-tls                                       #添加这行表示不验证客户端证书
    12         volumeMounts:
    13         - name: tmp-dir
    14           mountPath: /tmp
     1 vim resource-reader.yaml
     2 ......
     3 rules:
     4 - apiGroups:
     5   - ""
     6   resources:
     7   - pods
     8   - nodes
     9   - namespaces
    10   - nodes/stats  #检查是否存在此项,若不存在,则添加
    11 ......

      3.部署:

    1 kubectl apply -f ./

           4.验证:

      同上面的验证方式一样,这里不在叙述

        使用这种方式部署成功后,查看容器日志,未发现报错:

    1 kubectl logs metrics-server-5cf4b94d8b-pllxh -n kube-system
    2 I0605 15:13:00.513687       1 serving.go:312] Generated self-signed cert (apiserver.local.config/certificates/apiserver.crt, apiserver.local.config/certificates/apiserver.key)
    3 I0605 15:13:01.126262       1 secure_serving.go:116] Serving securely on [::]:443

    至此,metrics-server资源监控插件部署完成

  • 相关阅读:
    垃圾回收器总结(一)
    JVM 总结
    如何提升自己?
    堆和栈的区别
    Java 8 Streams API 详解
    说一说JVM双亲委派机制与Tomcat
    说一说switch关键字的奥秘
    深入了解 Java Resource && Spring Resource
    Spring 动态代理 之 but was actually of type 'com.sun.proxy.$Proxy14 Exception
    架构设计基础:单服务.集群.分布式,基本区别和联系
  • 原文地址:https://www.cnblogs.com/Smbands/p/10982544.html
Copyright © 2020-2023  润新知