Обогащение из Kubernetes
В следующем примере конфигурации показано, как настроить экземпляр Collector для обогащения телеметрических данных OTLP дополнительными метаданными Kubernetes. Это включает, например, сведения о поде, развертывании и кластере, что позволяет Ключ-АСТРОМ корректно сопоставлять предоставленные телеметрические данные с соответствующими сущностями в Ключ-АСТРОМ.
Ключ-АСТРОМ рекомендует использовать АктивныйШлюз для улучшения мониторинга состояния и производительности кластера Kubernetes. Развертывание АктивныйШлюз позволяет приложению Ключ-АСТРОМ Kubernetes визуализировать данные Kubernetes и OpenTelemetry и сопоставлять их с соответствующими сущностями Kubernetes.
Предустановка
необязательноРазвернутый АктивныйШлюз для мониторинга API Kubernetes- Один из следующих дистрибутивов Collector с процессорами Kubernetes Attributes и Transform :
- Collector Ключ-АСТРОМ
- OpenTelemetry Contrib
- Пользовательская версия Builder
- Collector развернут в режиме агента
- URL-адрес API вашей среды Ключ-АСТРОМ
- API-токен с соответствующей областью доступа
- Kubernetes настроен на требуемый контроль доступа на основе ролей
Информацию о настройке Collector с использованием указанной ниже конфигурации см. в разделах Развертывание коллектора и Конфигурация коллектора.
Демо конфигурация
Учетная запись службы
Помимо конфигурации Collector, обязательно обновите конфигурацию Kubernetes, чтобы она соответствовала имени учетной записи службы, используемому в файле RBAC (см. записи для Helm, Operator).
| extensions:
health_check: endpoint: ${env:MY_POD_IP}:13133 receivers: otlp: protocols: grpc: endpoint: ${env:MY_POD_IP}:4317 http: endpoint: ${env:MY_POD_IP}:4318 processors: k8sattributes: extract: metadata: - k8s.pod.name - k8s.pod.uid - k8s.pod.ip - k8s.deployment.name - k8s.replicaset.name - k8s.statefulset.name - k8s.daemonset.name - k8s.job.name - k8s.cronjob.name - k8s.namespace.name - k8s.node.name - k8s.cluster.uid - k8s.container.name annotations: - from: pod key_regex: metadata.astromkey.com/(.*) tag_name: $$1 - from: pod key: metadata.astromkey.com tag_name: metadata.astromkey.com pod_association: - sources: - from: resource_attribute name: k8s.pod.name - from: resource_attribute name: k8s.namespace.name - sources: - from: resource_attribute name: k8s.pod.ip - sources: - from: resource_attribute name: k8s.pod.uid - sources: - from: connection transform: error_mode: ignore trace_statements: &astromkey_transformations # Set attributes taken from k8s metadata. - context: resource statements: - set(attributes["k8s.workload.kind"], "job") where IsString(attributes["k8s.job.name"]) - set(attributes["k8s.workload.name"], attributes["k8s.job.name"]) where IsString(attributes["k8s.job.name"]) - set(attributes["k8s.workload.kind"], "cronjob") where IsString(attributes["k8s.cronjob.name"]) - set(attributes["k8s.workload.name"], attributes["k8s.cronjob.name"]) where IsString(attributes["k8s.cronjob.name"]) - set(attributes["k8s.workload.kind"], "daemonset") where IsString(attributes["k8s.daemonset.name"]) - set(attributes["k8s.workload.name"], attributes["k8s.daemonset.name"]) where IsString(attributes["k8s.daemonset.name"]) - set(attributes["k8s.workload.kind"], "statefulset") where IsString(attributes["k8s.statefulset.name"]) - set(attributes["k8s.workload.name"], attributes["k8s.statefulset.name"]) where IsString(attributes["k8s.statefulset.name"]) - set(attributes["k8s.workload.kind"], "replicaset") where IsString(attributes["k8s.replicaset.name"]) - set(attributes["k8s.workload.name"], attributes["k8s.replicaset.name"]) where IsString(attributes["k8s.replicaset.name"]) - set(attributes["k8s.workload.kind"], "deployment") where IsString(attributes["k8s.deployment.name"]) - set(attributes["k8s.workload.name"], attributes["k8s.deployment.name"]) where IsString(attributes["k8s.deployment.name"]) # remove the delete statements if you want to preserve these attributes - delete_key(attributes, "k8s.deployment.name") - delete_key(attributes, "k8s.replicaset.name") - delete_key(attributes, "k8s.statefulset.name") - delete_key(attributes, "k8s.daemonset.name") - delete_key(attributes, "k8s.cronjob.name") - delete_key(attributes, "k8s.job.name") - context: resource statements: - merge_maps(attributes, ParseJSON(attributes["metadata.astromkey.com"]), "upsert") where IsMatch(attributes["metadata.astromkey.com"], "^\\{") - delete_key(attributes, "metadata.astromkey.com") metric_statements: *astromkey_transformations log_statements: *astromkey_transformations exporters: otlphttp: endpoint: ${env:DT_ENDPOINT} headers: Authorization: "Api-Token ${env:DT_API_TOKEN}" service: extensions: - health_check pipelines: traces: receivers: [otlp] processors: [k8sattributes, transform] exporters: [otlphttp] metrics: receivers: [otlp] processors: [k8sattributes, transform] exporters: [otlphttp] logs: receivers: [otlp] processors: [k8sattributes, transform] exporters: [otlphttp] |
Конфигурация Kubernetes
Настройте следующий файл rbac.yaml с вашим экземпляром Kubernetes, чтобы разрешить сборщику использовать API Kubernetes с типом аутентификации учетной записи службы.
| apiVersion: v1
kind: ServiceAccount metadata: labels: app: collector name: collector --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: collector labels: app: collector rules: - apiGroups: - '' resources: - 'pods' - 'namespaces' verbs: - 'get' - 'watch' - 'list' - apiGroups: - 'apps' resources: - 'replicasets' verbs: - 'get' - 'list' - 'watch' - apiGroups: - 'extensions' resources: - 'replicasets' verbs: - 'get' - 'list' - 'watch' --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: collector labels: app: collector roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: collector subjects: - kind: ServiceAccount name: collector namespace: default |
Компоненты
Для нашей конфигурации мы настроили следующие компоненты.
Приемники
В разделе receivers мы указываем стандартный приемник otlp, как активный компонент приемника для нашего экземпляра Collector.
Это сделано в основном для демонстрационных целей. Вы можете указать здесь любой другой допустимый получатель (например, zipkin).
Процессоры
В разделе processors мы указываем процессор k8sattributes со следующими параметрами:
extract— Указывает, какую информацию следует извлечь.pod_association— Указывает, как информация о модуле связана с атрибутами.
Обратите внимание, что атрибут k8s.container.name будет извлечён только в том случае, если модуль, от которого был получен входящий сигнал, содержит только один контейнер, или если принятый сигнал содержит атрибут ресурса k8s.container.id. В противном случае процессор k8sattributes не сможет правильно связать нужный контейнер.
Ключ-АСТРОМ Operator дополняет данные OpenTelemetry из модулей Kubernetes аннотациями metadata.astromkey.com. При наличии этих аннотаций процессор k8sattributes их извлекает.
Мы также настраиваем процессор transform на автоматическое добавление информации о кластере Kubernetes в качестве атрибутов ресурсов для всех сигналов телеметрии.