Componentes clave para Kubernetes

El OpenTelemetry Collector admite numerosos receptores y procesadores diferentes para facilitar la supervisión de Kubernetes. Esta sección describe los componentes más importantes para recopilar datos de Kubernetes y mejorarlos.

Componentes incluidos en esta página:

Para los logs, las métricas o los rastros de aplicaciones, recomendamos el receptor OTLP, pero cualquier receptor que se ajuste a sus datos es adecuado.

Procesador de atributos de Kubernetes

Patrón de implementaciónUtilizable
DaemonSet (agente)
Deployment (gateway)
SidecarNo

El procesador de atributos de Kubernetes descubre automáticamente los pods de Kubernetes, extrae sus metadatos y agrega los metadatos extraídos a intervalos, métricas y logs como atributos de recursos.

El procesador de atributos de Kubernetes es uno de los componentes más importantes para un recopilador que se ejecuta en Kubernetes. Cualquier recopilador que reciba datos de la aplicación debe usarlo. Debido a que agrega contexto de Kubernetes a su telemetría, el procesador de atributos de Kubernetes le permite correlacionar los rastros, las métricas y los logs de de su aplicación con su telemetría de Kubernetes, como las métricas de pod y los rastros.

El procesador de atributos de Kubernetes utiliza la API de Kubernetes para descubrir todos los pods que se ejecutan en un clúster y mantiene un registro de sus direcciones IP, UID de pod y metadatos interesantes. De manera predeterminada, los datos que pasan por el procesador se asocian a un pod a través de la dirección IP de la solicitud entrante, pero se pueden configurar diferentes reglas. Dado que el procesador utiliza la API de Kubernetes, requiere permisos especiales (consulta el ejemplo a continuación). Si está utilizando el gráfico Helm de OpenTelemetry Collector, puede usar el ajuste preestablecido kubernetesAttributes para comenzar.

Los siguientes atributos se agregan de forma predeterminada:

  • k8s.namespace.name
  • k8s.pod.name
  • k8s.pod.uid
  • k8s.pod.start_time
  • k8s.deployment.name
  • k8s.node.name

El procesador de atributos de Kubernetes también puede establecer atributos de recursos personalizados para rastreos, métricas y logs mediante las etiquetas y anotaciones de Kubernetes que haya agregado a sus pods y espacios de nombres.

k8sattributes: auth_type: 'serviceAccount' extract: metadata: # extraído del pod - k8s.namespace.name - k8s.pod.name - k8s.pod.start_time - k8s.pod.uid - k8s.deployment.name - k8s.node.name annotations: # Extrae el valor de una anotación del pod con la clave `annotation-one` y lo inserta como un atributo de recurso con la clave `a1` - tag_name: a1 key: annotation-one from: pod # Extrae el valor de una anotación del namespace con la clave `annotation-two` utilizando una expresión regular y lo inserta como un recurso con la clave `a2` - tag_name: a2 key: annotation-two regex: field=(?P<value>.+) from: namespace labels: # Extrae el valor de una etiqueta del namespace con la clave `label1` y lo inserta como un atributo de recurso con la clave `l1` - tag_name: l1 key: label1 from: namespace # Extrae el valor de una etiqueta del pod con la clave `label2` utilizando una expresión regular y lo inserta como un atributo de recurso con la clave `l2` - tag_name: l2 key: label2 regex: field=(?P<value>.+) from: pod pod_association: # Cómo asociar los datos a un pod (el orden importa) - sources: # Primero intenta usar el valor del atributo de recurso k8s.pod.ip - from: resource_attribute name: k8s.pod.ip - sources: # Luego intenta usar el valor del atributo de recurso k8s.pod.uid - from: resource_attribute name: k8s.pod.uid - sources: # Si ninguno de esos funciona, usa la conexión de la solicitud para obtener la IP del pod. - from: connection

También hay opciones de configuración especiales para cuando el recopilador se implementa como un DaemonSet de Kubernetes (agente) o como una implementación de Kubernetes (gateway). Para obtener más detalles, consulta Escenarios de implementación

Para conocer los detalles de configuración del procesador de atributos de Kubernetes, consulta Procesador de atributos de Kubernetes.

Dado que el procesador usa la API de Kubernetes, necesita el permiso correcto para funcionar correctamente. Para la mayoría de los casos de uso, debe otorgar a la cuenta de servicio que ejecuta el recopilador los siguientes permisos a través de un ClusterRole.

apiVersion: v1 kind: ServiceAccount metadata: name: collector namespace: <OTEL_COL_NAMESPACE> --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: otel-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: otel-collector subjects: - kind: ServiceAccount name: collector namespace: <OTEL_COL_NAMESPACE> roleRef: kind: ClusterRole name: otel-collector apiGroup: rbac.authorization.k8s.io

