Kubernetes之资源指标

Metrics Server 是实现了 Metrics API 的元件,其目标是取代 Heapster 作位 Pod 与 Node 提供资源的 Usage metrics,该元件会从每个 Kubernetes 节点上的 Kubelet 所公开的 Summary API 即10250端口中收集 Metrics。并将收集的信息存储在内存中,所以当通过kubectl top不能查看资源数据的历史情况,其它资源指标数据则通过prometheus采集了。

  • Horizontal Pod Autoscaler(HPA)控制器用于实现基于CPU使用率进行自动Pod伸缩的功能。
  • HPA控制器基于Master的kube-controller-manager服务启动参数–horizontal-pod-autoscaler-sync-period定义是时长(默认30秒),周期性监控目标Pod的CPU使用率,并在满足条件时对ReplicationController或Deployment中的Pod副本数进行调整,以符合用户定义的平均Pod CPU使用率。
  • 在新版本的kubernetes中 Pod CPU使用率不在来源于heapster,而是来自于metrics-server
  • 官网原话是 The –horizontal-pod-autoscaler-use-rest-clients is true or unset. Setting this to false switches to Heapster-based autoscaling, which is deprecated.
  • yml 文件来自于github https://github.com/kubernetes-incubator/metrics-server/tree/master/deploy/1.8+
  • /etc/kubernetes/pki/front-proxy-ca.pem 文件来自于部署kubernetes集群
  • 需要对yml文件进行修改才可使用 改动自行见文件

开启聚合层(Aggregation Layer)

1
2
3
4
5
6
7
8
设置apiserver相关参数
--requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.pem \
--proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.pem \
--proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client-key.pem \
--requestheader-allowed-names=aggregator \
--requestheader-group-headers=X-Remote-Group \
--requestheader-extra-headers-prefix=X-Remote-Extra- \
--requestheader-username-headers=X-Remote-User \

关于聚合层的一些知识

聚合层运行在apiserver进程内部,允许用户为集群安装额外的Kubernetes风格的API,扩展core API的功能。聚合层需要启动apiserver的时候开启方可使用。
在用户注册扩展资源之前,聚合层什么也不做。用户要注册API,必需向系统中添加一个APIService对象,用来声明API的URL路径以及处理请求的后端APIService。此后,聚合层会将发往那个路径的所有请求(e.g. /apis/metrics.k8s.io/v1beta1/nodes)都转发给注册的APIService。

metrics-server: 它也是一种API Server,提供了核心的Metrics API,就像k8s组件kube-apiserver提供了很多API群组一样,但它不是k8s组成部分,而是托管运行在k8s之上的Pod。为了让用户无缝的使用metrics-server当中的API,还需要把这类自定义的API,通过聚合器聚合到核心API组里,然后可以把此API当作是核心API的一部分,通过kubectl api-versions可直接查看。

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: apiregistration.k8s.io/v1beta1
kind: APIService
metadata:
name: v1beta1.metrics.k8s.io
spec:
service:
name: metrics-server
namespace: kube-system
group: metrics.k8s.io
version: v1beta1
insecureSkipTLSVerify: true
groupPriorityMinimum: 100
versionPriority: 10

如果APIService里指定了svc,那么请求kube-apiserver的web路径的时候kube-apiserver会把请求转发到你选中的svc上,这里可以看官方文件里一部分内容。当我们使用kubectl top node的时候实际是请求kube-apiserver的url路径/apis/metrics.k8s.io/v1beta1/nodes,由于创建了metrics-server的APIService,请求会被转发到svc的pod,pod工作流程是获取node列表,然后去请求node上的kubelet的metrics端口获取metrics信息收集起来,信息包括了node的基本cpu和内存以及上面跑的pod的cpu和内存。这之前流量是kube-apiserver到pod上中间经过svc的ip,如果没有kube-proxy和网络组件就无法通信。

利用nginx反向代理来理解:

1
2
3
location /apis/metrics.k8s.io/ {
to svc pod;
}

小细节:(使用如下命令可查看详细的请求)

[root@master-1 1.8+]# kubectl -v=8 top node

首先在k8s-m1测试一下 kubectl top 指令:

1
2
[root@master-1 ~]#  kubectl top node
Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)

发现 top 命令无法取得 Metrics,这表示 Kubernetes 集群没有安装 Heapster 或着 Metrics Server 来提供 Metrics API 给 top 指令取得资源使用量。

由于上述问题,我们要在k8s-m1部署 Metrics Server来解决:

1
2
3
4
5
6
7
8
9
[root@master-1 1.8+]# ll
total 28
-rw-r----- 1 root root 384 Mar 15 16:42 aggregated-metrics-reader.yaml
-rw-r----- 1 root root 308 Mar 15 16:42 auth-delegator.yaml
-rw-r----- 1 root root 329 Mar 15 16:42 auth-reader.yaml
-rw-r----- 1 root root 298 Mar 15 16:42 metrics-apiservice.yaml
-rw-r----- 1 root root 947 Mar 20 11:59 metrics-server-deployment.yaml
-rw-r----- 1 root root 249 Mar 15 16:42 metrics-server-service.yaml
-rw-r----- 1 root root 502 Mar 15 16:42 resource-reader.yaml

修改metrics-server-deployment.yaml文件

