写点什么

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

作者:zuozewei
  • 2021 年 12 月 25 日
  • 本文字数:4493 字

    阅读完需:约 15 分钟

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

前言

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/v1kind: ClusterRolemetadata:  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/v1kind: ClusterRoleBindingmetadata: name: metrics-server:system:auth-delegatorroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:auth-delegatorsubjects: - kind: ServiceAccount name: metrics-server namespace: kube-system
---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: metrics-server-auth-reader namespace: kube-systemroleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: extension-apiserver-authentication-readersubjects: - kind: ServiceAccount name: metrics-server namespace: kube-system
---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: system:metrics-serverrules: - apiGroups: - "" resources: - pods - nodes - nodes/stats - namespaces verbs: - get - list - watch
---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: system:metrics-serverroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:metrics-serversubjects: - kind: ServiceAccount name: metrics-server namespace: kube-system
---apiVersion: v1kind: ServiceAccountmetadata: name: metrics-server namespace: kube-system
复制代码


APIService

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


metrics-api-service.yaml:


## APIServiceapiVersion: apiregistration.k8s.io/v1kind: APIServicemetadata:  name: v1beta1.metrics.k8s.iospec:  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/v1kind: Deploymentmetadata:  name: metrics-server  namespace: kube-system  labels:    k8s-app: metrics-serverspec:  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: v1kind: Servicemetadata: 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 nodeNAME           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-systemNAME                                       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-systemNAME                CPU(cores)   MEMORY(bytes)   calico-node-6wwcc   40m          66Mi            [root@k8s-master-1 ~]# 
复制代码

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

[root@k8s-master-1 ~]# kubectl top pods --all-namespacesNAMESPACE         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 ~]# 
复制代码


源码地址:


发布于: 1 小时前
用户头像

zuozewei

关注

测试及性能领域创作者 | 公众号@7DGroup 2017.12.23 加入

「7DGroup」技术公众号作者,CSDN博客专家、测试领域优质创作者,华为云·云享专家,极客时间《全链路压测实战30讲》专栏作者之一,极客时间《性能测试实战30讲》、《高楼的性能工程实战课》专栏编委。

评论

发布
暂无评论
Kubernetes 集群部署 Metrics Server 获取集群 Metric 数据