SkyWalking Kubernetes Event Exporter User Guide

SkyWalking Kubernetes Event Exporter is able to watch, filter, and send Kubernetes events into the Apache SkyWalking backend.

Demo

Step 1: Create a Local Kubernetes Cluster

Please follow step 1 to 3 in getting started to create a cluster.

Step 2: Deploy OAP server and Event Exporter

Create the skywalking-system namespace.

$ kubectl create namespace skywalking-system

Deploy an OAP server and an event exporter.

cat <<EOF | kubectl apply -f -
apiVersion: operator.skywalking.apache.org/v1alpha1
kind: OAPServer
metadata:
  name: skywalking-system
  namespace: skywalking-system
spec:
  version: 9.5.0
  instances: 1
  image: apache/skywalking-oap-server:9.5.0
  service:
    template:
      type: ClusterIP

---
apiVersion: operator.skywalking.apache.org/v1alpha1
kind: EventExporter
metadata:
  name: skywalking-system
  namespace: skywalking-system
spec:
  replicas: 1
  config: |
    filters:
      - reason: ""     
        message: ""    
        minCount: 1    
        type: ""       
        action: ""     
        kind: "Pod|Service"
        namespace: "^skywalking-system$"  
        name: ""       
        service: "[^\\s]{1,}"  
        exporters:     
          - skywalking 
    exporters:         
      skywalking:      
        template:      
          source:
            service: "{{ .Service.Name }}"
            serviceInstance: "{{ .Pod.Name }}"
            endpoint: ""
          message: "{{ .Event.Message }}" 
        address: "skywalking-system-oap.skywalking-system:11800"
EOF

Wait until both components are ready…

$ kubectl get pod -n skywalking-system 
NAME                                               READY   STATUS    RESTARTS   AGE
skywalking-system-eventexporter-566db46fb6-npx8v   1/1     Running   0          50s
skywalking-system-oap-68bd877f57-zs8hw             1/1     Running   0          50s

Step 3: Check Reported Events

We can verify k8s events is reported to the OAP server by using skywalking-cli.

First, port-forward the OAP http service to your local machine.

$ kubectl port-forward svc/skywalking-system-oap 12800:12800 -n skywalking-system

Next, use swctl to list reported events in YAML format.

$ swctl --display yaml event ls

The output should contain k8s events of the OAP server.

events:
  - uuid: 1d5bfe48-bc8d-4f5a-9680-188f59793459
    source:
      service: skywalking-system-oap
      serviceinstance: skywalking-system-oap-68bd877f57-cvkjb
      endpoint: ""
    name: Pulled
    type: Normal
    message: Successfully pulled image "apache/skywalking-oap-server:9.5.0" in 6m4.108914335s
    parameters: [ ]
    starttime: 1713793327000
    endtime: 1713793327000
    layer: K8S
  - uuid: f576f6ad-748d-4cec -9260-6587c145550e
    source:
      service: skywalking-system-oap
      serviceinstance: skywalking-system-oap-68bd877f57-cvkjb
      endpoint: ""
    name: Created
    type: Normal
    message: Created container oap
    parameters: [ ]
    starttime: 1713793327000
    endtime: 1713793327000
    layer: K8S
  - uuid: 0cec5b55-4cb0-4ff7-a670-a097609c531f
    source:
      service: skywalking-system-oap
      serviceinstance: skywalking-system-oap-68bd877f57-cvkjb
      endpoint: ""
    name: Started
    type: Normal
    message: Started container oap
    parameters: [ ]
    starttime: 1713793327000
    endtime: 1713793327000
    layer: K8S
  - uuid: 28f0d004-befe-4c27-a7b7-dfdc4dd755fa
    source:
      service: skywalking-system-oap
      serviceinstance: skywalking-system-oap-68bd877f57-cvkjb
      endpoint: ""
    name: Pulling
    type: Normal
    message: Pulling image "apache/skywalking-oap-server:9.5.0"
    parameters: [ ]
    starttime: 1713792963000
    endtime: 1713792963000
    layer: K8S
  - uuid: 6d766801-5057-42c0-aa63-93ce1e201418
    source:
      service: skywalking-system-oap
      serviceinstance: skywalking-system-oap-68bd877f57-cvkjb
      endpoint: ""
    name: Scheduled
    type: Normal
    message: Successfully assigned skywalking-system/skywalking-system-oap-68bd877f57-cvkjb
      to kind-worker
    parameters: [ ]
    starttime: 1713792963000
    endtime: 1713792963000
    layer: K8S

