kube-prometheus 安装之后,虽然安装了prometheus-adapter,但默认是没有注册这个apiservice:v1beta1.custom.metrics.k8s.io,所以默认无法支持自定义指标。

我们可以使用如下yaml 手动注册这个apiservice(这里需要注意service的名prometheus-adapter和namespace要与实际安装的环境对应,如下是kube-prometheus默认值):

apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    app.kubernetes.io/component: metrics
    app.kubernetes.io/name: prometheus-adapter
    app.kubernetes.io/part-of: prometheus-adapter
    app.kubernetes.io/version: v0.10.0
  name: v1beta1.custom.metrics.k8s.io
spec:
  group: custom.metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: prometheus-adapter
    namespace: monitoring
    port: 443
  version: v1beta1
  versionPriority: 100

然后编辑prometheus-adapter的配置文件

 kubectl -n monitoring edit cm adapter-config -o yaml

在文件中加入如下内容中rules部分,注意对齐格式。(自定义指标根据自己的实际情况写。可参考这篇文章https://cloud.tencent.com/document/product/457/50125):

apiVersion: v1
data:
  config.yaml: |-
    "resourceRules":
    ......  
    rules:
    - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)
      name:
        as: httpserver_requests_qps
        matches: httpserver_requests_total
      resources:
        template: <<.Resource>>
      seriesQuery: httpserver_requests_total

修改配置文件之后重启prometheus-adapter pod 以使用新的配置文件

kubectl rollout restart deployment prometheus-adapter -n monitoring

待prometheus-adapter pod成功启动,等待大约几分钟后,使用如下命令,可以查看到 Custom Metrics API 返回配置的 QPS 相关指标。

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
# 查看具体pod的指标
kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/httpserver_requests_qps | jq .

然后创建一个HPA(参数值根据实际情况修改)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: httpserver
spec:
  minReplicas: 1
  maxReplicas: 20
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: httpserver
  metrics:
  - type: Pods
    pods:
      metric:
        name: httpserver_requests_qps
      target:
        averageValue: 50
        type: AverageValue

之后可以通过如下命令验证,如果TARGETS中有值,例如如下的399m而不是<unknown>则说明已经能够获取到自定义指标了。

kubectl get hpa
# kubectl get hpa
NAME                REFERENCE                       TARGETS        MINPODS   MAXPODS   REPLICAS   AGE
httpserver          Deployment/httpserver           399m/50     1         10        1         81m

打压

# 获取这个web应用对应的svc的ip地址,在宿主机执行如下命令打压力
 for i in {1..100000}; do curl 192.168.152.244/test > /dev/null -s; done;

再通过如下命令观察HPA是否有效。
kubectl get hpa
kubectl get po

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