Grafana + MySQL + Loki + Promtail + InfluxDB + Telegraf で kubernetes を monitoring する

kubernetes の monitoring 環境について紹介します。MicroK8s の addon で grafana + prometheus が利用可能ですが、 RaspberryPi では少し重たいと感じたため、カスタマイズしてリソースを調整できる monitoring 環境を構築しようと思ったのが始まりでした。ログについては promtail で 収集し Loki に保存しています。 リソースについては telegraf で収集し、 Influxdb に保存しています。 また、各メトリクスの収集量が多く Grafana に内包されている SQLite では負荷に耐えきれないため、 Grafana は MySQL データベースと連携させています。

Github に Kubernetes 用のコードをアップロードしています。
シークレット周りを含んだ password.txt, token.txt, telegraf.conf, grafana.ini ファイルの作成する。 kustomization.yaml で Storage 周りを設定し deploy します。
https://github.com/AbeYuki/monitoring-k8s.git

Dashborad は Grafana.com アプロードしていますので import して利用可能です。

ファイル一覧

git clone https://github.com/AbeYuki/monitoring-k8s.git

シークレットを含んだ4つのファイルの作成を行い deploy します。

.
├── README.md
├── dashboards
│   ├── loki_AccesseLogs.json
│   ├── loki_NamespaceLogs.json
│   ├── loki_SystemLogs.json
│   ├── telegraf_KubernetesResources.json
│   └── telegraf_SystemResources.json
├── docs
│   ├── datasource-influxdb.png
│   ├── datasource-loki.png
│   ├── ui-loki.png
│   ├── ui-telegraf-network.png
│   └── ui-telegraf-resources.png
├── grafana
│   ├── deployment-backend-grafana-db01.yaml
│   ├── deployment-frontend-grafana-app01.yaml
│   └── grafana.ini ★追加
├── influxdb
│   ├── configmap-influxdb-init01.yaml
│   └── deployment-backend-influxdb-db01.yaml
├── kustomization.yaml
├── label-transformer.yaml
├── loki
│   ├── config.yaml
│   └── deployment-frontend-loki-app01.yaml
├── namespace.yaml
├── password.txt ★追加
├── promtail
│   ├── config.yaml
│   └── daemonset-backend-agent01.yaml
├── rbac
│   ├── rbac-influxdb.yaml
│   ├── rbac-prometheus.yaml
│   ├── rbac-promtail.yaml
│   └── rbac-telegraf.yaml
├── telegraf
│   ├── daemonset-backend-agent01.yaml
│   └── telegraf.conf ★追加
└── token.txt ★追加

README.md がある ディレクトリへ移動

cd monitoring-k8s/

kustomization.yaml と連携するシークレット作成

echo -n 'password' > password.txt
echo -n 'token' > token.txt

grafana.ini 作成

修正箇所は database と session 情報を kustomization.yaml で作成した password.txt の情報に修正します。

[database]  
  password = 修正  
  mysql://grafana:修正~  