Receptor de Kubeletstats

Patrón de implementaciónUtilizable
DaemonSet (agente)Preferido
Deployment (gateway)Sí, pero solo recopilará métricas del nodo en el que está implementado
SidecarNo

Cada nodo de Kubernetes ejecuta un kubelet que incluye un servidor API. Los Kubernetes El receptor se conecta a ese kubelet a través del servidor API para recopilar métricas sobre el nodo y las cargas de trabajo que se ejecutan en el nodo.

Existen diferentes métodos de autenticación, pero normalmente una cuenta de servicio se utiliza. La cuenta de servicio también necesitará los permisos adecuados para extraer datos de el Kubelet (ver más abajo). Si estás usando el Gráfico de timón de OpenTelemetry Collector puede utilizar el kubeletMetrics preset para empezar.

De forma predeterminada, se recopilan métricas para pods y nodos, pero también se puede configurar el receptor para recopilar las métricas del contenedor y el volumen. El receptor también permite configurar con qué frecuencia se recopilan las métricas:

receivers: kubeletstats: collection_interval: 10s auth_type: 'serviceAccount' endpoint: '${env:K8S_NODE_NAME}:10250' insecure_skip_verify: true metric_groups: - node - pod - container

Para obtener detalles específicos sobre qué métricas se recopilan, consulta Métricas predeterminadas. Para obtener detalles de configuración específicos, consulta Receptor de Kubeletstats.

Dado que el procesador usa la API de Kubernetes, necesitas el permiso correcto para funcionar correctamente. Para la mayoría de los casos de uso, debes otorgar a la cuenta de servicio que ejecuta el recopilador los siguientes permisos a través de un ClusterRole.

--- apiVersion: v1 kind: ServiceAccount metadata: name: otel-collector --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: otel-collector rules: - apiGroups: [''] resources: ['nodes/stats'] verbs: ['get', 'watch', 'list'] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: otel-collector roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: otel-collector subjects: - kind: ServiceAccount name: otel-collector namespace: default

Receptor de logs de archivos

Patrón de implementaciónUtilizable
DaemonSet (agente)Preferido
Deployment (gateway)Sí, pero solo recopilará logs del nodo en el que se implementa
SidecarSí, pero esto se consideraría una configuración avanzada

El receptor de logs de archivos rastrea y analiza los logs de los archivos. Aunque no es un receptor específico de Kubernetes, sigue siendo la solución de facto para recopilar cualquier registro de Kubernetes.

El receptor de Filelog está compuesto por operadores que se encadenan entre sí para procesar un registro. Cada operador realiza una responsabilidad simple, como analizar una marca de tiempo o JSON. Configurar un receptor de Filelog no es trivial. Si está usando el diagrama de Helm de OpenTelemetry Collector puede usar el ajuste preestablecido logsCollection para comenzar.

Dado que los logs de Kubernetes normalmente se ajustan a un conjunto de formatos estándar, una configuración típica de receptor de Filelog para Kubernetes se ve así:

filelog: include: - /var/log/pods/*/*/*.log exclude: # Exclude logs from all containers named otel-collector - /var/log/pods/*/otel-collector/*.log start_at: beginning include_file_path: true include_file_name: false operators: # Find out which format is used by kubernetes - type: router id: get-format routes: - output: parser-docker expr: 'body matches "^\\{"' - output: parser-crio expr: 'body matches "^[^ Z]+ "' - output: parser-containerd expr: 'body matches "^[^ Z]+Z"' # Parse CRI-O format - type: regex_parser id: parser-crio regex: '^(?P<time>[^ Z]+) (?P<stream>stdout|stderr) (?P<logtag>[^ ]*) ?(?P<log>.*)$' output: extract_metadata_from_filepath timestamp: parse_from: attributes.time layout_type: gotime layout: '2006-01-02T15:04:05.999999999Z07:00' # Parse CRI-Containerd format - type: regex_parser id: parser-containerd regex: '^(?P<time>[^ ^Z]+Z) (?P<stream>stdout|stderr) (?P<logtag>[^ ]*) ?(?P<log>.*)$' output: extract_metadata_from_filepath timestamp: parse_from: attributes.time layout: '%Y-%m-%dT%H:%M:%S.%LZ' # Parse Docker format - type: json_parser id: parser-docker output: extract_metadata_from_filepath timestamp: parse_from: attributes.time layout: '%Y-%m-%dT%H:%M:%S.%LZ' - type: move from: attributes.log to: body # Extract metadata from file path - type: regex_parser id: extract_metadata_from_filepath regex: '^.*\/(?P<namespace>[^_]+)_(?P<pod_name>[^_]+)_(?P<uid>[a-f0-9\-]{36})\/(?P<container_name>[^\._]+)\/(?P<restart_count>\d+)\.log$' parse_from: attributes["log.file.path"] cache: size: 128 # default maximum amount of Pods per Node is 110 # Rename attributes - type: move from: attributes.stream to: attributes["log.iostream"] - type: move from: attributes.container_name to: resource["k8s.container.name"] - type: move from: attributes.namespace to: resource["k8s.namespace.name"] - type: move from: attributes.pod_name to: resource["k8s.pod.name"] - type: move from: attributes.restart_count to: resource["k8s.container.restart_count"] - type: move from: attributes.uid to: resource["k8s.pod.uid"]

