Hello, in this tutorial the goal is to describe the steps needed to deploy Promtail as a Sidecar container to your app in order to ship only the logs you will need to the Log Management System in our case we will use Grafana Loki.

Before we start, I would like to explain to you the reasoning behind the use of the two Kubernetes Objects a Configmap and **emptyDir Volume** . So we will use a emptyDir Volume create a shared temporary space between Containers in which the app logs will reside, also we will use a Configmap to store necessary the configuration used by Promtail in order to know which files need to monitor and where we want to ship the Logs in our case the Loki Url.

So, lets Dive in…

Step1. Create the ConfigMap to store the configuration (promtail.yaml) for Promtail.

apiVersion: v1
kind: ConfigMap
metadata:
  name: promtail-sidecar-config-map
data:
  **promtail.yaml**: |
      server:
        http_listen_port: 9080
        grpc_listen_port: 0
        log_level: "debug"
      positions:
        filename: /tmp/positions.yaml
      clients: # Specify target
        - url: <http://loki.monitoring.svc.cluster.local:3100/loki/api/v1/push>
      scrape_configs:
        - job_name:  "<app-name>" 
          static_configs: 
            - targets: 
                - localhost 
              labels:
                app: "storage-service"
                environment: "<environment-name>" 
                __path__: /app/logs/*.log # Any file .log in the EmptyDir Volume.

Step2. Make the necessary changes in the Deployment Manifest.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <app-service>
  labels:
    app: <app-service>
spec:
  replicas: 1
  selector:
    matchLabels:
      app: <app-service>
  template:
    metadata:
      labels:
        app: <app-service>
    spec:
      containers:
        - name: <app-service>
          image: <your-name>/<app-service>
          imagePullPolicy: Always
          ports:
            - containerPort: <app-port>
          readinessProbe:
            exec:
              command: ["<your health-check>"]
            initialDelaySeconds: 5
          livenessProbe:
            exec:
              command: ["<your health-check>"]
            initialDelaySeconds: 10
          env:
            - name: <ENV-VAR-1>
              valueFrom:
                configMapKeyRef:
                  name: <app-service>-config-map
                  key: appName
            - name:  <ENV-VAR-2>
              valueFrom:
                secretKeyRef:
                  name: <app-service>-secret
                  key: <secret-key>
          volumeMounts:
           - name: shared-logs # shared space monitored with Promtail
             mountPath: /app/logs
        # Sidecar Container Promtail
        - name: promtail
          image: grafana/promtail:master
          args: 
            - "-config.file=/etc/promtail/promtail.yaml" # Found in the ConfigMap
          volumeMounts:
            - name: config
              mountPath: /etc/promtail
            - name: shared-logs # shared space
              mountPath: /app/logs
      imagePullSecrets:
        - name: <registry-secret> # if needed
      volumes:
         - name: config
           configMap:
            name: promtail-sidecar-config-map
         - name: shared-logs  # shared space monitored with Promtail
           emptyDir: 
							sizeLimit: 500Mi

Now we ready to ship only the logs found in the specific directory to Grafana Loki.

I hope you like the tutorial, if you do give a thumps up! and follow me in Twitter, also you can subscribe to my Newsletter in order to avoid missing any of the upcoming tutorials.

Media Attribution

I would like to thank Clark Tibbs for designing the awesome photo I am using in my posts.