我尝试使用Kubernetes进行了Datadog +水平Pod自动缩放

摘要

简而言之

如果使用Datadog的指標來設定Horizontal Pod Autoscaler,會非常方便(設定也很簡單)。

只有从AWS Integration获取的指标有点困难(见后文)

背景 – 背景资料, 背景情况, 背景背离

我认为很多人都在使用Kubernetes的Horizontal Pod Autoscaler,但是你们是用什么样的值进行自动缩放的呢?
我们最开始是用CPU和内存来做的,但是逐渐不满意,想要使用各种各样的指标。由于可以使用自定义指标,所以我们考虑使用那个,但是在调查时发现常常推荐使用Prometheus的方法。原本已经在使用Prometheus的人可以继续使用,但我们并不是,所以为了HPA是否要安装Prometheus而苦恼了一阵子。

由于Custom Metrics API的规范已经公开,因此可以自己创建它,但是这需要相当大的工作量,因此我一直无法做出决定。 [链接](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/custom-metrics-api.md)

进一步调查发现,我们可以使用外部指标(HPA)来设置并利用外部指标。由于我们的项目已经引入了Datadog,所以我们开始在使用Datadog的指标方面进行调查,结果发现Datadog的官方文档中介绍了一种完全匹配的方法。

https://www.datadoghq.com/blog/autoscale-kubernetes-datadog/

因此,本文的主旨是使用它进行HPA设置后变得非常简单和方便。

详细的

基于上述文章的内容,只需要按照所述的方式进行操作即可,但是这次我还会介绍一种更简单的方法。

要将Datadog作为External Metrics Provider运行,需要安装Datadog Cluster Agent并注册APIService。

以下是一个YAML示例,通过kubectl apply命令应用它,就可以运行起来。
https://github.com/DataDog/datadog-agent/tree/9ceedbd0efb1efbf4de3f1f6d9f34206f2928f5b/Dockerfiles/manifests/cluster-agent

有关Datadog集群代理的说明,请参考以下链接:
https://docs.datadoghq.com/agent/kubernetes/cluster/

Datadog通常为每个节点部署代理程序,但这样一来,为了获取集群的指标,必须将k8s API权限传递给节点的代理程序。而如果有Datadog集群代理程序,则只需一个代理程序即可获取整个集群的信息,这还能减轻负载。此外,它似乎还可以作为使用Datadog指标的HPA的指标API服务器。(大概是这样吧)。

Helm图表

我已经在上面贴出了一个YAML仓库,如果使用Helm,只需传递选项即可进行安装。
https://github.com/helm/charts/tree/master/stable/datadog#enabling-the-datadog-cluster-agent

$ helm install --name datadog-monitoring \
    --set datadog.apiKey=YOUR-API-KEY-HERE \
    --set datadog.appKey=YOUR-APP-KEY-HERE \
    --set clusterAgent.enabled=true \
    --set clusterAgent.metricsProvider.enabled=true \
    stable/datadog

通过这个操作,Datadog集群代理将被部署并完成APIService的注册等操作。换句话说,现在可以使用HPA了!

$ kubectl get pods | grep datadog
datadog-cluster-agent-74f88b78d6-t9nrl        1/1     Running     0          1h
datadog-datadog-k9fdl                         1/1     Running     0          1h
datadog-datadog-qqm42                         1/1     Running     0          1h
datadog-kube-state-metrics-5db89d6d78-qzlgc   1/1     Running     0          1h

如果有datadog-cluster-agent,那就没问题了。kube-state-metrics已经部署好了,所以不需要的人可以选择不安装,还有其他详细设置的人可以查看Chart的选项。

H珀A

如果使用nginx请求次数来进行自动扩展的示例,请参考以下链接:
https://github.com/DataDog/datadog-agent/blob/9ceedbd0efb1efbf4de3f1f6d9f34206f2928f5b/Dockerfiles/manifests/cluster-agent/hpa-example/hpa-manifest.yaml

由于相同的东西没有创意,所以我们尝试使用Redis的key长度来进行扩展。
在我们的项目中,我们使用了一个名为Celery的任务队列工具。
这个工具可以将Redis用作队列(也可以使用SQS等),并且使用celery作为key来管理任务。
换句话说,key的长度表示任务的数量。在这个案例中,我们想要在任务数量很多时扩展工作者。

默认情况下,无法获取Redis键的长度,因此需要对Datadog Agent进行一些设置调整。将以下内容配置在values.yaml文件中。

clusterAgent:
  enabled: true
  metricsProvider:
    enabled: true

datadog:
  confd:
    redisdb.yaml: |-
      init_config:
      instances:
        - host: "redis.local"
          port: 6379
          keys:
            - celery

应用上述的values.yaml文件。

$ helm upgrade -f values.yaml datadog-monitoring stable/datadog

在这里,我们指定Redis的主机名来获取键的长度。关于Datadog的设置,我们不详细提及。从Datadog的界面上,通过metrics: redis.key.length的tag: key:celery来确认是否可以获取到值。

如果顺利获取到了,之后只需要进行HPA的设置就可以了。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: celery-worker
spec:
  minReplicas: 2
  maxReplicas: 5
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: celery-worker
  metrics:
  - type: External
    external:
      metricName: redis.key.length
      metricSelector:
        matchLabels:
          key: celery
      targetAverageValue: 4

在这里,我们正在为名为celery-worker的Deployment进行自动伸缩的配置。
targetAverageValue是一个目标值,它使得将Pod的数量除以总数量接近于该值(根据我的理解)。
更多详细信息请参阅文档。
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#algorithm-details

让我们应用上面的YAML。

$ kubectl apply -f hpa.yaml

我来查看一下hpa的设置。

$ kubectl get hpa
NAME                         REFERENCE                   TARGETS             MINPODS   MAXPODS   REPLICAS   AGE
celery-worker                Deployment/celery-worker    4/4 (avg)   2         5         2          1m

目前队列中有8个任务注册状态。由于副本数为2,所以分子为8/2=4。分母的4是目标平均值。
如果现在再注册4个任务(8+4=12),那么情况如下。

$ kubectl get hpa
NAME                         REFERENCE                   TARGETS             MINPODS   MAXPODS   REPLICAS   AGE
celery-worker                Deployment/celery-worker    6/4 (avg)   2         5         2          2m

现在有两个Pod,所以结果是12/2=6。
如果这样做,为了使targetAverageValue达到4,Pod将进行自动缩放。
因此,Pod将增加一个。这样一来,结果将变为12/3=4,如下所示。

$ kubectl get hpa
NAME                         REFERENCE                   TARGETS             MINPODS   MAXPODS   REPLICAS   AGE
celery-worker                Deployment/celery-worker    4/4 (avg)   2         5         3          5m

副本数量目前为3。如果任务数量减少,将会进行缩减。
以上是结束。

这次我们使用了Redis的key,但也可以根据SQS的消息数量来进行自动扩展,或者根据ALB的响应时间来进行增加等等。如果能使用Datadog的指标,那么可能性就是无限的。
*补充:目前发现使用Datadog的Cluster Agent的默认值会出现问题,即使正常指定了图表也无法运行。需要通过环境变量将DD_EXTERNAL_METRICS_PROVIDER_MAX_AGE的值设置得更大。

总结

使用Datadog的metrics来设置Horizontal Pod Autoscaler非常方便(设置也很简单)。

bannerAds