使用Prometheus Adapter自动扩展Pod
首先
通过自定义指标进行Pod的水平扩展,介绍了自定义指标的种类、设置方法以及用于提供自定义指标的API服务器。本次将介绍其中之一——Prometheus适配器的概述以及使用它进行Pod的自动伸缩。
Prometheus适配器是什么?
Prometheus适配器1是用于将Prometheus的任何指标用作自定义外部指标的API服务器。目前它由DirectXMan维护的个人存储库开发,但正在转移至kubernetes-sigs,将成为Kubernetes官方存储库之一。
上面的图表是Prometheus Adapter的基本结构。Prometheus Adapter作为连接Kubernetes和Prometheus之间的适配器,起到了重要作用。它根据在ConfigMap中设置的自定义指标规则,从Prometheus获取实际指标,并将其格式化和公开,以符合指标API的格式要求。
安装方法
Prometheus Adapter提供了用于安装的Helm Chart。您可以通过Helm的Values文件来修改Prometheus服务器的地址以及接下来要介绍的度量规则等各种配置。请根据各个环境进行修改。
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install --name my-release prometheus-community/prometheus-adapter
如果正常启动,Custom Metrics API 的响应将如下返回。(根据度量规则设置,resources 数组的内容可能会有所不同。)
$ kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1
{"kind":"APIResourceList","apiVersion":"v1","groupVersion":"custom.metrics.k8s.io/v1beta1","resources":[]}
自定义指标规则设定
以下是有关Prometheus适配器处理内容和顺序的排序列表。首先,确认Prometheus是否存在相关指标,如果存在,则将其与实际的Kubernetes资源关联起来。然后,将其作为指标API进行公开。
-
- 发现:确认有效指标
-
- 关联:指标与Kubernetes资源的关联
-
- 命名:用于公开自定义指标API的命名
- 查询:执行Prometheus查询以获取指标
将自定义指标的设置保存在ConfigMap中,保存为config.yaml文件。config.yaml文件的格式根据前面介绍的Prometheus Adapter的工作方式,大致分为四个部分。此外,可以设置多个规则。
rules:
# Discovery: Discovery対象のSeriesを指定する (関数は使えない)
- seriesQuery: 'http_request_duration_seconds_bucket{deploy_namespace!="",deploy_name!=""}'
# Association: メトリクスをマッピングするリソース設定、APIのパスになる
resources:
overrides:
deploy_name: {resource: "deployment", group: "apps"}
deploy_namespace: {resource: "namespace"}
# Naming: メトリクス名として公開する名前
name:
as: 'http_request_per_seconds'
# Quering: 公開するメトリクスをPrometheusから取得するためのクエリ
metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
给予读取权限
由于Prometheus Adapter没有被授予除Pod以外的资源的访问权限,如果要设置其他资源的自定义指标,则需要进行权限授予。读取资源的权限是由名为prometheus-adapter-resource-reader的ClusterRole定义的,因此请在此处添加所需的设置。例如,如果想要添加Deployment的访问权限,可以按照以下方式进行设置。
- apiGroups:
- "apps"
resources:
- deployments
verbs:
- get
- list
- watch
紧急情况下
如果配置错误,Metrics API 将返回一个空的资源数组。Prometheus Adapter 仓库中也有一个问题,即资源经常变为空,但大多数情况下是用户配置错误。请注意以下几点,重新检查配置。
-
- 请确认 Prometheus Adapter 的 Pod 是否正常启动且没有输出错误日志
-
- 请确认 SeriesQuery 是否没有使用函数
-
- 请确认在 Naming 中使用的标签是否包含在指标中
-
- 请确认 Prometheus 是否能够正常返回相应的查询结果
- 请确认有关资源的权限是否已在 RBAC 中授予
确认已设置的自定义指标。
如果所有设置都成功完成,您就可以调用设置的自定义度量API。使用kubectl get命令调用API的根路径时,会显示已注册的自定义度量列表。
$ kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 | jq
{
"kind": "APIResourceList",
"apiVersion": "v1",
"groupVersion": "custom.metrics.k8s.io/v1beta1",
"resources": [
{
"name": "namespaces/http_request_per_seconds",
"singularName": "",
"namespaced": false,
"kind": "MetricValueList",
"verbs": [
"get"
]
},
{
"name": "service/http_request_per_seconds",
"singularName": "",
"namespaced": true,
"kind": "MetricValueList",
"verbs": [
"get"
]
}
]
}
在namespace中无法使用通配符(*),但在name中可以使用通配符来进行匹配。value的响应是指此时的度量值。
$ kubectl get --raw '/apis/custom.metrics.k8s.io/v1beta1/namespaces/test_namespace/deployments.apps/*/http_request
_per_seconds'|jq
{
"kind": "MetricValueList",
"apiVersion": "custom.metrics.k8s.io/v1beta1",
"metadata": {
"selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/test_namespace/deployments.apps/%2A/http_request_per_seconds"
},
"items": [
{
"describedObject": {
"kind": "Deployment",
"namespace": "test_namespace",
"name": "testapp",
"apiVersion": "apps/v1"
},
"metricName": "http_request_per_seconds",
"timestamp": "2020-11-22T08:40:47Z",
"value": "68",
"selector": null
}
]
}
使用自定义指标来验证HPA的操作
一旦自定义API能够成功返回值,接下来只需在HPA中设置自定义指标即可。(有关详细设置方法,请参阅上一篇文章。)下面的清单是设置HPA的示例,其中包括了名为http_request_per_seconds的自定义指标。
kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2beta1
metadata:
name: testapp
spec:
scaleTargetRef:
kind: Deployment
name: testapp
metrics:
# Pod以外のカスタムメトリクスはObject
- type: Object
object:
describedObject:
apiVersion: apps/v1
kind: Deployment
name: testapp
metric:
name: http_request_per_seconds # カスタムメトリクス名
target:
type: Value # Value
value: "100" # しきい値
当获取到所创建的HPA资源时,可以确认通过.status.conditions下的ScalingActive类型成功地设置了自定义指标。另外,在使用`hey`命令施加负载时,可以确认在超过阈值时进行了扩展。
$ kubectl get hpa.v2beta2.autoscaling testapp -n test_namespace -o yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
...
metrics:
- object:
describedObject:
apiVersion: apps/v1
kind: Deployment
name: testapp
metric:
name: http_request_per_seconds
target:
type: Value
value: "100"
type: Object
...
status:
conditions:
- lastTransitionTime: "2020-11-22T07:42:03Z"
message: the HPA was able to successfully calculate a replica count from object
metric http_request_per_seconds
reason: ValidMetricFound
status: "True"
type: ScalingActive
...
最后
本次解說了即將被納入kubernetes-sigs的Prometheus Adapter。此外,用於安裝的Helm Chart已經移交給Prometheus社群,與官方的Stable Charts存儲庫一致。對於使用Prometheus進行指標管理的人來說,在使用HPA自定義指標時,這將是一個不錯的選擇。
DirectXMan12/k8s-prometheus-adapter是使用Prometheus实现custom.metrics.K8s.io API的一个项目。
将DirectXMan12/k8s-prometheus-adapter迁移到kubernetes-sigs。
在prometheus-community/helm-charts的主分支下的helm-charts/charts/prometheus-adapter目录。
参考链接:https://github.com/prometheus-community/helm-charts/blob/main/charts/prometheus-adapter/values.yaml。