skip.link.title
share

IBM Cloud Kubernetes Logs Integration

With this integration you can:

  • Forward all Containerd container logs
  • Use log globs to choose which container log files to tail
  • Drop noisy logs with dropEvents
  • Forward logs to different Apps
  • Enable Kubernetes audit logs

IBM Cloud Kubernetes uses Cointainerd as the container engine. In this case Logagent can't use the Docker remote API to retrieve logs and metadata. Instead, logs are collected from Containerd log files, which requires access to the relevant directories.

The Logagent input-filter for Containerd supports:

  • Tailing log files from /var/log/containers/, /var/log/pods and /var/data/kubeletlogs
  • Enrichment of logs with podName, namespace, containerName, containerId
  • Joining long log events over 4KB into one log event
  • Parsing Containerd log headers (timestamp, stream, flags)
  • Parsing message content with Logagent's parser library

Default Setup of IBM Cloud Kubernetes Logs

With the default setup you edit env vars to change the configuration.

Forward all Container Logs

Run Logagent as Kubernetes DaemonSet.

First, create the ibm-cloud-logagent-ds.yml DaemonSet file.

curl -o ibm-cloud-logagent-ds.yml  https://raw.githubusercontent.com/sematext/logagent-js/master/kubernetes/ibm-cloud-logagent-ds.yml

Set your LOGS_TOKEN in the spec.env section in the ibm-cloud-logagent-ds.yml file.

Then run the DaemonSet:

kubectl create -f ibm-cloud-logagent-ds.yml

Use LOG_GLOB to Filter Which Container Logs to Forward

Log globs make it easy to use wildcards to filter in/out which log files to tail. In the spec.env.LOG_GLOB env var you can set values not to include logs from certain containers. To read more about log globs, check this out.

Here's how you can exclude all logs from the kube-system namespace:

env:
  - name: LOG_GLOB
    value: "/var/log/containers/!(*kube-system*.log);/var/log/*.log"

Or, only include logs from the default namespace:

env:
  - name: LOG_GLOB
    value: "/var/log/containers/*default*.log;/var/log/*.log"

This is a quick way of including/excluding logs from containers.

Advanced Setup of IBM Cloud Kubernetes Logs

With the advanced setup you add a logagent.conf file as a ConfigMap to change the configuration. With this config file you have more control over the settings, including:

  • dropping logs
  • log routing
  • more fine tuned filtering
  • ability to add audit logs

1. Create a logagent.conf file

The logagent.conf is the main config file for Logagent.

# logagent.conf
options:
  debug: false

