如何使用Telegraf和InfluxDB Cloud监控Kubernetes K3s

导航至

本文最初发表在The New Stack,并在此处获得授权转载。

Helm图表可以简化我们的生活,并使我们能够通过外部系统查看K3s集群的状态。

轻量级Kubernetes,也称为K3s,是一种内存占用仅为一半的Kubernetes安装。

您需要监控运行K3s的节点以了解集群的状态吗?您还需要了解您的Pod的性能、资源消耗以及网络流量吗?在本文中,我将向您展示如何使用Telegraf和InfluxDB Cloud来监控K3s。

我在Kubernetes上运行一个博客和一些其他资源。具体来说,这些资源运行在DigitalOcean上三个节点的集群中,我使用Telegraf和InfluxDB来监控一切。

我将演示如何监控集群以确保一切按预期运行,以及如何识别异常情况。

为了监控集群,我使用了两个组件

InfluxDB Cloud:从外部进行监控是理想的选择,因为如果我们从内部进行,节点故障时,监控解决方案也会故障,这没有任何意义。您可以在以下链接处获取免费的InfluxDB账户:https://cloud2.influxdata.com/signup/

接下来,我们需要从Telegraf安装一个Helm图表,具体是这个,因为它不支持Docker引擎,而如果您运行K3s,则不需要它。

让我们开始吧…

配置InfluxDB Cloud

我们首先必须做的是在InfluxDB Cloud中创建一个账户。接下来,我们进入数据部分,点击,然后点击创建桶

Configuring InfluxDB Cloud-Load Data

命名桶并点击创建

Name the bucket and click on Create

我们的桶列表应该看起来像这样。成功创建桶后,我们创建一个访问令牌以便能够向该桶写入数据。为此,我们转到令牌选项卡。

create an access token

在这个部分,我们点击生成令牌并选择读/写令牌选项。

Generate Token and choose the Read-Write Token option

我们指定一个名称,选择我们想要与该令牌关联的桶,然后点击保存

choose the bucket to associate with this token -save

完成此操作后,新的令牌将出现在令牌列表中。

new token appears in the token list

为了完成这部分,我们需要我们的组织ID和指向Telegraf的URL。

组织ID是您用于注册InfluxDB Cloud的电子邮件。我从地址栏获取URL。以我的情况为例,当我设置我的InfluxDB Cloud账户时,我选择了美国西部。因此,我的URL看起来像这样

https://us-west-2-1.aws.cloud2.influxdata.com

现在我们已经配置了InfluxDB Cloud,我们需要配置节点。

如我上面提到的,我们将使用Helm图表。我修改了这个Helm图表以适应K3s,因为默认情况下它试图监控Docker,而在这个Kubernetes分布中并不使用Docker。

如果您还没有安装Helm,可以通过运行以下命令来安装它

$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

安装完成后,从这里下载values.yaml文件。

您也可以直接将原始文件下载到主节点上。

$ wget https://raw.githubusercontent.com/xe-nvdk/awesome-helm-charts/main/telegraf-ds-k3s/values.yaml

现在,我们需要修改这个文件。我们需要打开它并修改输出部分。默认文件看起来像这样

## Exposed telegraf configuration
## ref: https://docs.influxdb.org.cn/telegraf/v1.13/administration/configuration/
config:
  # global_tags:
  #   cluster: "mycluster"
  agent:
    interval: "10s"
    round_interval: true
    metric_batch_size: 1000
    metric_buffer_limit: 10000
    collection_jitter: "0s"
    flush_interval: "10s"
    flush_jitter: "0s"
    precision: ""
    debug: false
    quiet: false
    logfile: ""
    hostname: "$HOSTNAME"
    omit_hostname: false
  outputs:
    - influxdb:
        urls:
          - "http://influxdb.monitoring.svc:8086"
        database: "telegraf"
        retention_policy: ""
        timeout: "5s"
        username: ""
        password: ""
        user_agent: "telegraf"
        insecure_skip_verify: false
  monitor_self: false

但由于我们将使用InfluxDB Cloud,我们必须做一些调整。修改后的版本看起来像这样

