在 Kubernetes 中,事件是提供对集群内状态变化洞察的对象。进行 Kubernetes 事件监控对于实时洞察 Kubernetes 集群的运行状态至关重要。它使管理员能够快速识别并响应问题,优化资源分配,并确保其容器化应用程序的平稳高效运行。
译自 Kubernetes Events Monitoring with OpenTelemetry | Complete Tutorial。作者 Dejan Lukić。
如果您想直接开始实施,请从先决条件部分开始。
分析 Kubernetes 集群中特定事件是可观测性的关键组成部分,为更快的问题解决提供了对集群事件之间关联的深入洞察。
这个教程将演示如何使用OpenTelemetry Collector收集Kubernetes事件并将它们转发到SigNoz。
但在此之前,让我们更深入地了解一下Kubernetes事件以及监控它们为何如此重要。
Kubernetes 事件是提供有关集群内活动更新的通知,例如 pod 的启动或崩溃。它们提供了对变更和操作的历史视图,有助于跟踪和解决问题。
这些事件是系统就重要操作或问题进行通信的手段,对于维护 Kubernetes 设置的健康和效率至关重要。
Kubernetes 事件的类型:
监控 Kubernetes 事件对于保持对集群活动的实时了解至关重要。这些事件充当详细日志,标记变更、pod 生命周期事件和错误。通过监控这些事件,您可以随时了解集群内的状态和活动。
监控 Kubernetes 事件对以下几个关键原因至关重要:
OpenTelemetry 是一组 API、SDK、库和集成,旨在标准化遥测数据(日志、度量和跟踪)的生成、收集和管理。它由云原生计算基金会支持,是可观测性领域的主要开源项目。
通过 OpenTelemetry 收集的数据是与供应商无关的,可以发送到您选择的任何后端。在本教程中,我们将 Kubernetes 事件发送到 SigNoz,这是一个 OpenTelemetry 原生的 APM。
OpenTelemetry 充当中间人,收集有关 pod 活动、错误和资源使用的数据。这些收集到的信息帮助您了解集群内部发生了什么,从而更轻松地排除问题并保持系统平稳运行。
OpenTelemetry 提供了 OpenTelemetry Collector,可用作具有许多灵活配置的遥测处理系统,用于收集和管理遥测数据。我们将使用 OpenTelemetry Collector 来收集 Kubernetes 事件并将其发送到 SigNoz。
receiver是数据进入 OpenTelemetry Collector 的方式。receiver通过顶层的 receivers
标签在 YAML 中进行配置。至少必须有一个启用的receiver,以使配置被视为有效。
以下是 otlp receiver的示例:
receivers:
otlp:
protocols:
grpc:
http:
OTLP receiver可以通过 gRPC 或 HTTP 使用 OTLP 格式接收数据。您可以通过 YAML 文件启用高级配置。
以下是 otlp receiver 的示例配置:
receivers:
otlp:
protocols:
http:
endpoint: "localhost:4318"
cors:
allowed_origins:
- http://test.com
# Origins can have wildcards with *, use * by itself to match any origin.
- https://*.example.com
allowed_headers:
- Example-Header
max_age: 7200
您可以在此处找到有关高级配置的更多详细信息。
配置receiver后,必须启用它。receiver通过服务部分内的pipeline启用。pipeline包括一组receiver、processor和exporter。
以下是一个pipeline配置示例:
service:
pipelines:
metrics:
receivers: [otlp, prometheus]
exporters: [otlp, prometheus]
traces:
receivers: [otlp, jaeger]
processors: [batch]
exporters: [otlp, zipkin]
为了收集 Kubernetes 事件,OpenTelemetry Collector 提供了 k8seventsreceiver。
每个 OpenTelemetry receiver都收集其指定的一部分度量、日志和/或跟踪。在这种情况下,Kubernetes 事件receiver仅收集日志。以下是由 Kubernetes 事件receiver收集的日志,分为两组:事件和对象。
receiver收集的事件数据:
度量名称 | 描述 | 度量 |
---|---|---|
事件原因 | 事件的原因 | k8s.event.reason |
事件操作 | 给定的事件操作 | k8s.event.action |
事件开始时间 | 事件的开始时间 | k8s.event.start_time |
事件名称 | 事件的名称 | k8s.event.name |
事件唯一标识符 | 事件的唯一标识符 | k8s.event.uid |
事件计数 | 事件的总计数 | k8s.event.count |
receiver收集的对象数据:
度量名称 | 描述 | 度量 |
---|---|---|
对象类型 | K8s 对象的类型 | k8s.object.kind |
对象名称 | 对象的名称 | k8s.object.name |
对象唯一标识符 | 对象的唯一标识符 | k8s.object.uid |
对象字段路径 | 对象的字段路径 | k8s.object.fieldpath |
对象 API 版本 | 对象的 API 版本 | k8s.object.api_version |
对象资源版本 | 对象的资源版本 | k8s.object.resource_version |
在开始之前,您需要:
现在,您将使用 k8seventsreceiver
和一个 OTLP exporter来设置 OpenTelemetry Collector。
了解有关 Kubernetes 和 OpenTelemetry collector 的更多信息,访问 SigNoz。
创建一个带有 otelcontribcol
配置的 ConfigMap。将 <YOUR SIGNOZ REGION>
替换为您 SigNoz 云区域的值,同时将 <YOUR SIGNOZ ACCESS TOKEN>
替换为仪表板中找到的令牌。
apiVersion: v1
kind: ConfigMap
metadata:
name: otelcontribcol
labels:
app: otelcontribcol
data:
config.yaml: |
receivers:
k8s_events:
namespaces: [default, my_namespace, platform]
exporters:
otlp:
endpoint: https://ingest.<YOUR SIGNOZ REGION>.signoz.cloud:443
tls:
insecure: false
timeout: 20s # Adjust the timeout value as needed
headers:
"signoz-access-token": <YOUR SIGNOZ ACCESS TOKEN>
service:
pipelines:
logs:
receivers: [k8s_events]
exporters: [otlp]
通过运行以下命令应用配置映射:
$ kubectl apply -f configuration-map.yaml
创建collector 应使用的服务账户。
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app: otelcontribcol
name: otelcontribcol
通过运行以下命令将服务账户应用到集群:
$ kubectl apply -f service-account.yaml
使用下面的命令创建具有所需权限的 ClusterRole
,并创建一个 ClusterRoleBinding
将该角色授予上面创建的服务账户。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: otelcontribcol
labels:
app: otelcontribcol
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"]
通过运行以下命令将 ClusterRole 应用到集群:
$ kubectl apply -f cluster-role.yaml
创建一个 Deployment 以部署collector 。
apiVersion: apps/v1
kind: Deployment
metadata:
name: otelcontribcol
labels:
app: otelcontribcol
spec:
replicas: 1
selector:
matchLabels:
app: otelcontribcol
template:
metadata:
labels:
app: otelcontribcol
spec:
serviceAccountName: otelcontribcol
containers:
- name: otelcontribcol
image: signoz/otelcontribcol:latest
args: ["--config", "/etc/config/config.yaml"]
volumeMounts:
- name: config
mountPath: /etc/config
imagePullPolicy: IfNotPresent
volumes:
- name: config
configMap:
name: otelcontribcol
通过运行以下命令将清单应用到集群:
$ kubectl apply -f deployment.yaml
部署 OpenTelemetry Collector 后,您可以在 SigNoz 中访问日志选项卡,查看 Kubernetes 事件的日志。
在 SigNoz Logs 选项卡中监视 Kubernetes 事件的日志。
您还可以通过以下步骤从日志创建仪表板:
现在,您已经有了一个包含receiver发送的大多数度量标的仪表板,其中包括一些时间序列图,以提高视觉体验。
Kubernetes 事件监控仪表板
在本教程中,您安装了OpenTelemetry Collector来收集Kubernetes事件,并将收集到的数据发送到SigNoz进行监控和警报。
请访问我们的OpenTelemetry Collector完整指南,以深入了解它。OpenTelemetry正在悄悄地成为开源可观察性的世界标准,通过使用它,您可以获得诸如所有遥测信号的单一标准、无供应商锁定等优势。
SigNoz是一个开源的OpenTelemetry本地APM,可用作您所有可观察性需求的单一后端。