【问题标题】:How do I include integration-metrics when deploying Datadog DaemonSet + cluster-agent using helm and values.yaml?使用 helm 和 values.yaml 部署 Datadog DaemonSet + cluster-agent 时如何包含集成指标?
【发布时间】:2021-02-05 12:02:00
【问题描述】:

使用:

 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)

我正在将 Datadog 部署为 DaemonSet,并使用here 提供的说明将集群代理启用到 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:...开头

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

'/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 |集群 |调试 | (getChecks 中的 pkg/collector/scheduler.go:154)|无法加载支票 来自配置“postgres”的实例:核心检查加载器:检查 postgres 在目录中找不到

2020-10-22 10:22:29 UTC |集群 |错误 | (GetChecksFromConfigs 中的 pkg/collector/scheduler.go:201)| 无法 加载检查:无法从配置“postgres”加载任何检查

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

我什至不确定问题是 yaml 文件路径还是缺少核心集成。所以我的主要任务是:如何在我的设置中正确启用 Datadog postgres-integration?

【问题讨论】:

  • 我认为你需要的是advancedConfd 而不是confd。这样,您的 postgres(以及任何其他自定义配置 YAML)都在 /etc/datadog-agent/conf.d/postgres.d/ 下创建

标签: kubernetes-helm datadog


【解决方案1】:

问题似乎已更新,表明您尝试监控的这个 postgres db 实际上并未运行集群。而且您无法将代理直接放在 postgres 服务器上,因为它是 Azure 中的托管服务,因此您无权访问底层主机。

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

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

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

基本思想是(除了它的其他作业)集群代理还将安排检查。 DCA(datadog 集群代理)将从守护程序集中选择一个代理来运行检查,如果该节点代理 pod 死亡,DCA 将找到一个新的代理来运行集群检查。

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

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

【讨论】:

    【解决方案2】:

    这个答案并没有解决问题,因为 postgres 没有在集群中运行,它在 Azure 中运行。我会留下它,因为它可能很有趣,但我发布了实际环境设置的另一个答案。


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

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

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

    要配置它,您需要获取 yaml 配置的每个部分,将它们转换为 json,并将它们设置为 postgres 清单上的注释。此处为 redis、apache 和 http 提供了如何设置 pod 注释的示例:https://docs.datadoghq.com/agent/kubernetes/integrations/?tab=kubernetes#examples

    对于你的场景,我会做这样的事情:

    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

    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 节点上,如果该 db 和代理都直接在 vm 上,您所做的所有 yaml 内容都可以正常工作。

    【讨论】:

    • 非常感谢您提供的非常详尽的示例。唉,不过,我不在 kubernetes 中运行 postgres。我们在 Azure 上,并且正在使用 Azure Database for PostgreSQL 服务。 annotations-method 肯定是一个很好的方法。我希望你的回答能帮助很多人,他们将来会在这里:) 我已经用信息更新了我的问题,PostgreSQL 没有在集群内运行,我应该提前写下这个。我很抱歉。
    • 啊酷,np。您可以使用集群代理来安排集群检查。稍后我会做出新的回应
    • 我实际上认为,我现在使用 cluster-cheks 设法让它工作。感谢那!在这里找到了一些有用的信息:docs.datadoghq.com/agent/cluster_agent/clusterchecks/…。欢迎您将其写为答案,我可以标记为已接受。不过可能会打败你;)
    • 没有问题,哈哈,刚刚发布了一个更相关的答案。很高兴能够以任何方式找到集群检查设置文档
    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 2020-08-12
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2020-10-07
    • 2019-03-09
    • 2019-11-03
    相关资源
    最近更新 更多