Skip to main content

Chapter 11.2 - Log Management

Learning Objectives

By the end of this chapter, you will be able to:

  • Understand log management in Kubernetes
  • Use kubectl to view logs
  • Centralize logs with EFK/Loki
  • Configure Fluentd/Fluent Bit
  • Analyze logs with Kibana/Grafana
  • Implement log rotation

Introduction

Logs are essential for debugging and monitoring. In Kubernetes, logs are managed at the container level and must be centralized for efficient analysis.


Logs with kubectl

Viewing Pod Logs

# Logs of a Pod
kubectl logs my-pod

# Logs of a specific container
kubectl logs my-pod -c my-container

# Logs of all containers
kubectl logs my-pod --all-containers=true

# Logs with follow (streaming)
kubectl logs -f my-pod

# Previous logs (if Pod restarted)
kubectl logs my-pod --previous

# Logs with timestamps
kubectl logs my-pod --timestamps

# Limit the number of lines
kubectl logs my-pod --tail=100

# Logs since a specific time
kubectl logs my-pod --since=1h

Logs from Multiple Pods

# Logs of all Pods with a label
kubectl logs -l app=my-app

# Logs of a Deployment
kubectl logs deployment/my-app

# Logs of a StatefulSet
kubectl logs statefulset/my-app

Log Centralization

EFK Stack (Elasticsearch, Fluentd, Kibana)

Architecture:

  • Fluentd: Collects and sends logs
  • Elasticsearch: Stores logs
  • Kibana: Visualizes and searches logs

Loki Stack (Loki, Grafana)

Architecture:

  • Fluent Bit: Collects logs
  • Loki: Stores logs (like Prometheus for logs)
  • Grafana: Visualizes logs

Installing the EFK Stack

Via Helm

# Add the repository
helm repo add elastic https://helm.elastic.co
helm repo update

# Install Elasticsearch
helm install elasticsearch elastic/elasticsearch \
--namespace logging \
--create-namespace

# Install Fluentd
helm install fluentd fluent/fluentd \
--namespace logging

# Install Kibana
helm install kibana elastic/kibana \
--namespace logging

Fluentd Configuration

Fluentd DaemonSet

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: logging
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.logging.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers

Installing the Loki Stack

Via Helm

# Add the repository
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

# Install Loki
helm install loki grafana/loki-stack \
--namespace logging \
--create-namespace

Fluent Bit Configuration

apiVersion: v1
kind: ConfigMap
metadata:
name: fluent-bit-config
namespace: logging
data:
fluent-bit.conf: |
[SERVICE]
Flush 1
Log_Level info

[INPUT]
Name tail
Path /var/log/containers/*.log
Parser docker
Tag kube.*
Refresh_Interval 5

[OUTPUT]
Name loki
Match kube.*
Host loki.logging.svc.cluster.local
Port 3100
Labels job=fluentbit

Analysis with Kibana

Access

# Port-forward
kubectl port-forward -n logging svc/kibana-kibana 5601:5601

Kibana Query Language (KQL):

kubernetes.namespace: "production" AND level: "error"

Lucene:

kubernetes.namespace:production AND level:error

Analysis with Grafana

Access

# Port-forward
kubectl port-forward -n logging svc/loki-grafana 3000:80

LogQL (Loki Query Language)

# Logs from a namespace
{namespace="production"}

# Logs with errors
{namespace="production"} |= "error"

# Log rate per second
rate({namespace="production"}[5m])

Log Lifecycle


Best Practices

1. Centralization

Centralize all logs in a single system.

2. Rotation

Configure log rotation to prevent storage exhaustion.

3. Indexing

Index logs for fast searching.

4. Retention

Define an appropriate retention policy.

5. Parsing

Parse structured logs (JSON) for better searching.


Summary

In this chapter, you learned:

kubectl logs: View Pod logs
Centralization: EFK Stack or Loki Stack
Fluentd/Fluent Bit: Log collection
Elasticsearch: Storage and search
Loki: Lightweight log storage
Kibana/Grafana: Visualization and analysis
Best practices: Centralization, rotation, indexing, retention


Next Steps

Chapter 11.3: Alerting
Chapter 11.4: Distributed Tracing
Lab 11.3: Logging Configuration


Chapter created on: December 2024