Para conocer los detalles de configuración de Filelog Receiver, consulta Filelog Receiver.

Además de la configuración de Filelog Receiver, su instalación de OpenTelemetry Collector en Kubernetes necesitará acceso a los logs que desea recopilar. Normalmente, esto significa agregar algunos volúmenes y montajes de volumen a su manifiesto de recopilador:

--- apiVersion: apps/v1 kind: DaemonSet ... spec: ... template: ... spec: ... containers: - name: opentelemetry-collector ... volumeMounts: ... # Mount the volumes to the collector container - name: varlogpods mountPath: /var/log/pods readOnly: true - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true ... volumes: ... # Typically the collector will want access to pod logs and container logs - name: varlogpods hostPath: path: /var/log/pods - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers ...

Receptor de clúster de Kubernetes

Patrón de implementaciónUtilizable
DaemonSet (agente)Sí, pero generará datos duplicados
Deployment (gateway)Sí, pero más de una réplica generará datos duplicados
SidecarNo

El receptor de clúster de Kubernetes recopila métricas y eventos de entidad sobre el clúster en su totalidad mediante el servidor de API de Kubernetes. Utiliza este receptor para responder preguntas sobre fases de pod, condiciones de nodo y otras preguntas sobre todo el clúster. Dado que el receptor recopila telemetría para el clúster en su totalidad, solo se necesita una instancia del receptor en todo el clúster para recopilar todos los datos.

Existen diferentes métodos de autenticación, pero normalmente se utiliza una cuenta de servicio. La cuenta de servicio también necesita los permisos adecuados para extraer datos del servidor API de Kubernetes (consulte a continuación). Si estás utilizando el gráfico Helm de OpenTelemetry Collector (../../helm/collector/), puedes utilizar el valor preestablecido clusterMetrics para comenzar.

Para las condiciones del nodo, el receptor solo recopila Ready de manera predeterminada, pero puede configurarse para recopilar más. El receptor también puede configurarse para informar un conjunto de recursos asignables, como CPU y memory:

k8s_cluster: auth_type: serviceAccount node_conditions_to_report: - Ready - MemoryPressure allocatable_types_to_report: - cpu - memory

Para obtener más información sobre las métricas que se recopilan, consulta Métricas predeterminadas Para obtener detalles de configuración, consulta Receptor de clúster de Kubernetes.

Dado que el procesador usa la API de Kubernetes, necesitas el permiso correcto para funcionar correctamente. Para la mayoría de los casos de uso, debes otorgar a la cuenta de servicio que ejecuta el recopilador los siguientes permisos a través de un ClusterRole.

--- apiVersion: v1 kind: ServiceAccount metadata: name: otel-collector-opentelemetry-collector --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: otel-collector-opentelemetry-collector rules: - apiGroups: - '' resources: - events - namespaces - namespaces/status - nodes - nodes/spec - pods - pods/status - replicationcontrollers - replicationcontrollers/status - resourcequotas - services verbs: - get - list - watch - apiGroups: - apps resources: - daemonsets - deployments - replicasets - statefulsets verbs: - get - list - watch - apiGroups: - extensions resources: - daemonsets - deployments - replicasets verbs: - get - list - watch - apiGroups: - batch resources: - jobs - cronjobs verbs: - get - list - watch - apiGroups: - autoscaling resources: - horizontalpodautoscalers verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: otel-collector-opentelemetry-collector roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: otel-collector-opentelemetry-collector subjects: - kind: ServiceAccount name: otel-collector-opentelemetry-collector namespace: default

Receptor de objetos de Kubernetes

Patrón de implementaciónUtilizable
DaemonSet (agente)Sí, pero generará datos duplicados
Deployment (gateway)Sí, pero más de una réplica generará datos duplicados
SidecarNo