## Exposed telegraf configuration
## ref: https://docs.influxdb.org.cn/telegraf/v1.13/administration/configuration/
config:
  # global_tags:
  #   cluster: "mycluster"
  agent:
    interval: "1m"
    round_interval: true
    metric_batch_size: 1000
    metric_buffer_limit: 10000
    collection_jitter: "0s"
    flush_interval: "10s"
    flush_jitter: "0s"
    precision: ""
    debug: false
    quiet: false
    logfile: ""
    hostname: "$HOSTNAME"
    omit_hostname: false
  outputs:
    - influxdb_v2:
        urls:
          - "https://us-west-2-1.aws.cloud2.influxdata.com"
        bucket: "kubernetes"
        organization: "[email protected]"
        token: "WIX6Fy-v10zUIag_dslfjasfljadsflasdfjasdlñjfasdlkñfj=="
        timeout: "5s"
        insecure_skip_verify: false
  monitor_self: false

如果我们需要调整其他值,比如收集间隔,我们可以通过更改间隔值来完成。例如,我不需要每10秒的数据,所以我将其改为1分钟。

现在,我们来到了关键时刻!我们将安装Helm图表,看看一切是否按预期工作。根据您的K3s配置,您可能需要通过KUBECONFIG环境变量传递集群配置。

$  export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

完成后,我们将添加Awesome-Helm-Charts存储库。

$ helm repo add awesome-helm-charts https://xe-nvdk.github.io/awesome-helm-charts/

然后我们更新我们配置的存储库的内容。

$ helm repo update

最后,我们将安装存储库,传递我们刚刚修改的values.yaml文件中的配置

$ helm upgrade --install telegraf-ds-k3s -f values.yaml awesome-helm-charts/telegraf-ds-k3s

终端应返回类似以下内容

Release "telegraf-ds-k3s" does not exist. Installing it now.
NAME: telegraf-ds-k3s
LAST DEPLOYED: Fri Jun 25 22:47:22 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To open a shell session in the container running Telegraf run the following:

- kubectl exec -i -t --namespace default $(kubectl get pods --namespace default -l app.kubernetes.io/name=telegraf-ds -o jsonpath='{.items[0].metadata.name}') /bin/sh

To tail the logs for a Telegraf pod in the Daemonset run the following:

- kubectl logs -f --namespace default $(kubectl get pods --namespace default -l app.kubernetes.io/name=telegraf-ds -o jsonpath='{ .items[0].metadata.name }')

To list the running Telegraf instances run the following:

- kubectl get pods --namespace default -l app.kubernetes.io/name=telegraf-ds -w

此输出表明Helm图表已成功部署。请注意,这是一个DaemonSet,它会在集群中的每个节点上自动安装Helm图表。

要检查一切是否运行正常,请使用以下命令

$ kubectl get pods

我们看到我们的pod正在运行。

NAME                    READY   STATUS    RESTARTS   AGE
telegraf-ds-k3s-w8qhc   1/1     Running   0          2m29s

如果您想确保日志按预期工作,请运行

$ kubectl logs -f telegraf-ds-k3s-w8qhc

终端应输出类似以下内容

2021-06-26T02:55:22Z I! Starting Telegraf 1.18.3
2021-06-26T02:55:22Z I! Using config file: /etc/telegraf/telegraf.conf
2021-06-26T02:55:22Z I! Loaded inputs: cpu disk diskio kernel kubernetes mem net processes swap system
2021-06-26T02:55:22Z I! Loaded aggregators:
2021-06-26T02:55:22Z I! Loaded processors:
2021-06-26T02:55:22Z I! Loaded outputs: influxdb_v2
2021-06-26T02:55:22Z I! Tags enabled: host=k3s-master
2021-06-26T02:55:22Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"k3s-master", Flush Interval:10s

一切似乎都很正常,但现在到了考验的时刻。我们进入InfluxDB云账户,导航到探索部分,选择存储桶后应该能看到一些测量值和一些数据。

navigate to the Explore section

如您所见,这个过程并没有看起来那么复杂。Helm图表简化了我们的生活,从现在起我们可以通过外部系统查看集群的情况。