前言
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 工具进行测试,默认支持下面命令:
获取全部节点指标信息
[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 ~]#
复制代码
源码地址:
评论