Логи приема pod
В следующем примере конфигурации показано, как настроить экземпляр Collector для извлечения логов из всех модулей Kubernetes. Также показано, как дополнить логи метаданными Kubernetes для автоматического связывания сервисов OpenTelemetry с модулями и присоединения логов к сервисам и модулям Kubernetes.
Предустановка
- Развернутый АктивныйШлюз для мониторинга API Kubernetes
- Один из следующих дистрибутивов Collector с приемником Filelog и процессором атрибутов Kubernetes :
- Collector Ключ-АСТРОМ
- OpenTelemetry Contrib
- Пользовательская версия Builder
- Collector, развернутый на каждом узле
- URL-адрес API вашей среды Ключ-АСТРОМ
- API-токен с соответствующей областью доступа
- Kubernetes настроен на требуемый контроль доступа на основе ролей
- Секреты Kubernetes настроены, как показано в разделе «Развертывание Collector»
Информацию о настройке коллектора с использованием указанной ниже конфигурации см. в разделах Развертывание коллектора и Конфигурация коллектора.
Демо конфигурация
Конфигурация Kubernetes
В этом примере конфигурации используется тот же подход к обогащению Kubernetes, что и в варианте использования Enrich из Kubernetes.
Помимо конфигурации Collector, обязательно обновите конфигурацию Kubernetes для следующих компонентов:
- Учетная запись службы : укажите то же имя учетной записи службы, которое используется в файле RBAC (см. записи для Helm , Operator).
- Смонтированные тома : укажите тома файловой системы, на которых ваш хост Kubernetes хранит соответствующие файлы логов (см. записи для Helm , Operator).
- Пути монтирования : укажите пути файловой системы, к которым должны быть смонтированы ранее настроенные тома внутри контейнера (см. записи для Helm , Operator).
| receivers:
# configure the filelog receiver to access the pod logs # from the mounted volumes filelog: include: - /var/log/pods/*/*/*.log include_file_name: false include_file_path: true start_at: end operators: - id: container-parser type: container processors: k8sattributes: extract: metadata: - k8s.pod.name - k8s.pod.uid - k8s.deployment.name - k8s.statefulset.name - k8s.daemonset.name - k8s.cronjob.name - k8s.namespace.name - k8s.node.name - k8s.cluster.uid - k8s.container.name 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: - context: resource statements: &k8s-statements - set(attributes["dt.kubernetes.workload.kind"], "statefulset") where IsString(attributes["k8s.statefulset.name"]) - set(attributes["dt.kubernetes.workload.name"], attributes["k8s.statefulset.name"]) where IsString(attributes["k8s.statefulset.name"]) - set(attributes["dt.kubernetes.workload.kind"], "deployment") where IsString(attributes["k8s.deployment.name"]) - set(attributes["dt.kubernetes.workload.name"], attributes["k8s.deployment.name"]) where IsString(attributes["k8s.deployment.name"]) - set(attributes["dt.kubernetes.workload.kind"], "daemonset") where IsString(attributes["k8s.daemonset.name"]) - set(attributes["dt.kubernetes.workload.name"], attributes["k8s.daemonset.name"]) where IsString(attributes["k8s.daemonset.name"]) - set(attributes["dt.kubernetes.cluster.id"], attributes["k8s.cluster.uid"]) where IsString(attributes["k8s.cluster.uid"]) log_statements: - context: resource statements: &k8s-statements exporters: otlphttp: endpoint: ${env:DT_ENDPOINT} headers: Authorization: "Api-Token ${env:DT_API_TOKEN}" service: pipelines: logs: receivers: [filelog] 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 |
Конфигурация для GKE Autopilot или AWS EKS
Если вы используете Collector на GKE Autopilot или AWS EKS, вам необходимо внести следующие изменения в конфигурацию:
- Режим развёртывания : для доступа к файлам логов модуля на хосте необходимо развернуть коллектор как набор Daemon (DaemonSet). Подробную информацию о развёртывании коллектора как набора демонов (DaemonSet) см. в разделе «Инструкции по развёртыванию» .
- Монтирование тома : Монтирование тома
/var/log/podsдолжно быть доступно только для чтения, в противном случае Collector не сможет получить доступ к файлам логов в этой директории.
Ниже приведен пример конфигурации для Collector DaemonSet с необходимыми монтированиями томов для сбора логов модуля:
| apiVersion: apps/v1
kind: DaemonSet metadata: name: astromkey-otel-collector spec: selector: matchLabels: app.kubernetes.io/name: astromkey-otel-collector template: metadata: labels: app.kubernetes.io/instance: astromkey-otel-collector app.kubernetes.io/name: astromkey-otel-collector spec: serviceAccountName: collector tolerations: # these tolerations are to have the daemonset runnable on control plane nodes # remove them if your control plane nodes should not run pods - key: node-role.kubernetes.io/control-plane operator: Exists effect: NoSchedule - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule containers: - args: ["--config", "/conf/otel-collector-config.yaml"] env: - name: MY_POD_IP valueFrom: fieldRef: apiVersion: v1 fieldPath: status.podIP image: ghcr.io/astromkey/astromkey-otel-collector/astromkey-otel-collector:0.37.0 name: otel-collector resources: limits: memory: 512Mi volumeMounts: - name: astromkey-otel-collector-config mountPath: /conf # read-only volumeMount for the directory containing the pod logs - name: logs mountPath: /var/log readOnly: true volumes: - configMap: name: astromkey-otel-collector-config items: - key: otel-collector-config path: otel-collector-config.yaml name: astromkey-otel-collector-config # hostPath volume containing the pod logs of the respective node the collector instance is running on - hostPath: path: /var/log name: logs |
Компоненты
Для нашей конфигурации мы настроили следующие компоненты.
Приемники
В разделе receivers мы указываем приемник filelog как активный компонент приемника для нашего экземпляра Collector.
Приёмник Filelog поддерживает ряд параметров конфигурации, позволяющих настраивать его поведение. В качестве примера мы используем следующие:
include— Указывает шаблон пути к файлам, которые мы хотим загрузить.start_at— Указывает, должен ли получатель читать файл с начала или, только для самых последних записей, с конца.operators— Настраивает операторcontainer, который автоматически анализирует каждую запись логов.
Процессоры
В разделе processors мы указываем процессор k8sattributes со следующими параметрами:
extract— Указывает, какую информацию следует извлечь.pod_association— Указывает, как информация о модуле связана с атрибутами.
Экспортеры
В разделе exporters мы указываем экспортер otlphttp по умолчанию и настраиваем его с помощью URL-адреса нашего API Ключ-АСТРОМ и требуемого токена аутентификации, как установлено и настроено в разделе Секреты Kubernetes.
Сервисные контейнеры
В разделе service мы собираем объекты приёмника, процессора и экспортёра в контейнеры для трассировок, метрик и логов. Эти контейнеры позволяют нам отправлять сигналы OpenTelemetry через экземпляр Collector и автоматически дополнять их дополнительной информацией, специфичной для Kubernetes.