Kubernetes 集群部署 Metrics Server 获取集群 Metric 数据
Posted zuozewei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 命令来展示集群中的指标数据。
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 ~]#
源码地址:
以上是关于Kubernetes 集群部署 Metrics Server 获取集群 Metric 数据的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes 集群部署 Metrics Server 获取集群 Metric 数据
kubernetes 1.14安装部署metrics-server插件
kubernetes 1.14安装部署metrics-server插件
关于 Kubernetes集群性能监控(kube-prometheus-stack/Metrics Server)的一些笔记