Интеграция Kubernetes для ClickStack — стек обсервабилити ClickHouse
ClickStack использует коллектор OpenTelemetry (OTel) для сбора журналов, метрик и событий Kubernetes из кластеров Kubernetes и их пересылки в ClickStack. Мы поддерживаем нативный формат логов OTel и не требуем никакой дополнительной конфигурации, специфичной для конкретного вендора.Это руководство охватывает следующее:
Журналы
Метрики инфраструктуры
Чтобы передавать метрики уровня приложения или APM/трейсы, вам также потребуется добавить в приложение интеграцию для соответствующего языка.
Чтобы собирать журналы и метрики как с каждого узла, так и с самого кластера, потребуется развернуть два отдельных коллектора OpenTelemetry. Один будет развернут как ДемонСет для сбора журналов и метрик с каждого узла, а другой — как Развертывание для сбора журналов и метрик с самого кластера.
Создайте новый secret Kubernetes, используя ключ API для приёма данных из HyperDX. Он будет использоваться компонентами, устанавливаемыми ниже, для безопасной отправки данных в ваш коллектор ClickStack OTel:
ДемонСет будет собирать журналы и метрики с каждого узла в кластере, но не будет собирать события Kubernetes или метрики на уровне всего кластера.Скачайте манифест для ДемонСет:
Чтобы собирать события Kubernetes и метрики всего кластера, потребуется развернуть отдельный OpenTelemetry Collector в виде развертывания.Скачайте манифест развертывания:
# deployment.yamlmode: deploymentimage: repository: otel/opentelemetry-collector-contrib tag: 0.123.0# Нам нужен только один такой коллектор — если их будет больше, появятся дубликаты данныхreplicaCount: 1presets: kubernetesAttributes: enabled: true # Если включено, процессор извлечёт все метки связанного пода и добавит их как атрибуты ресурса. # Точное имя метки будет использоваться как ключ. extractAllPodLabels: true # Если включено, процессор извлечёт все аннотации связанного пода и добавит их как атрибуты ресурса. # Точное имя аннотации будет использоваться как ключ. extractAllPodAnnotations: true # Настраивает коллектор на сбор событий Kubernetes. # Добавляет k8sobject receiver в конвейер журналов и по умолчанию собирает события Kubernetes. # Подробнее: https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-objects-receiver kubernetesEvents: enabled: true # Настраивает Kubernetes Cluster Receiver для сбора метрик уровня кластера. # Добавляет k8s_cluster receiver в конвейер метрик и добавляет необходимые правила в ClusterRole. # Подробнее: https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-cluster-receiver clusterMetrics: enabled: trueextraEnvs: - name: YOUR_OTEL_COLLECTOR_ENDPOINT valueFrom: configMapKeyRef: name: otel-config-vars key: YOUR_OTEL_COLLECTOR_ENDPOINTconfig: exporters: otlphttp: endpoint: "${env:YOUR_OTEL_COLLECTOR_ENDPOINT}" compression: gzip service: pipelines: logs: exporters: - otlphttp metrics: exporters: - otlphttp
k8s_deployment.yaml
# deployment.yamlmode: deploymentimage: repository: otel/opentelemetry-collector-contrib tag: 0.123.0# Нам нужен только один такой коллектор — если их будет больше, появятся дубликаты данныхreplicaCount: 1presets: kubernetesAttributes: enabled: true # Если включено, процессор извлечёт все метки связанного пода и добавит их как атрибуты ресурса. # Точное имя метки будет использоваться как ключ. extractAllPodLabels: true # Если включено, процессор извлечёт все аннотации связанного пода и добавит их как атрибуты ресурса. # Точное имя аннотации будет использоваться как ключ. extractAllPodAnnotations: true # Настраивает коллектор на сбор событий Kubernetes. # Добавляет k8sobject receiver в конвейер журналов и по умолчанию собирает события Kubernetes. # Подробнее: https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-objects-receiver kubernetesEvents: enabled: true # Настраивает Kubernetes Cluster Receiver для сбора метрик уровня кластера. # Добавляет k8s_cluster receiver в конвейер метрик и добавляет необходимые правила в ClusterRole. # Подробнее: https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-cluster-receiver clusterMetrics: enabled: trueextraEnvs: - 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_ENDPOINTconfig: exporters: otlphttp: endpoint: "${env:YOUR_OTEL_COLLECTOR_ENDPOINT}" compression: gzip headers: authorization: "${env:HYPERDX_API_KEY}" service: pipelines: logs: exporters: - otlphttp metrics: exporters: - otlphttp
Чтобы коррелировать журналы, метрики и трассировки приложения с метаданными Kubernetes
(например, именем пода, пространством имен и т. д.), нужно передать метаданные Kubernetes
в приложение с помощью переменной среды OTEL_RESOURCE_ATTRIBUTES.Ниже приведен пример развертывания, в котором метаданные Kubernetes передаются в
приложение через переменные среды:
# my_app_deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: app-deploymentspec: 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: # ... другие переменные окружения # Сбор метаданных K8s из Downward API для передачи приложению - 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'] # Передача метаданных K8s приложению через OTEL_RESOURCE_ATTRIBUTES - 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)