Kubernetes 集群部署 Metrics Server 获取集群 Metric 数据

举报
zuozewei 发表于 2021/10/23 10:23:23 2021/10/23
【摘要】 Kubernetes 从 v1.8 开始,资源使用情况的监控可以通过 Metrics API 的形式获取,具体的组件为 Metrics Server,用来替换之前的 Heapster,Heapster从 v1.11 开始逐渐被**废弃**。

前言

Kubernetes 从 v1.8 开始,资源使用情况的监控可以通过 Metrics API 的形式获取,具体的组件为 Metrics Server,用来替换之前的 Heapster,Heapster从 v1.11 开始逐渐被废弃

什么是 Metrics API

介绍 Metrics Server之前,必须要提一下 Metrics API 的概念。

Metrics API 相比于之前的 Hepaste 监控采集方式 是一种新的思路,官方希望核心指标的监控应该是稳定的,版本可控的,且可以直接被用户访问(例如通过使用 kubectl top 命令),或由集群中的控制器使用(如HPA),和其他的 Kubernetes APIS 一样。
官方废弃 Hepaste 项目,就是将核心资源监控提级对待,即像 Pod、Service 那样直接通过 api-server 或者 client 直接访问,不再是安装一个 Hepaste 来汇聚且由 Hepaste 单独管理。

注意:

Kubernetes 的 API Server、kubelet 等组件的 /metrics API。除了常规的 CPU、内存的信息外,这部分信息还主要包括了各个组件的核心监控指标。比如,对于 API Server 来说,它就会在 /metrics API 里,暴露出各个 Controller 的工作队列(Work Queue)的长度、请求的 QPS 和延迟数据等等。这些信息,是检查 Kubernetes 本身工作情况的主要依据。

什么是 Metrics Server

Metrics Server 是 Kubernetes 集群核心监控数据的聚合器(定时从Kubelet的Summary API 采集指标信息),可以通过 Metrics API 的形式获取 Metrics 数据,不过仅仅是获取指标的最新值,数据不做存储,且不负责将指标转发到第三方目标。Metrics Server 还可以与 Kubectl 工具结合使用,提供 Kubectl Top 命令来展示集群中的指标数据。

在这里插入图片描述

图片来源:https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/monitoring_architecture.md

Metrics Server 出现后,新的监控架构将变成上图的样子。

  • 核心流程(黑色部分):这是 Kubernetes正常工作所需要的核心指标,从 Kubelet、cAdvisor 等获取指标数据,再由 Metrics Server 提供给 Dashboard、HPA 控制器等使用。
  • 监控流程(蓝色部分):基于核心指标构建的监控流程,比如 Prometheus 可以从 Metrics Server 获取核心指标,从其他数据源(如 Node Exporter 等)获取非核心指标,再基于它们构建性能监控告警系统。


官网地址:

创建资源文件

应用权限 RBAC

部署 Metrics Server 前需要先提前部署 RBAC 相关配置,这样才能有足够的权限获取系统组件的信息。

metrics-rbac.yaml:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:aggregated-metrics-reader
  labels:
    rbac.authorization.k8s.io/aggregate-to-view: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
