经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
教你如何进行Prometheus 分片自动缩放
来源:cnblogs  作者:华为云开发者联盟  时间:2024/4/23 10:01:43  对本文有异议

本文分享自华为云社区《使用 Prometheus-Operator 进行 Prometheus + Keda 分片自动缩放》,作者: Kubeservice@董江。

垂直缩放与水平缩放

Prometheus已经成为云原生时代事实上的监控工具。从监控小型花园的实例到企业中大规模的监控,Prometheus 都可以处理工作负载!但并非没有挑战…

在拥有数百个团队的大型组织中,每秒获取数百万个指标是很常见的。人们可以维护一个 Prometheus 实例,并通过投入资金来解决扩展问题:只需获得一个更大的节点即可。好吧,如果你愿意付钱,那就去吧!但是节点价格的增长速度通常高于其大小,并且管理大型和小型 Prometheus 实例之间还有另一个很大的区别:WAL 重播!

Prometheus 保留一个包含最新抓取数据的内存数据库。为了避免在可能的重新启动期间丢失数据,Prometheus 在磁盘上保留了预写日志 (WAL)。当 Prometheus 重启时,它会将 WAL 重新加载到内存中,这样最新抓取的数据就又可用了,这个操作就是我们所说的 WAL Replay。

在 WAL 重放期间,Prometheus 完全无法进行查询,也无法抓取任何目标,因此我们希望尽快完成此操作!这就是巨大的 Prometheus 实例成为问题的时候。当将数百 GiB 的数据重放到内存中时,此操作很容易需要 20 到 30 分钟,在更极端的情况下甚至需要几个小时。如果您决定保留单个 Prometheus 实例,WAL Replay 操作可能会导致监控系统出现长时间停机。

避免大型 Prometheus 实例的一种常见策略是在多个 Prometheus 之间分片抓取目标。由于每个 Prometheus 都会抓取较少量的指标,因此它们会小得多,并且 WAL Replay 不会像以前那样成为问题。为了仍然能够拥有集中式查询体验,可以将指标转发到另一个工具,例如 Thanos、Cortex 或云提供商,这些工具也能够扩展 Prometheus 查询功能。

整个时间内负载不均匀

我们已经通过使用分片而不是垂直扩展 Prometheus 取得了一些重大进展,但是当暴露的指标数量全天增加和减少时会发生什么?对于每天从数百个节点扩展到数千个节点(反之亦然)的 Kubernetes 集群来说,这是一种非常常见的情况。在决定普罗米修斯碎片的数量时,我们如何找到成本/效益比的最佳点?

您可以每天手动微调集群中的分片数量,但有更智能的方法来完成此任务。在这篇博文中,我将重点介绍 Horizo??ntal Pod Autoscaler 策略,该策略是最近通过 Prometheus-Operator v0.71.0 版本实现的。

使用 Keda 自动缩放 Prometheus 碎片

设置

使用 Kubernetes Scale API 的任何类型的 Horizo??ntal Pod Autoscaler,但出于演示目的,将使用Keda,它支持多种扩展策略。

让我们从创建一个小型集群开始,我建议使用KinD或Minikube:

  1. $ kind create cluster
  2. Creating cluster "kind" ...
  3. ? Ensuring node image (kindest/node:v1.27.1) ??
  4. ? Preparing nodes ??
  5. ? Writing configuration ??
  6. ? Starting control-plane ???
  7. ? Installing CNI ??
  8. ? Installing StorageClass ??
  9. Set kubectl context to "kind-kind"
  10. You can now use your cluster with:
  11. kubectl cluster-info --context kind-kind
  12. Have a nice day! ??

现在让我们安装 Keda:

  1. $ helm repo add kedacore https://kedacore.github.io/charts
  2. $ helm repo update
  3. $ helm install keda kedacore/keda --namespace keda --create-namespace
  4. $ watch kubectl get pods -n keda

一旦所有 Pod 都达到该Running状态,我们就可以继续!下一步是安装 Prometheus Operator:

  1. $ git clone https://github.com/prometheus-operator/prometheus-operator
  2. $ cd prometheus-operator
  3. $ kubectl apply --server-side -f bundle.yaml

