ラズパイk8sにOpenTelemetry + loki + grafanaをインストールしてログを収集する

前回fluent-bitでlokiにログ収集 したのですが、 今回はOpenTelemetryでログを収集してみます。

環境

ubuntu@k8s1:~$ kubectl get node
NAME   STATUS   ROLES                       AGE    VERSION
k8s1   Ready    control-plane,etcd,master   304d   v1.28.10+rke2r1
k8s2   Ready    worker                      181d   v1.28.10+rke2r1
k8s3   Ready    worker                      304d   v1.28.10+rke2r1

Loki構築

こちら を参考にLokiを再インストールします。
とはいえ設定は前回 と変わりません。

ubuntu@k8s1:~$ helm repo add grafana https://grafana.github.io/helm-charts
"grafana" has been added to your repositories
ubuntu@k8s1:~$ helm repo list
NAME   	URL                                  
grafana	https://grafana.github.io/helm-charts
ubuntu@k8s1:~$ helm pull --untar grafana/loki
ubuntu@k8s1:~$ vi loki/values.yaml

values.yamlは以下のように変更しました。
変更内容は前回 を参照ください。
※自身の環境に合わせて変更してください。

ubuntu@k8s1:~$ sdiff -s loki/values.yaml loki/values.yaml_org
  dnsService: rke2-coredns-rke2-coredns                       |   dnsService: "kube-dns"
  auth_enabled: false                                         |   auth_enabled: true
    replication_factor: 1                                     |     replication_factor: 3
    bucketNames:                                              |     # bucketNames:
      chunks: loki-chunks                                     |     #   chunks: FIXME
      ruler: loki-ruler                                       |     #   ruler: FIXME
      admin: loki-admin                                       |     #   admin: FIXME
      endpoint: http://192.168.0.205:9000                     |       endpoint: null
      secretAccessKey: minio123                               |       secretAccessKey: null
      accessKeyId: minio                                      |       accessKeyId: null
  schemaConfig:                                               |   schemaConfig: {}
    configs:                                                  <
      - from: '2024-04-01'                                    <
        index:                                                <
          period: 24h                                         <
          prefix: loki_index_                                 <
        object_store: s3                                      <
        schema: v13                                           <
        store: tsdb                                           <
  replicas: 2                                                 |   replicas: 3
    storageClass: local-path                                  |     storageClass: null
  replicas: 2                                                 |   replicas: 3
    storageClass: local-path                                  |     storageClass: null
  replicas: 2                                                 |   replicas: 3
    storageClass: local-path                                  |     storageClass: null
  allocatedMemory: 4096                                       |   allocatedMemory: 8192

Lokiのバージョンは3.0以上みたいなのでallow_structured_metadataは入れていません。

ubuntu@k8s1:~$ helm search repo grafana/loki
NAME                            CHART VERSION   APP VERSION     DESCRIPTION                                       
grafana/loki                    6.29.0          3.4.2           Helm chart for Grafana Loki and Grafana Enterpr...
grafana/loki-canary             0.14.0          2.9.1           Helm chart for Grafana Loki Canary                
grafana/loki-distributed        0.80.5          2.9.13          Helm chart for Grafana Loki in microservices mode 
grafana/loki-simple-scalable    1.8.11          2.6.1           Helm chart for Grafana Loki in simple, scalable...
grafana/loki-stack              2.10.2          v2.9.3          Loki: like Prometheus, but for logs. 

インストールします。

ubuntu@k8s1:~$ helm install -n loki loki loki/
NAME: loki
LAST DEPLOYED: Sat May 10 21:15:19 2025
NAMESPACE: loki
STATUS: deployed
REVISION: 1
NOTES:
***********************************************************************
 Welcome to Grafana Loki
 Chart version: 6.29.0
 Chart Name: loki
 Loki version: 3.4.2
***********************************************************************

以下略

無事インストールできました。

ubuntu@k8s1:~$ k get pod -n loki
NAME                            READY   STATUS    RESTARTS   AGE
loki-backend-0                  2/2     Running   0          3m4s
loki-backend-1                  2/2     Running   0          3m4s
loki-canary-gssjq               1/1     Running   0          3m5s
loki-canary-jx688               1/1     Running   0          3m5s
loki-chunks-cache-0             2/2     Running   0          3m4s
loki-gateway-66db9ccbf9-hsrlz   1/1     Running   0          3m5s
loki-read-59bffc8545-djvsb      1/1     Running   0          3m4s
loki-read-59bffc8545-xtlb7      1/1     Running   0          3m5s
loki-results-cache-0            2/2     Running   0          3m4s
loki-write-0                    1/1     Running   0          3m4s
loki-write-1                    1/1     Running   0          3m4s

