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