[session]  
  provider_config = `grafana:修正@tcp~  

下記は上記の kustomization.yaml の例で作成したシークレットを記載しています。

cat <<'EOF'> grafana/grafana.ini
[server]
  protocol = http
  http_port = 3000
[database]
  type = mysql
  host = monitoring-backend-grafana-db01-001:3306
  name = grafana
  user = grafana
  password = password
  ssl_mode = disable
  mysql://grafana:password@monitoring-backend-grafana-db01-001:3306/grafana
[session]
  provider_config = `grafana:password@tcp(monitoring-backend-grafana-db01-001:3306)/grafana` 
  provider = mysql
[analytics]
  reporting_enabled = false
  check_for_updates = true
[log]
  mode = console
  level = info
[paths]
  data         = /var/lib/grafana/data
  logs         = /var/log/grafana
  plugins      = /var/lib/grafana/plugins
  provisioning = /etc/grafana/provisioning
[unified_alerting]
  enabled = true
[datasources]
[remote_cache]
[dataproxy]
[security]
[snapshots]
[dashboards]
[users]
[auth]
[auth.anonymous]
[auth.github]
[auth.gitlab]
[auth.google]
[auth.grafana_com]
[auth.azuread]
[auth.okta]
[auth.generic_oauth]
[auth.basic]
[auth.proxy]
[auth.jwt]
[auth.ldap]
[aws]
[azure]
[smtp]
[emails]
[log]
[log.console]
[log.file]
[log.syslog]
[log.frontend]
[quota]
[unified_alerting]
[alerting]
[annotations]
[annotations.dashboard]
[annotations.api]
[explore]
[metrics]
[metrics.environment_info]
[metrics.graphite]
[grafana_com]
[tracing.jaeger]
[external_image_storage]
[external_image_storage.s3]
[external_image_storage.webdav]
[external_image_storage.gcs]
[external_image_storage.azure_blob]
[external_image_storage.local]
[rendering]
[panels]
[plugins]
[live]
[plugin.grafana-image-renderer]
[log]
[enterprise]
[feature_toggles]
[date_formats]
[expressions]
[geomap]
EOF

telegraf.conf 作成

kustomization.yaml で指定したトークンに修正、disk 等の監視対象の調整を行い telegraf/telegraf.conf ファイル作成

[[outputs.influxdb_v2]]  
  token = "修正"  
[[inputs.disk]]  
  fstype = [ "ext4", "xfs" ]  
  path = [ "/", "/backup", "/var/lib/longhorn" ]  
cat <<'EOF'> telegraf/telegraf.conf
[agent]
  interval = "60s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  hostname = "$HOSTNAME"
  omit_hostname = false
[[outputs.influxdb_v2]]
  urls = ["http://monitoring-backend-influxdb-db01-001:8086"]
  token = "token"
  organization = "monitoirng"
  bucket = "monitoring"
  timeout = "5s"    
[[inputs.cpu]]
  percpu = true
  totalcpu = true
  fielddrop = ["time_*"]
[[inputs.system]]
[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
  mount_points = ["/", "/backup", "/var/lib/longhorn"]
[inputs.disk.tagpass]
  fstype = [ "ext4", "xfs" ]
  path = [ "/", "/backup", "/var/lib/longhorn" ]
[[inputs.diskio]]
  devices = ["sd*"]
[[inputs.kernel]]
[[inputs.mem]]
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]
[[inputs.net]]
[[inputs.netstat]]
[[inputs.interrupts]]
[[inputs.linux_sysctl_fs]]
[[inputs.docker]]
  endpoint = "unix:///var/run/docker.sock"
[[inputs.kubernetes]]
  url = "https://$HOSTIP:10250"
  bearer_token = "/run/secrets/kubernetes.io/serviceaccount/token"
  insecure_skip_verify = true
EOF

kustomization.yaml の patchesStrategicMerge を修正して storageclass,resources の調整

すべての PVC の storade requests, storageClassName を環境に合わせて修正します。

patchesStrategicMerge:
- |-
  apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: frontend-grafana-app01
  spec:
    accessModes:
      - ReadWriteMany
    resources:
      requests:
        storage: 調整
    storageClassName: 調整

docker.sock の権限変更

docker metrics を収集する場合、 docker.sock の権限を 666 に変更する

sudo chmod 666 /var/run/docker.sock
vagrant@ubuntu2004:~$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 May  9 05:29 /var/run/docker.sock
vagrant@ubuntu2004:~$ sudo chmod 666 /var/run/docker.sock
vagrant@ubuntu2004:~$ ls -l /var/run/docker.sock
srw-rw-rw- 1 root docker 0 May  9 05:29 /var/run/docker.sock
vagrant@ubuntu2004:~$ 

deploy

namespace を deploy します。namespace 名は monitoring としています。

kubectl apply -f namespace.yaml

各リソースの deploy

kubectl apply -k ./

grafana datasorce setting

Influxdb setting

  • Query Language
  • Flux
  • url
  • http://monitoring-backend-influxdb-db01-001:8086
  • Access
  • Server(default)
  • InfluxDB Details
  • Organization
    • monitoring
  • Token
    • token
  • Default Bucket
    • monitoring

Loki setting

  • HTTP
  • URL
    • http://monitoring-frontend-loki-app01-001.monitoring.svc.cluster.local:3100

grafana.com から Dashboard を import

https://grafana.com/orgs/aim4highergg/dashboards

Loki:AccessLogs
Loki:NamespaceLogs
Loki:SystemLogs
Telegraf:KubernetesResources
Telegraf:SystemResources

Dashboard ID から Import

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です