OpenTelemetry Collectorインストール

こちら を参考にインストールしてみます。

ubuntu@k8s1:~$ helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
"open-telemetry" has been added to your repositories
ubuntu@k8s1:~$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "open-telemetry" chart repository
...Successfully got an update from the "grafana" chart repository
Update Complete. ⎈Happy Helming!⎈
ubuntu@k8s1:~$ helm repo list
NAME          	URL                                                       
grafana       	https://grafana.github.io/helm-charts                     
open-telemetry	https://open-telemetry.github.io/opentelemetry-helm-charts
ubuntu@k8s1:~$ helm search repo open-telemetry/opentelemetry-collector
NAME                                  	CHART VERSION	APP VERSION	DESCRIPTION                                      
open-telemetry/opentelemetry-collector	0.122.5      	0.123.1    	OpenTelemetry Collector Helm chart for Kubernetes
ubuntu@k8s1:~$ helm pull --untar open-telemetry/opentelemetry-collector
ubuntu@k8s1:~$ vi opentelemetry-collector/values.yaml

values.yamlの変更点は以下の通り。
まずドキュメントの通りイメージリポジトリを変更します。
デフォルトだと存在しないタグになったので指定しました。

image:
  repository: "otel/opentelemetry-collector-k8s"
  tag: "0.123.0"

次に今回はログを収集するため ログコレクションプリセット を有効化します。
config部分は Loki を参考にしてください。
endpointは前回 と同じくgatewayのserviceを指定します。

mode: "daemonset"
presets:
  logsCollection:
    enabled: true
config:
  exporters:
    debug: {}
    otlphttp:
      endpoint: http://loki-gateway.loki.svc.cluster.local/otlp
  service:
    pipelines:
      logs:
        exporters:
          - otlphttp

加えてKubernetesメタデータをログに加えて欲しいので
Kubernetes Attributes プリセット も有効化しました。

presets:
  kubernetesAttributes:
    enabled: true

差分は以下になります。
warning出るのでresourcesのコメントアウトを外しました。

ubuntu@k8s1:~$ sdiff -s opentelemetry-collector/values.yaml opentelemetry-collector/values.yaml_org
mode: "daemonset"                                             | mode: ""
    enabled: true                                             |     enabled: false
    includeCollectorLogs: true                                |     includeCollectorLogs: false
    enabled: true                                             |     enabled: false
    otlphttp:                                                 <
      endpoint: http://loki-gateway.loki.svc.cluster.local/ot <
          - otlphttp                                          |           - debug
  repository: "otel/opentelemetry-collector-k8s"              |   repository: ""
  tag: "0.123.0"                                              |   tag: ""
resources:                                                    | resources: {}
  limits:                                                     | # resources:
    cpu: 250m                                                 | #   limits:
    memory: 512Mi                                             | #     cpu: 250m
                                                              > #     memory: 512Mi
                                                              >

インストールします。

ubuntu@k8s1:~$ helm install opentelemetry-collector --create-namespace -n opentelemetry opentelemetry-collector/
NAME: opentelemetry-collector
LAST DEPLOYED: Wed May 14 21:37:12 2025
NAMESPACE: opentelemetry
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:

ubuntu@k8s1:~$ kubectl get pod -n opentelemetry
NAME                                  READY   STATUS    RESTARTS   AGE
opentelemetry-collector-agent-nf8gt   1/1     Running   0          28m
opentelemetry-collector-agent-xdlbh   1/1     Running   0          28m

grafanaで表示

アクセスログをjson形式にしたNGINXをデプロイしてログをgrafanaで表示します。

ubuntu@k8s1:~$ k get pod -n nginx
NAME                    READY   STATUS    RESTARTS   AGE
nginx-b5dd4cf86-n2qrw   1/1     Running   0          41s
ubuntu@k8s1:~$ k -n nginx logs nginx-b5dd4cf86-n2qrw
{"time": "2025-05-14T13:21:09+00:00","client-ip": "192.168.0.53","vhost": "10.42.219.40","user": "","status": "200","protocol": "HTTP/1.1","method": "GET","path": "/health.html","req": "GET /health.html HTTP/1.1","size": "175","reqtime": "0.000","apptime": "","ua": "kube-probe/1.28","forwardedfor": "","forwardedproto": "","referrer": ""}

rancher monitoringで入れたgrafanaでデータソースを追加します。

raspi_otel-collector_loki_grafana_01.png

無事収集できているようです。

raspi_otel-collector_loki_grafana_02.png