部署 Prometheus 和示例应用程序

好了,初始设置完成了。让我们部署一些公开一些指标的应用程序!为了演示目的,让我们部署一个 Alertmanager:

  1. ---
  2. apiVersion: monitoring.coreos.com/v1
  3. kind: Alertmanager
  4. metadata:
  5. name: main
  6. namespace: monitoring
  7. spec:
  8. image: quay.io/prometheus/alertmanager:v0.26.0
  9. podMetadata:
  10. labels:
  11. app.kubernetes.io/instance: main
  12. app.kubernetes.io/name: alertmanager
  13. replicas: 1
  14. serviceAccountName: alertmanager-main
  15. ---
  16. apiVersion: v1
  17. kind: Service
  18. metadata:
  19. name: alertmanager-main
  20. namespace: monitoring
  21. labels:
  22. app.kubernetes.io/instance: main
  23. app.kubernetes.io/name: alertmanager
  24. spec:
  25. ports:
  26. - name: web
  27. port: 9093
  28. targetPort: web
  29. - name: reloader-web
  30. port: 8080
  31. targetPort: reloader-web
  32. selector:
  33. app.kubernetes.io/instance: main
  34. app.kubernetes.io/name: alertmanager
  35. ---
  36. apiVersion: v1
  37. automountServiceAccountToken: false
  38. kind: ServiceAccount
  39. metadata:
  40. name: alertmanager-main
  41. namespace: monitoring
  42. ---
  43. apiVersion: monitoring.coreos.com/v1
  44. kind: ServiceMonitor
  45. metadata:
  46. name: alertmanager-main
  47. namespace: monitoring
  48. spec:
  49. endpoints:
  50. - interval: 30s
  51. port: web
  52. - interval: 30s
  53. port: reloader-web
  54. selector:
  55. matchLabels:
  56. app.kubernetes.io/instance: main
  57. app.kubernetes.io/name: alertmanager

还有一个 Prometheus 负责抓取这个 Alertmanager(以及之后部署的更多内容)。我们希望根据每秒抓取的样本进行扩展,因此我们将配置 Prometheus 来抓取自身

  1. apiVersion: monitoring.coreos.com/v1
  2. kind: Prometheus
  3. metadata:
  4. name: k8s
  5. spec:
  6. image: quay.io/prometheus/prometheus:v2.48.1
  7. podMetadata:
  8. labels:
  9. app.kubernetes.io/instance: k8s
  10. app.kubernetes.io/name: prometheus
  11. shards: 1
  12. serviceAccountName: prometheus-k8s
  13. serviceMonitorSelector: {}
  14. ---
  15. apiVersion: rbac.authorization.k8s.io/v1
  16. kind: ClusterRole
  17. metadata:
  18. name: prometheus-k8s
  19. rules:
  20. - apiGroups:
  21. - ""
  22. resources:
  23. - configmaps
  24. verbs:
  25. - get
  26. - apiGroups:
  27. - ""
  28. resources:
  29. - services
  30. - endpoints
  31. - pods
  32. verbs:
  33. - get
  34. - list
  35. - watch
  36. - apiGroups:
  37. - extensions
  38. resources:
  39. - ingresses
  40. verbs:
  41. - get
  42. - list
  43. - watch
  44. - apiGroups:
  45. - networking.k8s.io
  46. resources:
  47. - ingresses
  48. verbs:
  49. - get
  50. - list
  51. - watch
  52. ---
  53. apiVersion: rbac.authorization.k8s.io/v1
  54. kind: ClusterRoleBinding
  55. metadata:
  56. name: prometheus-k8s
  57. roleRef:
  58. apiGroup: rbac.authorization.k8s.io
  59. kind: ClusterRole
  60. name: prometheus-k8s
  61. subjects:
  62. - kind: ServiceAccount
  63. name: prometheus-k8s
  64. namespace: default
  65. ---
  66. apiVersion: v1
  67. kind: Service
  68. metadata:
  69. name: prometheus-k8s
  70. labels:
  71. app.kubernetes.io/instance: k8s
  72. app.kubernetes.io/name: prometheus
  73. spec:
  74. ports:
  75. - name: web
  76. port: 9090
  77. targetPort: web
  78. - name: reloader-web
  79. port: 8080
  80. targetPort: reloader-web
  81. selector:
  82. app.kubernetes.io/instance: k8s
  83. app.kubernetes.io/name: prometheus
  84. ---
  85. apiVersion: v1
  86. automountServiceAccountToken: true
  87. kind: ServiceAccount
  88. metadata:
  89. name: prometheus-k8s
  90. ---
  91. apiVersion: monitoring.coreos.com/v1
  92. kind: ServiceMonitor
  93. metadata:
  94. name: prometheus-k8s
  95. spec:
  96. endpoints:
  97. - interval: 30s
  98. port: web
  99. - interval: 30s
  100. port: reloader-web
  101. selector:
  102. matchLabels:
  103. app.kubernetes.io/instance: k8s
  104. app.kubernetes.io/name: prometheus

