ClickStack は OpenTelemetry (OTel) collector を使用して Kubernetes クラスターからログ、メトリクス、Kubernetes イベントを収集し、それらを ClickStack に転送します。ネイティブの OTel ログフォーマットをサポートしており、ベンダー固有の追加設定は必要ありません。
このガイドでは、以下をインテグレーションします。
- ログ
- インフラ メトリクス
このガイドでは、ゲートウェイとして ClickStack OTel collector をデプロイ し、インジェスト API key で保護していることを前提としています。
OTel Helm チャートの設定ファイルの作成
各ノードとクラスター自体の両方からログとメトリクスを収集するには、2 つの別個の OpenTelemetry Collector をデプロイする必要があります。1 つは各ノードからログとメトリクスを収集するためにデーモンセットとしてデプロイし、もう 1 つはクラスター自体からログとメトリクスを収集するためにデプロイメントとしてデプロイします。
API key 用の Secret の作成
HyperDX の インジェスト API key を使って、新しい Kubernetes Secret を作成します。これは、以下でインストールするコンポーネントが ClickStack OTel collector へ安全にデータを取り込むために使用されます。
kubectl create secret generic hyperdx-secret \
--from-literal=HYPERDX_API_KEY=<ingestion_api_key> \さらに、ClickStack OTel collector の場所を記載した config map を作成します:
kubectl create configmap -n=otel-demo otel-config-vars --from-literal=YOUR_OTEL_COLLECTOR_ENDPOINT=<OTEL_COLLECTOR_ENDPOINT>
# 例: kubectl create configmap -n=otel-demo otel-config-vars --from-literal=YOUR_OTEL_COLLECTOR_ENDPOINT=http://my-hyperdx-hdx-oss-v2-otel-collector:4318デーモンセット設定の作成
このデーモンセットは、クラスター内の各ノードからログとメトリクスを収集しますが、Kubernetes イベントやクラスター全体のメトリクスは収集しません。
デーモンセットのマニフェストをダウンロードします:
curl -O https://raw.githubusercontent.com/ClickHouse/clickhouse-docs/refs/heads/main/docs/use-cases/observability/clickstack/example-datasets/_snippets/k8s_daemonset.yamlk8s_daemonset.yaml
# daemonset.yaml
mode: daemonset
# kubeletstats の CPU/メモリ使用率メトリクスを使用するために必要
clusterRole:
create: true
rules:
- apiGroups:
- ''
resources:
- nodes/proxy
verbs:
- get
presets:
logsCollection:
enabled: true
hostMetrics:
enabled: true
# Kubernetes Processor が Kubernetes メタデータを追加するように設定します。
# すべてのパイプラインに k8sattributes processor を追加し、ClusterRole に必要なルールも追加します。
# 詳細: https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-attributes-processor
kubernetesAttributes:
enabled: true
# 有効にすると、processor は関連付けられたポッドのすべてのラベルを抽出し、resource 属性として追加します。
# ラベルの正確な名前がキーになります。
extractAllPodLabels: true
# 有効にすると、processor は関連付けられたポッドのすべての annotation を抽出し、resource 属性として追加します。
# annotation の正確な名前がキーになります。
extractAllPodAnnotations: true
# collector がキューブレット上の API サーバーからノード、ポッド、コンテナーのメトリクスを収集するように設定します。
# メトリクス パイプラインに kubeletstats receiver を追加し、ClusterRole に必要なルールも追加します。
# 詳細: https://opentelemetry.io/docs/kubernetes/collector/components/#kubeletstats-receiver
kubeletMetrics:
enabled: true
extraEnvs:
- name: YOUR_OTEL_COLLECTOR_ENDPOINT
valueFrom:
configMapKeyRef:
name: otel-config-vars
key: YOUR_OTEL_COLLECTOR_ENDPOINT
config:
receivers:
# 追加の kubelet メトリクスを設定します
kubeletstats:
collection_interval: 20s
auth_type: 'serviceAccount'
endpoint: '${env:K8S_NODE_NAME}:10250'
insecure_skip_verify: true
metrics:
k8s.pod.cpu_limit_utilization:
enabled: true
k8s.pod.cpu_request_utilization:
enabled: true
k8s.pod.memory_limit_utilization:
enabled: true
k8s.pod.memory_request_utilization:
enabled: true
k8s.pod.uptime:
enabled: true
k8s.node.uptime:
enabled: true
k8s.container.cpu_limit_utilization:
enabled: true
k8s.container.cpu_request_utilization:
enabled: true
k8s.container.memory_limit_utilization:
enabled: true
k8s.container.memory_request_utilization:
enabled: true
container.uptime:
enabled: true
exporters:
otlphttp:
endpoint: "${env:YOUR_OTEL_COLLECTOR_ENDPOINT}"
compression: gzip
service:
pipelines:
logs:
exporters:
- otlphttp
metrics:
exporters:
- otlphttpk8s_daemonset.yaml
# daemonset.yaml
mode: daemonset
# kubeletstats の CPU/メモリ使用率メトリクスを使用するために必要
clusterRole:
create: true
rules:
- apiGroups:
- ''
resources:
- nodes/proxy
verbs:
- get
presets:
logsCollection:
enabled: true
hostMetrics:
enabled: true
# Kubernetes Processor が Kubernetes メタデータを追加するよう設定します。
# すべてのパイプラインに k8sattributes processor を追加し、クラスター ロールに必要なルールも追加します。
# 詳細: https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-attributes-processor
kubernetesAttributes:
enabled: true
# 有効にすると、processor は関連付けられたポッドのすべてのラベルを抽出し、resource attributes として追加します。
# ラベルの名前そのものがキーになります。
extractAllPodLabels: true
# 有効にすると、processor は関連付けられたポッドのすべての annotations を抽出し、resource attributes として追加します。
# annotation の名前そのものがキーになります。
extractAllPodAnnotations: true
# collector がキューブレット上の API サーバーからノード、ポッド、コンテナーのメトリクスを収集するよう設定します。
# メトリクス パイプラインに kubeletstats receiver を追加し、クラスター ロールに必要なルールも追加します。
# 詳細: https://opentelemetry.io/docs/kubernetes/collector/components/#kubeletstats-receiver
kubeletMetrics:
enabled: true
extraEnvs:
- name: HYPERDX_API_KEY
valueFrom:
secretKeyRef:
name: hyperdx-secret
key: HYPERDX_API_KEY
optional: true
- name: YOUR_OTEL_COLLECTOR_ENDPOINT
valueFrom:
configMapKeyRef:
name: otel-config-vars
key: YOUR_OTEL_COLLECTOR_ENDPOINT
config:
receivers:
# 追加のキューブレット メトリクスを設定します
kubeletstats:
collection_interval: 20s
auth_type: 'serviceAccount'
endpoint: '${env:K8S_NODE_NAME}:10250'
insecure_skip_verify: true
metrics:
k8s.pod.cpu_limit_utilization:
enabled: true
k8s.pod.cpu_request_utilization:
enabled: true
k8s.pod.memory_limit_utilization:
enabled: true
k8s.pod.memory_request_utilization:
enabled: true
k8s.pod.uptime:
enabled: true
k8s.node.uptime:
enabled: true
k8s.container.cpu_limit_utilization:
enabled: true
k8s.container.cpu_request_utilization:
enabled: true
k8s.container.memory_limit_utilization:
enabled: true
k8s.container.memory_request_utilization:
enabled: true
container.uptime:
enabled: true
exporters:
otlphttp:
endpoint: "${env:YOUR_OTEL_COLLECTOR_ENDPOINT}"
headers:
authorization: "${env:HYPERDX_API_KEY}"
compression: gzip
service:
pipelines:
logs:
exporters:
- otlphttp
metrics:
exporters:
- otlphttpデプロイメント構成の作成
Kubernetes イベントとクラスター全体のメトリクスを収集するには、別途 OpenTelemetry collector をデプロイメントとしてデプロイする必要があります。
デプロイメントのマニフェストをダウンロードします:
curl -O https://raw.githubusercontent.com/ClickHouse/clickhouse-docs/refs/heads/main/docs/use-cases/observability/clickstack/example-datasets/_snippets/k8s_deployment.yamlk8s_deployment.yaml
# deployment.yaml
mode: deployment
image:
repository: otel/opentelemetry-collector-contrib
tag: 0.123.0
# collector は 1 つだけ必要です。これ以上あると重複データが生成されます
replicaCount: 1
presets:
kubernetesAttributes:
enabled: true
# 有効にすると、この processor は関連付けられたポッドのすべてのラベルを抽出し、resource 属性として追加します。
# ラベルの正確な名前がキーになります。
extractAllPodLabels: true
# 有効にすると、この processor は関連付けられたポッドのすべての annotations を抽出し、resource 属性として追加します。
# annotation の正確な名前がキーになります。
extractAllPodAnnotations: true
# collector が Kubernetes イベントを収集するように設定します。
# logs パイプラインに k8sobject receiver を追加し、デフォルトで Kubernetes イベントを収集します。
# 詳細: https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-objects-receiver
kubernetesEvents:
enabled: true
# Kubernetes Cluster Receiver がクラスター レベルのメトリクスを収集するように設定します。
# metrics パイプラインに k8s_cluster receiver を追加し、ClusterRole に必要なルールを追加します。
# 詳細: https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-cluster-receiver
clusterMetrics:
enabled: true
extraEnvs:
- name: YOUR_OTEL_COLLECTOR_ENDPOINT
valueFrom:
configMapKeyRef:
name: otel-config-vars
key: YOUR_OTEL_COLLECTOR_ENDPOINT
config:
exporters:
otlphttp:
endpoint: "${env:YOUR_OTEL_COLLECTOR_ENDPOINT}"
compression: gzip
service:
pipelines:
logs:
exporters:
- otlphttp
metrics:
exporters:
- otlphttpk8s_deployment.yaml
# deployment.yaml
mode: deployment
image:
repository: otel/opentelemetry-collector-contrib
tag: 0.123.0
# collector は 1 つだけ必要です。これ以上あると重複データが生成されます
replicaCount: 1
presets:
kubernetesAttributes:
enabled: true
# 有効にすると、この processor は関連付けられたポッドのすべてのラベルを抽出し、resource 属性として追加します。
# ラベルの正確な名前がキーになります。
extractAllPodLabels: true
# 有効にすると、この processor は関連付けられたポッドのすべての annotations を抽出し、resource 属性として追加します。
# annotation の正確な名前がキーになります。
extractAllPodAnnotations: true
# collector が Kubernetes イベントを収集するように設定します。
# logs パイプラインに k8sobject receiver を追加し、デフォルトで Kubernetes イベントを収集します。
# 詳細: https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-objects-receiver
kubernetesEvents:
enabled: true
# Kubernetes Cluster Receiver がクラスター レベルのメトリクスを収集するように設定します。
# metrics パイプラインに k8s_cluster receiver を追加し、ClusterRole に必要なルールを追加します。
# 詳細: https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-cluster-receiver
clusterMetrics:
enabled: true
extraEnvs:
- name: HYPERDX_API_KEY
valueFrom:
secretKeyRef:
name: hyperdx-secret
key: HYPERDX_API_KEY
optional: true
- name: YOUR_OTEL_COLLECTOR_ENDPOINT
valueFrom:
configMapKeyRef:
name: otel-config-vars
key: YOUR_OTEL_COLLECTOR_ENDPOINT
config:
exporters:
otlphttp:
endpoint: "${env:YOUR_OTEL_COLLECTOR_ENDPOINT}"
compression: gzip
headers:
authorization: "${env:HYPERDX_API_KEY}"
service:
pipelines:
logs:
exporters:
- otlphttp
metrics:
exporters:
- otlphttpOpenTelemetry collector のデプロイ
OpenTelemetry Helm チャート を使用すると、Kubernetes クラスターに OpenTelemetry collector をデプロイできます。
OpenTelemetry Helm リポジトリを追加します:
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts # OTel Helm リポジトリを追加上記の設定を使ってチャートをインストールします:
helm install my-opentelemetry-collector-deployment open-telemetry/opentelemetry-collector -f k8s_deployment.yaml
helm install my-opentelemetry-collector-daemonset open-telemetry/opentelemetry-collector -f k8s_daemonset.yamlこれで、Kubernetes クラスターのメトリクス、ログ、Kubernetes イベントが HyperDX に表示されるようになります。
アプリケーションレベルのログ、メトリクス、トレースを Kubernetes メタデータ
(例: ポッド名、ネームスペースなど) と相関付けるには、OTEL_RESOURCE_ATTRIBUTES
環境変数を使用して Kubernetes メタデータをアプリケーションに渡します。
以下は、環境変数を使用して Kubernetes メタデータを アプリケーションに渡すデプロイメントの例です:
# my_app_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
replicas: 1
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
# Kubernetes Attribute Processorと組み合わせることで、
# ポッドのログとメトリクスがサービス名に関連付けられます。
service.name: <MY_APP_NAME>
spec:
containers:
- name: app-container
image: my-image
env:
# ... その他の環境変数
# Downward APIからK8sメタデータを収集してアプリに転送する
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_UID
valueFrom:
fieldRef:
fieldPath: metadata.uid
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: DEPLOYMENT_NAME
valueFrom:
fieldRef:
fieldPath: metadata.labels['deployment']
# OTEL_RESOURCE_ATTRIBUTESを介してK8sメタデータをアプリに転送する
- name: OTEL_RESOURCE_ATTRIBUTES
value: k8s.pod.name=$(POD_NAME),k8s.pod.uid=$(POD_UID),k8s.namespace.name=$(POD_NAMESPACE),k8s.node.name=$(NODE_NAME),k8s.deployment.name=$(DEPLOYMENT_NAME)