文档

采集Kubernetes事件

更新时间:

本文档主要介绍如何使用eventer将Kubernetes中的事件采集到日志服务。

日志服务支持通过eventer方式和K8s事件中心采集Kubernetes中的事件。

  • eventer方式

    Kubernetes事件采集相关源码请参见GitHub

  • K8s事件中心(推荐)

    日志服务还支持通过日志服务控制台的K8s事件中心采集Kubernetes中的事件并自动创建可视化报表和相关告警。更多信息,请参见创建并使用K8s事件中心

步骤一:创建K8s事件中心

  1. 登录日志服务控制台

  2. 日志应用区域的智能运维页签中,单击K8s事件中心

  3. 事件中心管理页面,单击添加

  4. 创建事件中心面板,配置相关参数。

    • 如果选择已有Project,则从Project下拉框中选择已创建的Project,用于管理K8s事件中心相关资源(Logstore、仪表盘等)。

    • 如果选择从容器服务选择K8s集群,则从K8s集群下拉框中选择已创建的K8s集群。通过此方式创建K8s事件中心,日志服务默认创建一个名为k8s-log-{cluster-id}的Project,用于管理K8s事件中心相关资源(Logstore、仪表盘等)。

    说明

    创建K8s事件中心后,日志服务自动在目标Project中生成一个名为k8s-event的Logstore,并生成相关联的仪表盘等。

  5. 单击下一步

步骤二:创建采集配置

阿里云Kubernetes

如果是ACK集群,则对应阿里云Kubernetes组件中的ack-node-problem-detector组件已集成eventer和node-problem-detector功能,您只需要部署该组件。更多信息,请参见事件监控。如果是ACK Serverless集群,您需要部署kube-eventer组件。

此处以ACK集群为例。

  1. 登录容器服务管理控制台

  2. 在左侧导航栏中,单击集群

  3. 集群列表页面中,单击目标集群最右侧的更多

  4. 选择运维管理 > 组件管理

  5. 日志与监控页签中,找到ack-node-problem-detector,然后单击安装

    安装完成后,您可以选择运维管理 > 事件中心,查看事件中心仪表盘。

其他Kubernetes

  1. 部署eventer。

    1. 安装kubectl工具。具体操作,请参见通过kubectl连接Kubernetes集群

    2. 使用以下样例创建名为eventer.yaml的配置文件。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          name: kube-eventer
        name: kube-eventer
        namespace: kube-system
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: kube-eventer
        template:
          metadata:
            labels:
              app: kube-eventer
            annotations:
              scheduler.alpha.kubernetes.io/critical-pod: ''
          spec:
            dnsPolicy: ClusterFirstWithHostNet
            serviceAccount: kube-eventer
            containers:
              - image: registry.cn-hangzhou.aliyuncs.com/acs/kube-eventer:v1.2.5-cc7ec54-aliyun
                name: kube-eventer
                command:
                  - "/kube-eventer"
                  - "--source=kubernetes:https://kubernetes.default"
                  ## .send to sls
                  ## --sink=sls:https://{endpoint}?project={project}&logStore=k8s-event&regionId={region-id}&internal=false&accessKeyId={accessKeyId}&accessKeySecret={accessKeySecret}
                  - --sink=sls:https://cn-beijing.log.aliyuncs.com?project=k8s-xxxx&logStore=k8s-event&regionId=cn-beijing&internal=false&accessKeyId=xxx&accessKeySecret=xxx
                env:
                  # If TZ is assigned, set the TZ value as the time zone
                  - name: TZ
                    value: "Asia/Shanghai"
                volumeMounts:
                  - name: localtime
                    mountPath: /etc/localtime
                    readOnly: true
                  - name: zoneinfo
                    mountPath: /usr/share/zoneinfo
                    readOnly: true
                resources:
                  requests:
                    cpu: 10m
                    memory: 50Mi
                  limits:
                    cpu: 500m
                    memory: 250Mi
            volumes:
              - name: localtime
                hostPath:
                  path: /etc/localtime
              - name: zoneinfo
                hostPath:
                  path: /usr/share/zoneinfo
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: kube-eventer
      rules:
        - apiGroups:
            - ""
          resources:
            - events
          verbs:
            - get
            - list
            - watch
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: kube-eventer
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: kube-eventer
      subjects:
        - kind: ServiceAccount
          name: kube-eventer
          namespace: kube-system
      ---
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: kube-eventer
        namespace: kube-system

      配置项

      类型

      是否必选

      说明

      endpoint

      string

      必选

      日志服务的Endpoint。更多信息,请参见服务入口

      project

      string

      必选

      日志服务的Project。

      logStore

      string

      必选

      日志服务的Logstore。

      internal

      string

      自建Kubernetes:必选。

      自建Kubernetes必须设置为false。

      regionId

      string

      自建Kubernetes:必选。

      日志服务所在地域ID。更多信息,请参见服务入口

      accessKeyId

      string

      自建Kubernetes:必选。

      AccessKey ID,建议使用RAM用户的AccessKey信息。更多信息,请参见访问密钥

      accessKeySecret

      string

      自建Kubernetes:必选。

      AccessKey Secret,建议使用RAM用户的AccessKey信息。更多信息,请参见访问密钥

    3. 执行以下命令,将eventer.yaml中的配置应用到集群。

      kubectl apply -f eventer.yaml

      预期输出:

      deployment.apps/kube-eventer created
      clusterrole.rbac.authorization.k8s.io/kube-eventer created
      clusterrolebinding.rbac.authorization.k8s.io/kube-eventer created
      serviceaccount/kube-eventer created
  2. 部署node-problem-detector。

    具体操作,请参见Github