部署完所有内容后,我们可以通过暴露其 UI 来验证 Prometheus 的表现:

  1. $ kubectl port-forward prometheus-k8s-0 9090

如果我们查询指标
sum(rate(prometheus_tsdb_head_samples_appended_total[2m])),
我们会注意到我们稳定在每秒摄取 40~50 个样本左右。

配置 Keda 来扩展/缩小 Prometheus

Keda 的自动缩放对象是通过ScaledObject CRD配置的。 ScaledObjects 有大量不同的缩放器,但在这里我们将使用Prometheus 缩放器来缩放 Prometheus 本身。

  1. apiVersion: keda.sh/v1alpha1
  2. kind: ScaledObject
  3. metadata:
  4. name: prometheus
  5. spec:
  6. scaleTargetRef:
  7. apiVersion: monitoring.coreos.com/v1
  8. kind: Prometheus
  9. name: k8s
  10. minReplicaCount: 1
  11. maxReplicaCount: 100
  12. fallback:
  13. failureThreshold: 5
  14. replicas: 10
  15. triggers:
  16. - type: prometheus
  17. metadata:
  18. serverAddress: http://prometheus-k8s.svc.default.cluster.local:9090
  19. # Ingested samples per second across all shards
  20. query: sum(rate(prometheus_tsdb_head_samples_appended_total[2m]))
  21. # We'll scale up/down on every 200 samples ingested per second
  22. threshold: '200'

要验证 ScaledObject 是否按预期工作,请运行:

  1. $ kubectl get scaledobject prometheus

你应该看到这一点STATUS并且ACTIVE两者都应该是True

触发扩缩容

现在让我们开始有趣的部分,首先增加 Alertmanager Pod 的数量:

  1. $ kubectl patch alertmanager main -p '{"spec": {"replicas": 20}}' --type merge

在检查 Prometheus UI 时,我们会注意到摄取的样本快速增加:

如果我们检查 Prometheus Pod 的数量,我们会注意到正在部署新的分片:

  1. $ kubectl get pods -l app.kubernetes.io/name=prometheus
  2. NAME READY STATUS RESTARTS AGE
  3. prometheus-k8s-0 2/2 Running 0 21m
  4. prometheus-k8s-shard-1-0 2/2 Running 0 2m54s
  5. prometheus-k8s-shard-2-0 2/2 Running 0 2m24s
  6. prometheus-k8s-shard-3-0 1/2 Running 0 54s

我们还验证一下,如果负载减少,Prometheus Pod 是否会缩小规模

  1. $ kubectl patch alertmanager main -p '{"spec": {"replicas": 1}}' --type merge

几分钟后,分片将返回较少数量的摄取样本,Keda 应再次调整分片数量:

  1. $ kubectl get pods -l app.kubernetes.io/name=prometheus
  2. NAME READY STATUS RESTARTS AGE
  3. prometheus-k8s-0 2/2 Running 0 30m

其他

点击关注,第一时间了解华为云新鲜技术~

 

原文链接:https://www.cnblogs.com/huaweiyun/p/18152120

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号