We can also verify by checking logs of the event exporter.

kubectl logs -f skywalking-system-eventexporter-566db46fb6-npx8v -n skywalking-system
...
DEBUG done: rendered event is: uuid:"8d8c2bd1-1812-4b0c-8237-560688366280" source:{service:"skywalking-system-oap" serviceInstance:"skywalking-system-oap-68bd877f57-zs8hw"} name:"Started" message:"Started container oap" startTime:1713795214000 endTime:1713795214000 layer:"K8S"

Spec

name description default value
image Docker image of the event exporter. apache/skywalking-kubernetes-event-exporter:latest
replicas Number of event exporter pods. 1
config Configuration of filters and exporters in YAML format. ""

Please note: if you ignore the config field, no filters or exporter will be created.

This is because the EventExporter controller creates a configMap for all config values and attach the configMap to the event exporter container as configuration file. Ignoring the config field means an empty configuration file (with content "") is provided to the event exporter.

Status

name description
availableReplicas Total number of available event exporter pods.
conditions Latest available observations of the underlying deployment’s current state
configMapName Name of the underlying configMap.

Configuration

The event exporter supports reporting specific events by different exporters. We can add filter configs to choose which events we are interested in, and include exporter names in each filter config to tell event exporter how to export filtered events.

An example configuration is listed below:

filters:
  - reason: ""
    message: ""
    minCount: 1
    type: ""
    action: ""
    kind: "Pod|Service"
    namespace: "^default$"
    name: ""
    service: "[^\\s]{1,}"
    exporters:
      - skywalking

exporters:
  skywalking:
    template:
      source:
        service: "{{ .Service.Name }}"
        serviceInstance: "{{ .Pod.Name }}"
        endpoint: ""
      message: "{{ .Event.Message }}"
    address: "skywalking-system-oap.skywalking-system:11800" 

Filter Config

name description example
reason Filter events of the specified reason, regular expression like "Killing\|Killed" is supported. ""
message Filter events of the specified message, regular expression like "Pulling container.*" is supported. ""
minCount Filter events whose count is >= the specified value. 1
type Filter events of the specified type, regular expression like "Normal\|Error" is supported. ""
action Filter events of the specified action, regular expression is supported. ""
kind Filter events of the specified kind, regular expression like "Pod\|Service" is supported. "Pod\|Service"
namespace Filter events from the specified namespace, regular expression like "default\|bookinfo" is supported, empty means all namespaces. "^default$"
name Filter events of the specified involved object name, regular expression like ".*bookinfo.*" is supported. ""
service Filter events belonging to services whose name is not empty. "[^\\s]{1,}"
exporters Events satisfy this filter can be exported into several exporters that are defined below. ["skywalking"]

Skywalking Exporter Config

SkyWalking exporter exports the events into Apache SkyWalking OAP server using grpc.

name description example
address The SkyWalking backend address where this exporter will export to. "skywalking-system-oap.skywalking-system:11800"
enableTLS Whether to use TLS for grpc server connection validation.
If TLS is enabled, the trustedCertPath is required, but clientCertPath and clientKeyPath are optional.
false
clientCertPath Path of the X.509 certificate file. ""
clientKeyPath Path of the X.509 private key file. ""
trustedCertPath Path of the root certificate file. ""
insecureSkipVerify Whether a client verifies the server’s certificate chain and host name. Check tls.Config for more details. false
template The event template of SkyWalking exporter, it can be composed of metadata like Event, Pod, and Service.
template.source Event source information.
template.source.service Service name, can be a template string. "{{ .Service.Name }}"
template.source.serviceInstance Service instance name, can be a template string. "{{ .Pod.Name }}"
template.source.endpoint Endpoint, can be a template string. ""
template.message Message format, can be a template string. "{{ .Event.Message }}"

Console Exporter Config

Console exporter exports the events into console logs, this exporter is typically used for debugging.

name description example
template The event template of SkyWalking exporter, it can be composed of metadata like Event, Pod, and Service.
template.source Event source information.
template.source.service Service name, can be a template string. "{{ .Service.Name }}"
template.source.serviceInstance Service instance name, can be a template string. "{{ .Pod.Name }}"
template.source.endpoint Endpoint, can be a template string. ""
template.message Message format, can be a template string. "{{ .Event.Message }}"