使用helm和values.yaml部署Datadog DaemonSet +集群代理时,如何包含集成指标?

时间:2020-10-22 12:58:40

标签: kubernetes-helm datadog

使用:

 Kubernetes: 1.18.8
 Helm: 3.3.4
 Datadog DaemonSet agent: 7.23.0
 Datadog cluster-agent: 1.9.0
 Azure Database for PostgreSQL 11.x (i.e. external postgres-service)

我正在按照here提供的说明将Datadog部署为DaemonSet,并将集群代理启用到Kubernetes集群。

helm install my-kubernetes -f values.yaml --set datadog.apiKey=<DATADOG_API_KEY> datadog/datadog --set targetSystem=linux

我正在使用指定的values.yaml文件配置Datadog。

我想做一些自定义指标,特别是使用以前称为postgres.yaml的集成。我已经尝试按照在here中找到的values.yaml模板中指定的方式执行此操作(像这样(将其放入集群代理中,因为它们是集群范围的指标)):

# clusterAgent.confd -- Provide additional cluster check configurations
## Each key will become a file in /conf.d
## ref: https://docs.datadoghq.com/agent/autodiscovery/
confd:
  postgres.yaml: |-
    init_config:

    instances:
      - host: my-postgres-host.com
        port: 5432
        username: my-user
        password: some-password
        dbname: some-database
        ssl: True
        tags:
        - some_tag
        custom_queries:
        - metric_prefix: some.prefix
          query: SELECT COUNT(*) FROM bla WHERE timestamp > NOW() - INTERVAL '1 hour';
          columns:
          - name: countLastHour
            type: count

根据文档,我可以确认使用|-前缀确实在节点上的路径/etc/datadog-agent/conf.d/postgres.yaml中创建了一个文件,我希望它在该文件中。该文件正确包含了块中的所有内容,即以init_config:...

开头

现在,当启动节点时,我在日志(DEBUG)中看到了这一点:

'/ conf.d / postgres.yaml'->'/etc/datadog-agent/conf.d/postgres.yaml' /conf.d/..2020_10_22_10_22_27.239825358-> /etc/datadog-agent/conf.d/..2020_10_22_10_22_27.239825358 '/conf.d/..2020_10_22_10_22_27.239825358/postgres.yaml'-> '/etc/datadog-agent/conf.d / .. 2020_10_22_10_22_27.239825358 / postgres.yaml'

2020-10-22 10:22:29 UTC |集群|调试| (pkg / autodiscovery / providers / file.go:196在collectEntry中)|找到了 文件中的有效配置:/etc/datadog-agent/conf.d/postgres.yaml

2020-10-22 10:22:29 UTC |集群|调试| (pkg / collector / scheduler.go:154 in getChecks)|无法加载支票 从配置'postgres'的实例中:Core Check Loader:检查postgres 在目录中找不到

2020-10-22 10:22:29 UTC |集群|错误| (在GetChecksFromConfigs中为pkg / collector / scheduler.go:201)| 无法 加载支票:无法从config'postgres'加载任何支票

文档here指出,代理v7.x中的postgres yaml内容实际上应位于/etc/datadog-agent/conf.d/postgres.d/conf.yaml中,而不应位于/etc/datadog-agent/conf.d/postgres.yaml中。无法创建子文件夹/不能在config键中使用正斜杠(内部使用ConfigMap创建文件)。

我什至不确定问题出在yaml文件路径还是核心集成缺失。因此,我的主要追求是:如何在设置中正确启用Datadog postgres-integration?

2 个答案:

答案 0 :(得分:1)

此答案不能解决问题,因为postgres不在群集中运行,而是在Azure中运行。由于可能会很有趣,因此我将其保留,但是我针对实际的环境设置发布了另一个答案。


对于容器化设置,通常不建议设置configmap或尝试为代理提供yaml文件。相反,建议的配置是将注释放在postgres窗格上:https://docs.datadoghq.com/integrations/postgres/?tab=containerized#containerized

这种将配置放置在应用程序pod上而不是使用datadog代理的概念称为自动发现。这篇博客文章很好地解释了此解决方案的好处:https://www.datadoghq.com/blog/monitoring-kubernetes-with-datadog/#autodiscovery

这是一个图片图,显示了代理如何到达同一节点上的Pod并从中提取配置:

