StackDriver 中的事件

Kubernetes 事件是一种对象,它为用户提供了洞察集群内发生的事情的能力, 例如调度程序做出了什么决定,或者为什么某些 Pod 被逐出节点。 你可以在应用程序自检和调试 中阅读有关使用事件调试应用程序的更多信息。

因为事件是 API 对象,所以它们存储在主控节点上的 API 服务器中。 为了避免主节点磁盘空间被填满,将强制执行保留策略:事件在最后一次发生的一小时后将会被删除。 为了提供更长的历史记录和聚合能力,应该安装第三方解决方案来捕获事件。

本文描述了一个将 Kubernetes 事件导出为 Stackdriver Logging 的解决方案,在这里可以对它们进行处理和分析。

说明: 不能保证集群中发生的所有事件都将导出到 Stackdriver。 事件不能导出的一种可能情况是事件导出器没有运行(例如,在重新启动或升级期间)。 在大多数情况下,可以将事件用于设置 metricsalerts 等目的,但你应该注意其潜在的不准确性。

部署

Google Kubernetes Engine

在 Google Kubernetes Engine 中,如果启用了云日志,那么事件导出器默认部署在主节点运行版本为 1.7 及更高版本的集群中。 为了防止干扰你的工作负载,事件导出器没有设置资源,并且处于尽力而为的 QoS 类型中,这意味着它将在资源匮乏的情况下第一个被杀死。 如果要导出事件,请确保有足够的资源给事件导出器 Pod 使用。 这可能会因为工作负载的不同而有所不同,但平均而言,需要大约 100MB 的内存和 100m 的 CPU。

部署到现有集群

使用下面的命令将事件导出器部署到你的集群:

kubectl create -f https://k8s.io/examples/debug/event-exporter.yaml

由于事件导出器访问 Kubernetes API,因此它需要权限才能访问。 以下的部署配置为使用 RBAC 授权。 它设置服务帐户和集群角色绑定,以允许事件导出器读取事件。 为了确保事件导出器 Pod 不会从节点中退出,你可以另外设置资源请求。 如前所述,100MB 内存和 100m CPU 应该就足够了。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: event-exporter-sa
  namespace: default
  labels:
    app: event-exporter
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: event-exporter-rb
  labels:
    app: event-exporter
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
- kind: ServiceAccount
  name: event-exporter-sa
  namespace: default
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: event-exporter-v0.2.3
  namespace: default
  labels:
    app: event-exporter
spec:
  selector:
    matchLabels:
      app: event-exporter
  replicas: 1
  template:
    metadata:
      labels:
        app: event-exporter
    spec:
      serviceAccountName: event-exporter-sa
      containers:
      - name: event-exporter
        image: k8s.gcr.io/event-exporter:v0.2.3
        command:
        - '/event-exporter'
      terminationGracePeriodSeconds: 30

用户指南

事件在 Stackdriver Logging 中被导出到 GKE Cluster 资源。 你可以通过从可用资源的下拉菜单中选择适当的选项来找到它们:

Stackdriver 日志接口中事件的位置

你可以使用 Stackdriver Logging 的 过滤机制 基于事件对象字段进行过滤。 例如,下面的查询将显示调度程序中有关 Deployment nginx-deployment 中的 Pod 的事件:

resource.type="gke_cluster"
jsonPayload.kind="Event"
jsonPayload.source.component="default-scheduler"
jsonPayload.involvedObject.name:"nginx-deployment"
在 Stackdriver 接口中过滤的事件
最后修改 August 10, 2020 at 11:40 AM PST: [zh] Tidy up and fix links in tasks section (2/10) (128182188)