StackDriver 中的事件
Kubernetes 事件是一种对象,它为用户提供了洞察集群内发生的事情的能力, 例如调度程序做出了什么决定,或者为什么某些 Pod 被逐出节点。 你可以在应用程序自检和调试 中阅读有关使用事件调试应用程序的更多信息。
因为事件是 API 对象,所以它们存储在主控节点上的 API 服务器中。 为了避免主节点磁盘空间被填满,将强制执行保留策略:事件在最后一次发生的一小时后将会被删除。 为了提供更长的历史记录和聚合能力,应该安装第三方解决方案来捕获事件。
本文描述了一个将 Kubernetes 事件导出为 Stackdriver Logging 的解决方案,在这里可以对它们进行处理和分析。
说明: 不能保证集群中发生的所有事件都将导出到 Stackdriver。 事件不能导出的一种可能情况是事件导出器没有运行(例如,在重新启动或升级期间)。 在大多数情况下,可以将事件用于设置 metrics 和 alerts 等目的,但你应该注意其潜在的不准确性。
部署
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 Logging 的 过滤机制 基于事件对象字段进行过滤。 例如,下面的查询将显示调度程序中有关 Deployment nginx-deployment
中的 Pod 的事件:
resource.type="gke_cluster"
jsonPayload.kind="Event"
jsonPayload.source.component="default-scheduler"
jsonPayload.involvedObject.name:"nginx-deployment"