kubernetes and daemonset agent diagram

要进行配置,您需要使用yaml配置的每个部分,将它们转换为json,然后将其设置为postgres清单上的注释。在此处https://docs.datadoghq.com/agent/kubernetes/integrations/?tab=kubernetes#examples

中提供了有关如何为redis,apache和http设置pod注释的示例。

对于您的情况,我会做类似的事情:

apiVersion: v1
kind: Pod
metadata:
  name: mypostgres
  annotations:
    ad.datadoghq.com/mypostgres.check_names: '["postgres"]'
    ad.datadoghq.com/mypostgres.init_configs: '[{}]'
    ad.datadoghq.com/mypostgres.instances: |
      [
        {
          "host":"%%host%%", 
          "port":5432,
          "username":"my-user",
          "password":"some-password"
        }
      ]
  labels:
    name: mypostgres
spec:
  containers:
    - name: mypostgres
      image: postgres:latest
      ports:
        - containerPort: 5432

请注意文件夹名称postgres.d/conf.yaml如何映射到check_names注释,init_configs部分如何映射到init_configs注释,等等。


关于自定义指标的部分,由于我个人对yaml配置更加熟悉,并且更容易填写,因此我通常会使用yaml到json转换器,并从那里复制json

yaml to json converter screeenshot

metadata:
  name: mypostgres
  annotations:
    ad.datadoghq.com/mypostgres.instances: |
      [
        {
          "host": "%%host%%",
          "port": 5432,
          "username": "my-user",
          "password": "some-password",
          "dbname": "some-database",
          "ssl": true,
          "tags": [
            "some_tag"
          ],
          "custom_queries": [
            {
              "metric_prefix": "some.prefix",
              "query": "SELECT COUNT(*) FROM bla WHERE timestamp > NOW() - INTERVAL '1 hour';",
              "columns": [
                {
                  "name": "countLastHour",
                  "type": "count"
                }
              ]
            }
          ]
        }
      ]

所有这些配置要注意的关键是,我从未设置主机名。代理在扫描容器时会自动发现这一点。

但是您可能已经设置了my-postgres-host.com,因为此postgres实例实际上并未在您的kubernetes集群中运行,而是独立运行,而不是在容器中。如果是这种情况,我建议您尝试直接将代理直接放在postgres节点上,如果该数据库和代理都直接在虚拟机上,那么您所做的所有yaml东西都可以正常工作。

答案 1 :(得分:1)

问题似乎已经更新,说您要监视的此postgres数据库实际上并未运行集群。而且您无法将代理直接放置在postgres服务器上,因为它是Azure中的托管服务,因此您无权访问基础主机。

在这种情况下,通常还是在其他主机上设置一个随机的datadog代理来设置postgres集成,但是不要在yaml配置中使用host: localhost,而要使用要访问数据库的主机名在外部。在您的示例中为host: my-postgres-host.com。这提供了与常规集成相同的所有好处(除非您显然没有可用的cpu /磁盘/资源指标)

这很好并且很有意义,但是如果您安装的所有代理都是您创建的kubernetes守护程序集中的代理,该怎么办?您没有直接在VM上的任何主机来运行此检查。但是我们绝对不建议配置守护程序集直接运行此检查。如果这样做了,那就意味着您正在从集群中每个节点中的一个postgres数据库中收集重复的指标。由于每个代理都是副本,因此每个代理都将在您定义的同一数据库上运行相同的检查。

enter image description here

幸运的是,我注意到您正在运行Datadog Cluster Agent。这是一个单独的Datadog工具,每个集群一次部署为一项服务,而不是每个节点运行一次守护程序。可以将群集代理配置为运行“群集级别”检查。非常适合用于数据库,消息队列或http检查。

基本思想是(除了其他工作之外)群集代理还将安排检查。 DCA(数据狗群集代理)将从守护程序集中选择一个代理来运行检查,如果该节点代理吊舱死亡,则DCA将找到一个新的代理来运行群集检查。

cluster agent scheduling node agent to query postgres

以下是有关如何设置DCA以运行群集检查的文档:https://docs.datadoghq.com/agent/cluster_agent/clusterchecks/#how-it-works

要配置它,您将启用一些标志,并将使用配置映射创建的yaml文件提供给DCA,或者直接安装该文件。 DCA将将该配置传递给它选择运行检查的任何节点代理。