Metrics Server 是 Kubernetes 集群核心监控数据的聚合器,Metrics Server 从 Kubelet 收集资源指标,并通过 Merics API 在 Kubernetes APIServer 中提供给缩放资源对象 HPA 使用。也可以通过 Metrics API 提供的 Kubectl top 查看 Pod 资源占用情况,从而实现对资源的自动缩放。
主要是基于 Kubernetes 集群的 CPU、内存的水平自动缩放。可以支持多达 5000 个集群节点,每个节点的资源占用率非常低,Metrics Server 在每个节点上占用 0.5m CPU 和 4M 内存。
Metrics Server 是 Kubernetes 监控组件中的重要一部分,Metrics Server 主要分为 API 和 Server 两大部分。其中 Metrics API 部分主要通过 APIServer 对外暴露 Pod 资源使用情况,比如:HPA、kubectl top、Kubernetes dashboard 等。Metrics Server 是根据 Kubernetes 监控架构进行实施,该组件会定期通过 Summary API 从 Kubelet 所在集群节点获取服务指标,然后将指标汇总、存储到内存中,仅仅存储指标最新状态,一旦重启组件数据将会丢失。现在通过 Metrics Server 采集到了数据,也暴露了 API 那么通过 kube-aggregator 统一把 API Server(/apis/metrics) 数据转发给 Metrics Server,最后通过 metrics api 统一暴露出去。

Metrics server出现后,新的 Kubernetes 监控架构将变成上图的样子 核心流程(黑色部分):这是 Kubernetes正常工作所需要的核心度量,从 Kubelet、cAdvisor 等获取度量数据,再由metrics-server提供给 Dashboard、HPA 控制器等使用。监控流程(蓝色部分):基于核心度量构建的监控流程,比如 Prometheus 可以从 metrics-server 获取核心度量,从其他数据源(如 Node Exporter 等)获取非核心度量,再基于它们构建监控告警系统。
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
Metrics Server 抽象了 HorizontalPodAutoscaler 资源对象,通过观察 Pod CPU、内存或者其它自定义指标自动缩放 Controller、Deployment、StatefulSet中的 POd 数量,注意 HorizontalPodAutoscaler 不支持无法缩放的对象,比如 DaemonSet。下面以 Deployment 举例说明 HorizontalPodAutosacler 的使用
apiVersion: apps/v1
kind: Deployment
metadata:
name: cck-deployment
spec:
selector:
matchLabels:
app: cck
replicas: 1
template:
metadata:
labels:
app: cck
spec:
containers:
- name: cck
image: cck:2
imagePullPolicy: IfNotPresent
#command: ["/bin/bash","-c", "java -jar /k8s/cck.jar"]
ports:
- containerPort: 8080
resources:
requests:
cpu: 500m
memory: 2G
limits:
cpu: 1000m
memory: 4G
env:
- name: LANG
value: en_US.utf8
volumeMounts:
- mountPath: /etc/localtime
name: date-conf
........apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: cck-deployment
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: cck-deployment
minReplicas: 1
maxReplicas: 8
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 70
- type: Resource
resource:
name: memory
targetAverageValue: 1.5G[root@k8s-master k8s]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
cck-deployment Deployment/cck-deployment 1564235349333m/1.5Gi, 50%/70% 1 8 3 35h
[root@k8s-master k8s]# kubectl describe hpa cck-deployment
Name: cck-deployment
Namespace: default
Labels: <none>
Annotations: <none>
CreationTimestamp: Thu, 28 May 2020 22:46:59 +0800
Reference: Deployment/cck-deployment
Metrics: ( current / target )
resource memory on pods: 1564128522666m / 1.5Gi
resource cpu on pods (as a percentage of request): 48% (241m) / 70%
Min replicas: 1
Max replicas: 8
Deployment pods: 3 current / 3 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
Events: <none>在上述执行过程中,可能会出现
no metrics known for pod或者 kubectl get hpa 当前资源占用情况提示 unkonwn。出现如下问题是因为网络不通导致,通过如下图设置解决。

如上所示讲述了 HorizontalPodAutoscaler 对 Deployment 资源对象的扩容过程。
如上简单介绍了 Kubernetes Metrics Server 安装使用,以及工作原理,初次使用,如有误区,请多包含。或者直接查看一手资料 :https://github.com/kubernetes-sigs/metrics-server