步骤三:使用K8s事件中心

创建K8s事件中心并部署Eventer和NodeProblemDetector后,即可使用K8s事件中心,包括查看事件总览、查询事件详情、查看Pod生命周期、查看节点事件、查看核心组件事件、设置告警、自定义查询和更新版本等操作。

K8s事件中心页面,找到目标K8s事件中心实例,单击k8s事件中心-002图标,可进行如下操作。

操作

说明

查看事件总览

事件总览页面用于展示核心事件的汇总统计信息。例如事件总数、今天Error事件数与昨天的对比、告警项统计、Error事件趋势、Pod OOM详细信息等。

说明

目前Pod OOM信息不能精确到Pod,只能定位到事件发生的节点、进程名、进程号。您可以通过自定义查询查找Pod OOM发生时间点附近的Pod重启事件,以此定位到具体的Pod。

查询事件详情

事件详情查询页面用于展示经过各种维度(事件类型、事件目标、Host、Namespace、Name)过滤后的事件详细信息。

查看Pod生命周期

Pod生命周期页面以图形化方式展示Pod整个生命周期中的事件信息。您还可以通过事件等级筛选重要的Pod事件。

查看节点事件

节点事件页面用于展示节点事件详情。例如Node生命周期、事件列表等。

查看核心组件事件

核心组件事件页面用于展示核心组件事件详情。例如ECS重启失败、URL模式未执行等。

设置告警

告警配置页面,您可以为K8s事件中心设置告警。具体操作,请参见设置告警

自定义查询

自定义查询页面,您可以自定义查询和分析语句。

K8s事件中心的所有事件都保存在Logstore中,您可以使用Logstore中的所有功能,例如自定义查询、消费事件、创建自定义报表、创建自定义告警等。更多信息,请参见查询和分析日志

如果您要访问K8s事件中心所在的Project,可通过以下两种方式获取Project名称。

  • 通过自定义查询页面的URL定位到Project。URL规则为https://sls.console.aliyun.com/lognext/app/k8s-event/project/k8s-log-xxxx/logsearch/k8s-event,Project字段的后一个字段即为日志服务Project名称,例如k8s-log-xxxx。

  • 事件中心管理页签的K8s事件中心列表中,查看目标K8s事件中心实例对应的Project名称。

更新版本

版本更新页面,您可以升级K8s事件中心的版本。

在指定的Logstore查询到日志后,日志样例及参数说明请参见日志样例

日志样例

采集到的日志样例如下所示。

hostname:  cn-hangzhou.i-***********"
level:  Normal
pod_id:  2a360760-****
pod_name:  logtail-ds-blkkr
event_id:  {  
   "metadata":{  
      "name":"logtail-ds-blkkr.157b7cc90de7e192",
      "namespace":"kube-system",
      "selfLink":"/api/v1/namespaces/kube-system/events/logtail-ds-blkkr.157b7cc90de7e192",
      "uid":"2aaf75ab-****",
      "resourceVersion":"6129169",
      "creationTimestamp":"2019-01-20T07:08:19Z"
   },
   "involvedObject":{  
      "kind":"Pod",
      "namespace":"kube-system",
      "name":"logtail-ds-blkkr",
      "uid":"2a360760-****",
      "apiVersion":"v1",
      "resourceVersion":"6129161",
      "fieldPath":"spec.containers{logtail}"
   },
   "reason":"Started",
   "message":"Started container",
   "source":{  
      "component":"kubelet",
      "host":"cn-hangzhou.i-***********"
   },
   "firstTimestamp":"2019-01-20T07:08:19Z",
   "lastTimestamp":"2019-01-20T07:08:19Z",
   "count":1,
   "type":"Normal",
   "eventTime":null,
   "reportingComponent":"",
   "reportingInstance":""
}

日志字段

数据类型

说明

hostname

String

事件发生所在的主机名。

level

String

日志等级,包括Normal、Warning。

pod_id

String

Pod的唯一标识,仅在该事件类型和Pod相关时才具有此字段。

pod_name

String

Pod名,仅在该事件类型和Pod相关时才具有此字段。

event_id

JSON

事件的详细内容。该字段为JSON类型的字符串。