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

推荐阅读更多精彩内容