Deploy Promtail as a Sidecar to you Main App.

Thodoris Velmachos
2 min readNov 12, 2022

--

by Clark Tibbs

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 the necessary 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.

Originally published at https://t-velmachos.notion.site.

--

--

Thodoris Velmachos

I am a passionate DevOps. I have worked with variety of IT Technologies in the past, I working as a consultant, who can deliver quality services.