input: 
  files: 
    - /var/log/*.log
    - /var/log/containers/*.log

inputFilter:
  - module: input-filter-k8s-containerd

outputFilter:
  kubernetesEnrichment:
    module: kubernetes-enrichment

output:
  elasticsearch:
    module: elasticsearch
    url: https://logsene-receiver.sematext.com # for US
    # url: https://logsene-receiver.eu.sematext.com # for EU
    index: YOUR_SEMATEXT_LOGS_TOKEN

This particular config above will work the same as using the default setup with env vars. You may need to adjust the url to the Sematext region you are using.

2. Add the logagent.conf as a ConfigMap

Create the ConfigMap from the logagent.conf file. Run this command from the dir where you have the logagent.conf:

kubectl create configmap logagent-config --from-file=./logagent.conf

3. Create the Logagent DaemonSet

Create the ibm-cloud-logagent-with-config-ds.yml DaemonSet file.

curl -o ibm-cloud-logagent-with-config-ds.yml https://raw.githubusercontent.com/sematext/logagent-js/master/kubernetes/ibm-cloud-logagent-with-config-ds.yml 

You don't need to change anything as all the config is in logagent.conf, just run the DaemonSet:

kubectl create -f ibm-cloud-logagent-with-config-ds.yml

When you want to edit the config, change the logagent.conf, recreate the ConfigMap, restart the Logagent Pod to grab the new ConfigMap and you're done!

Continue reading below to see how to configure more advanced settings.

Drop Noisy Container Logs

Edit the logagent.conf to add the drop-events outputFilter.

# logagent.conf
options:
  debug: false

input: 
  files: 
    - /var/log/*.log
    - /var/log/containers/*.log

inputFilter:
  - module: input-filter-k8s-containerd

outputFilter:
  dropEvents:
    module: drop-events
    filters:
      message:
        include: !!js/regexp /critical|auth|error|failed/
        exclude: !!js/regexp /status/i
  kubernetesEnrichment:
    module: kubernetes-enrichment

output:
  elasticsearch:
    module: elasticsearch
    url: https://logsene-receiver.sematext.com
    index: YOUR_SEMATEXT_LOGS_TOKEN

In the filters section you can pick a field to apply regex matching to. If there's a match you can either include or exclude that particular log line. The example above will include all log lines that match critical|auth|error|failed but exclude all that match status.

Forward Container Logs to Multiple Apps with Log Routing

To enable log routing you edit the output plugin to use multiple indices. Under the token value you need to add a regex for the log file you want to match.

# logagent.conf
options:
  debug: true

input: 
  files: 
    - /var/log/*.log
    - /var/log/containers/*.log

inputFilter:
  - module: input-filter-k8s-containerd

outputFilter:
  dropEventsFilter:
    module: drop-events
    filters:
      message:
        exclude: !!js/regexp /status/i
  kubernetesEnrichment:
    module: kubernetes-enrichment

output:
  elasticsearch:
    module: elasticsearch
    url: https://logsene-receiver.sematext.com
    indices: 
      b0e9f481-xxxx-xxxx-xxxx-3ff20227d3d3: # All logs except kube-system
        - ^(?!.*(kube-system).*).*\.log
      9365eb2f-xxxx-xxxx-xxxx-5a833072353f: # Only kube-system logs
        - .*kube-system.*\.log

In place of b0e9f481-xxxx-xxxx-xxxx-3ff20227d3d3 and 9365eb2f-xxxx-xxxx-xxxx-5a833072353f in the example above you would use your own Sematext Apps logs tokens.

Enable Kubernetes Audit Logs

Create a Kubernetes Audit Logs App and a Generic Logs App.

Forwarding Kubernetes audit logs is similar to log routing. The prerequisite is to follow steps 1-9 in the official IBM docs here.

This will provision an audit webhook that will forward logs to a log file. With Logagent you can tail this file and forward logs to a Kubernetes Audit Logs App in Sematext.

In your logagent.conf, under the indices section, where you specify the token value for your Kubernetes Audit Logs App, you need to add a regex for the name of the audit webhook you created in the steps above. The name of this Pod is ibm-kube-audit.

# logagent.conf
options:
  debug: true

input: 
  files: 
    - /var/log/*.log
    - /var/log/containers/!(st-logagent*.log) # exclude Logagent's own logs

inputFilter:
  - module: input-filter-k8s-containerd

outputFilter:
  dropEventsFilter:
    module: drop-events
    filters:
      message:
        exclude: !!js/regexp /status/i
  kubernetesEnrichment:
    module: kubernetes-enrichment

output:
  elasticsearch:
    module: elasticsearch
    url: https://logsene-receiver.sematext.com
    indices: 
      b0e9f481-xxxx-xxxx-xxxx-3ff20227d3d3: # generic logs app
        - ^(?!.*(ibm-kube-audit).*).*\.log
      9365eb2f-xxxx-xxxx-xxxx-5a833072353f: # kubernetes audit logs app
        - .*ibm-kube-audit.*\.log

This config will route all audit logs to your Kubernetes Audit Logs App and the other logs to your other Generic Logs App.

Note: Here's how you find the token after you create a Kubernetes Audit Logs App.

Need more help?

This was a brief overview of how to configure logging for IBM Cloud Kubernetes Service. If you have any more questions, feel free to reach out through the live chat or Twitter @sematext!