rules:
  - apiGroups: ["metrics.k8s.io"]
    resources: ["pods", "nodes"]
    verbs: ["get", "list", "watch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
  - kind: ServiceAccount
    name: metrics-server
    namespace: kube-system

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
  - kind: ServiceAccount
    name: metrics-server
    namespace: kube-system

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
  - apiGroups:
      - ""
    resources:
      - pods
      - nodes
      - nodes/stats
      - namespaces
    verbs:
      - get
      - list
      - watch

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
  - kind: ServiceAccount
    name: metrics-server
    namespace: kube-system

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: metrics-server
  namespace: kube-system

APIService

设置扩展 API Service 工作于聚合层,允许使用其 API 扩展 Kubernetes apiserver,而这些 API 并不是核心 Kubernetes API 的一部分。这里部署 APIservice 资源,来提供 Kubernetes Metrics 指标 API 数据。

metrics-api-service.yaml:

## APIService
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  service:
    name: metrics-server
    namespace: kube-system
    port: 443
  group: metrics.k8s.io
  version: v1beta1
  insecureSkipTLSVerify: true
  groupPriorityMinimum: 100
  versionPriority: 100

Metrics Server 应用

metrics-server-deploy.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    k8s-app: metrics-server
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  template:
    metadata:
      name: metrics-server
      labels:
        k8s-app: metrics-server
    spec:
      serviceAccountName: metrics-server
      volumes:
        # mount in tmp so we can safely use from-scratch images and/or read-only containers
        - name: tmp-dir
          emptyDir: {}
      hostNetwork: true
      containers:
        - name: metrics-server
          image: eipwork/metrics-server:v0.3.7
          # command:
          # - /metrics-server
          # - --kubelet-insecure-tls
          # - --kubelet-preferred-address-types=InternalIP
          args:
            - --cert-dir=/tmp
            - --secure-port=4443
            - --kubelet-insecure-tls=true
            - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,externalDNS
          ports:
            - name: main-port
              containerPort: 4443
              protocol: TCP
          securityContext:
            readOnlyRootFilesystem: true
            runAsNonRoot: true
            runAsUser: 1000
          imagePullPolicy: Always
          volumeMounts:
            - name: tmp-dir
              mountPath: /tmp
      nodeSelector:
        beta.kubernetes.io/os: linux

---
apiVersion: v1
kind: Service
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    kubernetes.io/name: "Metrics-server"
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: metrics-server
  ports:
    - port: 443
      protocol: TCP
      targetPort: 4443

通过 Kubectl 命令部署

# -n:指定部署应用的 Namespace 命名空间
$ kubectl apply -f metrics-rbac.yaml -n kube-system
$ kubectl apply -f metrics-api-service.yaml -n kube-system
$ kubectl apply -f metrics-server-deploy.yaml -n kube-system

命令测试

部署完后,可以通过 kubectl 工具进行测试,默认支持下面命令:

  • kubectl top pod: 获取 Pod 的 CPU、Memory 使信息。
  • kubectl top node: 获取 Node 的 CPU、Memory 使用信息。

获取全部节点指标信息

[root@k8s-master-1 ~]# kubectl top node
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master-1   458m         11%    2143Mi          58%       
k8s-master-2   359m         8%     5081Mi          65%       
k8s-master-3   520m         13%    2939Mi          79%       
k8s-worker-1   639m         10%    7715Mi          60%       
k8s-worker-2   433m         7%     4134Mi          32%       
k8s-worker-3   432m         7%     6025Mi          47%       
k8s-worker-4   533m         8%     9180Mi          71%       
k8s-worker-5   649m         10%    5554Mi          35%       
k8s-worker-6   611m         10%    7905Mi          50%

获取某个 Namespace Pod 的指标信息

[root@k8s-master-1 ~]# kubectl top pods -n kube-system
NAME                                       CPU(cores)   MEMORY(bytes)   
calico-kube-controllers-6c89d944d5-47bfx   3m           10Mi            
calico-node-6wwcc                          37m          67Mi            
calico-node-dtkhk                          38m          68Mi            
calico-node-dtmg7                          47m          47Mi            
calico-node-ffs4r                          48m          65Mi            
calico-node-ghm7j                          37m          29Mi            
calico-node-hj72w                          47m          68Mi            
......          
[root@k8s-master-1 ~]# 

获取某个 Namespace 下某个 Pod 的指标信息

[root@k8s-master-1 ~]# kubectl top pods calico-node-6wwcc -n kube-system
NAME                CPU(cores)   MEMORY(bytes)   
calico-node-6wwcc   40m          66Mi            
[root@k8s-master-1 ~]# 

获取全部 Namespace 下的 Pod 的指标信息

[root@k8s-master-1 ~]# kubectl top pods --all-namespaces
NAMESPACE         NAME                                       CPU(cores)   MEMORY(bytes)   
cattle-system     cattle-cluster-agent-6695f575d4-vpzkd      0m           0Mi             
cattle-system     cattle-cluster-agent-6695f575d4-z5mwl      0m           0Mi             
cattle-system     cattle-cluster-agent-799bd76c7b-7rtpr      0m           2Mi             
default           guestbook-7fcc447874-472cj                 0m           0Mi             
default           guestbook-7fcc447874-58hn4                 0m           0Mi             
default           my-mysql-689bccf96b-qvzp9                  2m           452Mi           
default           mysql-min-589bf8cdc5-nfxqn                 5m           172Mi           
......         
[root@k8s-master-1 ~]# 

源码地址:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。