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

x33g5p2x  于2021-10-25 转载在 Kubernetes  
字(6.1k)|赞(0)|评价(0)|浏览(449)

前言

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 ~]#

源码地址:

相关文章