1
2
3
4
5
6
...
image: zhangguanzhang/gcr.io.google_containers.metrics-server-amd64:v0.3.1
args:
- --kubelet-preferred-address-types=InternalIP
- --kubelet-insecure-tls
....
  • metrics-server这个容器不能通过CoreDNS 10.96.0.10:53 解析各Node的主机名,metrics-server连节点时默认是连接节点的主机名,需要加个参数,让它连接节点的IP:“–kubelet-preferred-address-types=InternalIP”
  • 因为10250是https端口,连接它时需要提供证书,所以加上–kubelet-insecure-tls,表示不验证客户端证书。

应用当前目录下的所有yml文件

1
2
3
4
5
6
7
8
9
10
[root@master-1 1.8+]# kubectl apply -f .
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader unchanged
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator unchanged
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader unchanged
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io unchanged
serviceaccount/metrics-server unchanged
deployment.extensions/metrics-server unchanged
service/metrics-server unchanged
clusterrole.rbac.authorization.k8s.io/system:metrics-server unchanged
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server unchanged

查看pod状态

1
2
3
[root@master-1 1.8+]# kubectl get pod -n kube-system -l  k8s-app=metrics-server
NAME READY STATUS RESTARTS AGE
metrics-server-7b5c5864ff-zr2k7 1/1 Running 0 4h1m

完成后,等待一段时间(约 30s - 1m)收集 Metrics,再次执行 kubectl top 指令查看:

1
2
3
4
5
[root@master-1 1.8+]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master-1 389m 4% 3908Mi 3%
node-0 129m 1% 2582Mi 2%
node-1 193m 2% 19716Mi 17%

使用HTTP代理访问Kubernetes API

1
2
此命令启动Kubernetes API服务器的代理:
kubectl proxy --port=8080

访问Kubernetes API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
当代理服务器正在运行,则可以使用curl或wget访问API。

获取API版本:

curl http://localhost:8080/api/

{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.2.15:8443"
}
]
}

Horizontal Pod Autoscaler(HPA)

Horizontal Pod Autoscaling,简称HPA,是Kubernetes中实现POD水平自动伸缩的功能。为什么要水平而不叫垂直, 那是因为自动扩展主要分为两种:

  • 水平扩展(scale out),针对于实例数目的增减
  • 垂直扩展(scal up),即单个实例可以使用的资源的增减, 比如增加cpu和增大内存而HPA属于前者。它可以根据CPU使用率或应用自定义metrics自动扩展Pod数量(支持 replication controller、deployment 和 replica set)

HPA的检测周期由kube-controller-manager的参数控制:

参数 默认值 描述
–horizontal-pod-autoscaler-sync-period 30s HPA控制管理器每隔30s查询metrics的资源使用情况。
–horizontal-pod-autoscaler-downscale-delay 5m 完成缩减操作后,HPA必须等待多长时间才能启动另一个缩减操作。
–horizontal-pod-autoscaler-upscale-delay 3m 完成扩容操作后,HPA必须等待多长时间才能启动另一个扩容操作。

Horizontal Pod Autoscaler API对象

HPA是Kubernetes autoscalingAPI组中的API资源。当前的稳定版本autoscaling/v1,仅包括对CPU自动缩放的支持。要获得基于内存和自定义指标进行扩展的额外支持,请改用测试版:autoscaling/v2beta1。

HPA清单定义示例

以下代码段演示了在HPA清单中使用不同的指令。请参阅示例下面的列表以了解每个指令的用途。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: hello-world
spec:
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: Deployment
name: hello-world
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
- type: Resource
resource:
name: memory
targetAverageValue: 100Mi
指令 描述
apiVersion: autoscaling/v2beta1 autoscaling正在使用的Kubernetes API组的版本。此示例清单使用autoscaling/v2beta1版本,因此启用了按CPU和内存进行扩展。
name: hello-world 表示HPA正在为deployment中的hello-word执行自动扩展。
minReplicas: 1 表示运行的最小副本数不能低于1。
maxReplicas: 10 表示deployment中最大副本数不能超过10。
targetAverageUtilization: 50 表示当平均运行pod使用超过其请求CPU的50%时,deployment将扩展pod。
targetAverageValue: 100Mi 表示当平均运行pod使用超过100Mi的内存时,deployment将扩展pod。

需要注意的是explain命令可能会显示旧的group/version,我们可以通过–api-version参数显式的方式制定我们需要获取的版本,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@master-1 serviceMonitor]# kubectl explain hpa.spec --api-version autoscaling/v2beta1
KIND: HorizontalPodAutoscaler
VERSION: autoscaling/v2beta1

RESOURCE: spec <Object>

DESCRIPTION:
spec is the specification for the behaviour of the autoscaler. More info:
https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status.

HorizontalPodAutoscalerSpec describes the desired functionality of the
HorizontalPodAutoscaler.

FIELDS:
maxReplicas <integer> -required-
maxReplicas is the upper limit for the number of replicas to which the
autoscaler can scale up. It cannot be less that minReplicas.

metrics <[]Object>
metrics contains the specifications for which to use to calculate the
desired replica count (the maximum replica count across all metrics will be
used). The desired replica count is calculated multiplying the ratio
between the target value and the current value by the current number of
pods. Ergo, metrics used must decrease as the pod count is increased, and
vice-versa. See the individual metric source types for more information
about how each type of metric must respond.

minReplicas <integer>
minReplicas is the lower limit for the number of replicas to which the
autoscaler can scale down. It defaults to 1 pod.

scaleTargetRef <Object> -required-
scaleTargetRef points to the target resource to scale, and is used to the
pods for which metrics should be collected, as well as to actually change
the replica count.

Kubernetes之资源指标
https://system51.github.io/2019/08/26/Kubernetes-Resource-metrics/
作者
Mr.Ye
发布于
2019年8月26日
许可协议