El receptor de objetos de Kubernetes recopila, ya sea extrayendo o observando, objetos del servidor de API de Kubernetes. El caso de uso más común para este receptor es observar eventos de Kubernetes, pero se puede utilizar para recopilar cualquier tipo de objeto de Kubernetes. Dado que el receptor recopila telemetría para el clúster en su totalidad, solo se necesita una instancia del receptor en todo el clúster para recopilar todos los datos.

Actualmente, solo se puede usar una cuenta de servicio para la autenticación. La cuenta de servicio también necesita los permisos adecuados para extraer datos del servidor de API de Kubernetes (ver a continuación). Si estás usando el gráfico Helm de OpenTelemetry Collector y desea ingresar eventos, puedes usar el ajuste preestablecido kubernetesEvents para comenzar.

Para los objetos que se configuran para extraer, el receptor usa la API de Kubernetes para enumerar periódicamente todos los objetos del clúster. Cada objeto se convierte en su propio registro. Para los objetos configurados para observar, el receptor crea un flujo con la API de Kubernetes y recibe actualizaciones a medida que cambian los objetos.

Para ver qué objetos están disponibles para la recopilación en su clúster, ejecute kubectl api-resources:

kubectl api-resources NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 true Binding componentstatuses cs v1 false ComponentStatus configmaps cm v1 true ConfigMap endpoints ep v1 true Endpoints events ev v1 true Event limitranges limits v1 true LimitRange namespaces ns v1 false Namespace nodes no v1 false Node persistentvolumeclaims pvc v1 true PersistentVolumeClaim persistentvolumes pv v1 false PersistentVolume pods po v1 true Pod podtemplates v1 true PodTemplate replicationcontrollers rc v1 true ReplicationController resourcequotas quota v1 true ResourceQuota secrets v1 true Secret serviceaccounts sa v1 true ServiceAccount services svc v1 true Service mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration validatingwebhookconfigurations admissionregistration.k8s.io/v1 false ValidatingWebhookConfiguration customresourcedefinitions crd,crds apiextensions.k8s.io/v1 false CustomResourceDefinition apiservices apiregistration.k8s.io/v1 false APIService controllerrevisions apps/v1 true ControllerRevision daemonsets ds apps/v1 true DaemonSet deployments deploy apps/v1 true Deployment replicasets rs apps/v1 true ReplicaSet statefulsets sts apps/v1 true StatefulSet tokenreviews authentication.k8s.io/v1 false TokenReview localsubjectaccessreviews authorization.k8s.io/v1 true LocalSubjectAccessReview selfsubjectaccessreviews authorization.k8s.io/v1 false SelfSubjectAccessReview selfsubjectrulesreviews authorization.k8s.io/v1 false SelfSubjectRulesReview subjectaccessreviews authorization.k8s.io/v1 false SubjectAccessReview horizontalpodautoscalers hpa autoscaling/v2 true HorizontalPodAutoscaler cronjobs cj batch/v1 true CronJob jobs batch/v1 true Job certificatesigningrequests csr certificates.k8s.io/v1 false CertificateSigningRequest leases coordination.k8s.io/v1 true Lease endpointslices discovery.k8s.io/v1 true EndpointSlice events ev events.k8s.io/v1 true Event flowschemas flowcontrol.apiserver.k8s.io/v1beta2 false FlowSchema prioritylevelconfigurations flowcontrol.apiserver.k8s.io/v1beta2 false PriorityLevelConfiguration ingressclasses networking.k8s.io/v1 false IngressClass ingresses ing networking.k8s.io/v1 true Ingress networkpolicies netpol networking.k8s.io/v1 true NetworkPolicy runtimeclasses node.k8s.io/v1 false RuntimeClass poddisruptionbudgets pdb policy/v1 true PodDisruptionBudget clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBinding clusterroles rbac.authorization.k8s.io/v1 false ClusterRole rolebindings rbac.authorization.k8s.io/v1 true RoleBinding roles rbac.authorization.k8s.io/v1 true Role priorityclasses pc scheduling.k8s.io/v1 false PriorityClass csidrivers storage.k8s.io/v1 false CSIDriver csinodes storage.k8s.io/v1 false CSINode csistoragecapacities storage.k8s.io/v1 true CSIStorageCapacity storageclasses sc storage.k8s.io/v1 false StorageClass volumeattachments storage.k8s.io/v1 false VolumeAttachment

Para obtener detalles de configuración específicos, consulta Receptor de objetos de Kubernetes.

