k8s top命令
K8S top命令的作用
我们通常可以基于top命令来查看节点上的资源使用情况,可以带两个参数nodes和pods通过这个命令,分别用于查看节点和pods的资源使用情况,这对于我们快速查看k8s集群以及pod的资源利用率,从而提醒业务或者系统管理人员及时的对集群扩容,调整Pod的资源请求。
下面是这个命令显示的一个常规的输出:
yuxianbing@61d84e9891:~$ kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
node1 96m 0% 5796Mi 19%
node2 91m 0% 2950Mi 9%
......
但是这个命令新旧版本的实现上有差异,主要分水岭是从1.9.X版本开始。
1.9.X版本的top命令的实现
kubectl top命令依赖于heapster组件,我们用下面的内容创建heapster.yaml文件:
apiVersion: v1
kind: ServiceAccount
metadata:
name: heapster
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: heapster
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:heapster
subjects:
- kind: ServiceAccount
name: heapster
namespace: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: heapster
namespace: kube-system
spec:
replicas: 1
template:
metadata:
labels:
task: monitoring
k8s-app: heapster
spec:
serviceAccountName: heapster
containers:
- name: heapster
image: k8s.gcr.io/heapster-amd64:v1.5.3
imagePullPolicy: IfNotPresent
command:
- /heapster
- --source=kubernetes:https://kubernetes.default
---
apiVersion: v1
kind: Service
metadata:
labels:
task: monitoring
# For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
# If you are NOT using this as an addon, you should comment out this line.
kubernetes.io/cluster-service: 'true'
kubernetes.io/name: Heapster
name: heapster
namespace: kube-system
spec:
ports:
- port: 80
targetPort: 8082
selector:
k8s-app: heapster
并运行kubectl apply -f heapster.yaml部署好heapster,就能通过旧版本的kubectl来执行top命令获取到资源利用率。
该版本的实现原理是,从heapster组件中读取收集的监控数据,由于heapster已经是淘汰的版本,这里不做深入的分析了。
最新版本的top命令的实现
新版本已经用metrics server替代了heapster,下面是K8S的监控架构图:
monitoring_architecture.png监控架构中包含了指标收集流以及监控流两个部分,这里我们主要讨论的是指标收集部分。
在这里我们有两个指标源:
- kubelet:提供节点/POD/容器使用信息,它封装了cAdvisor来提供这些核心系统指标;
- resource estimator:可以在K8S中运行为Daemonset,并从Kubelet中获取裸的资源使用情况数据,经过处理后,变成资源的预估信息,用于高级调度使用。
Metrics Server负责从指标源中抓取数据,它不负责指标数据的持久化,只保留最近的数据(注意:kubectl top命令只用到了kubelet相关的核心指标),与此同时,Metrics Server会通过Aggregated API Servers模式把自己的API暴漏给API Server。
所以从客户端使用视角来看,访问Metrics Server就想访问API Server 一样,而kubectl就是这样的一种客户端,下面是Metrics Server暴漏的API信息:
root # kubectl api-versions | grep metrics
metrics.k8s.io/v1beta1
我们可以通过下面的API来访问Metrics API:
http://127.0.0.1:8080/apis/metrics.k8s.io/v1beta1/nodes
http://127.0.0.1:8080/apis/metrics.k8s.io/v1beta1/nodes/
http://127.0.0.1:8080/apis/metrics.k8s.io/v1beta1/pods
http://127.0.0.1:8080/apis/metrics.k8s.io/v1beta1/namespace//pods/
也可以直接通过 kubectl 命令来访问这些 API,比如:
kubectl get –raw apis/metrics.k8s.io/v1beta1/nodes
kubectl get –raw apis/metrics.k8s.io/v1beta1/pods
kubectl get –raw apis/metrics.k8s.io/v1beta1/nodes/
kubectl get –raw apis/metrics.k8s.io/v1beta1/namespace//pods/
部署Metrics Server需要注意的点
kubelet启动的时候,需要加上下面的参数:
--authentication-token-webhook --authorization-mode=Webhook