Dado que el procesador usa la API de Kubernetes, necesitas el permiso correcto para funcionar correctamente. Dado que las cuentas de servicio son la única opción de autenticación, debes otorgarle a la cuenta de servicio el acceso adecuado. Para cualquier objeto que desees recopilar, asegúrate de que el nombre se agregue a la función del clúster. Por ejemplo, si deseas recopilar pods, la función del clúster se vería así:

--- apiVersion: v1 kind: ServiceAccount metadata: name: otel-collector-opentelemetry-collector --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: otel-collector-opentelemetry-collector rules: - apiGroups: - '' resources: - pods verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: otel-collector-opentelemetry-collector roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: otel-collector-opentelemetry-collector subjects: - kind: ServiceAccount name: otel-collector-opentelemetry-collector namespace: default

Prometheus Receiver

Patrón de implementaciónUtilizable
DaemonSet (agent)Yes
Deployment (gateway)Yes
SidecarNo

Prometheus es un formato de métricas común tanto para Kubernetes como para los servicios que se ejecutan en Kubernetes. El receptor Prometheus es un reemplazo mínimo e inmediato para la recopilación de esas métricas. Admite el conjunto completo de opciones scrape_config de Prometheus.

Hay algunas funciones avanzadas de Prometheus que el receptor no admite. El receptor devuelve un error si el código/YAML de configuración contiene alguno de los siguientes elementos:

  • alert_config.alertmanagers
  • alert_config.relabel_configs
  • remote_read
  • remote_write
  • rule_files

Para conocer detalles de configuración específicos, consulta Receptor Prometheus.

El receptor Prometheus es Stateful, lo que significa que hay detalles importantes que se deben tener en cuenta al usarlo:

  • El recolector no puede escalar automáticamente el proceso de raspado cuando se ejecutan múltiples réplicas del recolector.
  • Cuando se ejecutan múltiples réplicas del recolector con la misma configuración, raspará los objetivos varias veces.
  • Los usuarios deben configurar cada réplica con una configuración de raspado diferente si desean fragmentar manualmente el proceso de raspado.

Para facilitar la configuración del receptor Prometheus, el operador OpenTelemetry incluye un componente opcional llamado Asignador de destino. Este componente se puede utilizar para indicarle a un recopilador qué puntos finales de Prometheus debe rastrear.

Para obtener más información sobre el diseño del receptor, consulta Diseño.

Receptor de métricas del host

Patrón de implementaciónUtilizable
DaemonSet (agente)Preferido
Deployment (gateway)Sí, pero solo recopila métricas del nodo en el que se implementa
SidecarNo

El receptor de métricas del host recopila métricas de un host mediante una variedad de scrapers. Existe cierta superposición con el receptor de Kubeletstats, por lo que si decides usar ambos, puede que valga la pena deshabilitar estas métricas duplicadas.

En Kubernetes, el receptor necesita acceso al volumen hostfs para funcionar correctamente. Si estás utilizando el gráfico Helm de OpenTelemetry Collector, usa el ajuste preestablecido hostMetrics para comenzar.

Los scrapers disponibles son:

ScraperSistemas operativos compatiblesDescripción
CPUTodos excepto Mac1Métricas de utilización de CPU
DiscoTodos excepto Mac1Métricas de E/S de disco
CargaTodosMétricas de carga de CPU
Sistema de archivosTodosMétricas de utilización del sistema de archivos
MemoriaTodosMétricas de utilización de memoria
RedTodosMétricas de E/S de interfaz de red y métricas de conexión TCP
PaginaciónTodosMétricas de E/S y utilización de espacio de intercambio/paginación
ProcesosLinux, MacMétricas de conteo de procesos
ProcesoLinux, Windows, MacMétricas de E/S de CPU, memoria y disco por proceso

No compatible con Mac cuando se compila sin cgo, que es el valor predeterminado para las imágenes publicadas por el SIG Collector.

Para obtener detalles específicos sobre qué métricas se recopilan y detalles de configuración específicos, consulta Receptor de métricas del host.

Si necesitas configurar el componente usted mismo, asegúrate de montar el volumen hostfs si quieres recopilar las métricas del nodo y no las del contenedor.

--- apiVersion: apps/v1 kind: DaemonSet ... spec: ... template: ... spec: ... containers: - name: opentelemetry-collector ... volumeMounts: ... - name: hostfs mountPath: /hostfs readOnly: true mountPropagation: HostToContainer volumes: ... - name: hostfs hostPath: path: / ...

y luego configura el receptor de métricas de host para usar volumeMount:

receivers: hostmetrics: root_path: /hostfs collection_interval: 10s scrapers: cpu: load: memory: disk: filesystem: network:

Para obtener más detalles sobre el uso del receptor en un contenedor, consulta Recopilación de métricas del host desde dentro de un contenedor (solo Linux)