Gestion des logs
Explication
La remonté des logs est une étape importante dans la surveillance d’un cluster Kubernetes. Et dans une infrastructure datacenter. Cela permet de voir les logs des applications, des services, des pods, etc. Et de pouvoir les analyser pour voir si tout fonctionne correctement. Et de pouvoir réagir rapidement en cas de problème. La remonté des logs apporte aussi une notion de cybersécurité. Car cela permet de voir si des attaques sont en cours. Et de pouvoir réagir rapidement. Cela permet aussi de voir si des erreurs sont présentes dans les logs. Et de pouvoir les corriger. Cela permet aussi de voir si des services sont en surcharge. Et de pouvoir réagir rapidement.
Schema de fonctionnement
Il y a de fonctionnement différent de la remonté de logs sur notre archiveur loki. Il y a les instances kubernetes qui elles vont simplement envoyer des logs via le réseau local kubernetes en json. Et toutes les autres machines vont elles envoyer les logs via syslog qui vont etre converti en json par promtail. Puis envoyé à loki.
Schema de fonctionnement des logs sous kubernetes

Schéma de fonctionnement des logs sous rsyslog

Configuration pour les machines
Installation du serveur
Nous avons décider de prendre une machine Debian 12.
Ensuite il a fallu installer les paquets rsyslog et promtail.
Pour l’installation de rsyslog voici la procédure à suivre :
apt-get update
apt-get install rsyslogEnsuite, il faut changer la configuration de journalctl pour qu’il envoie les logs à rsyslog. Dans le fichier /etc/systemd/journald.conf il faut dé commenter la ligne ForwardToSyslog=yes et redémarrer le service En effectuant la commande
systemctl restart systemd-journaldPour ceux qui est de l’installation de promtail il faut suivre la procédure suivante :
echo "deb https://packagecloud.io/grafana/stable/debian/ bullseye main"
> /etc/apt/sources.list.d/grafana-stable.list
curl https://packagecloud.io/gpg.key | apt-key add -
apt-get update
apt-get install promtailConfiguration de rsyslog
Voici la configuration rsyslog à ajouter dans /etc/rsyslog/rsyslog.d/promtail.conf
# Renvoie tous les logs au serveur syslog de promtail
ruleset(name="remote"){
action(type="omfwd" Target="localhost" Port="1514"
Protocol="tcp" Template="RSYSLOG_SyslogProtocol23Format" TCP_Framing="octet-counted")
}
# Ecoute sur le port 514 for udp and tcp
module(load="imudp")
input(type="imudp" port="514" ruleset="remote")
module(load="imtcp")
input(type="imtcp" port="514" ruleset="remote")Configuration de promtail
Voici la configuration de promtail à ajouter dans /etc/promtail/promtail.yml
server:
http_listen_port: 9081
grpc_listen_port: 0
positions:
filename: /var/tmp/promtail-syslog-positions.yml
clients:
# URL to loki server.
- url: http://loki.innovalia.xyz/loki/api/v1/push
scrape_configs:
- job_name: syslog
syslog:
listen_address: 0.0.0.0:1514
listen_protocol: tcp
idle_timeout: 60s
label_structured_data: yes
labels:
job: "syslog"
relabel_configs:
- source_labels: [ '__syslog_message_hostname' ]
target_label: 'host'Configuration pour les instances Kubernetes
Il a fallu créé un daemonset pour que chaque nœud kubernetes ait une instance de promtail.
Voici la configuration du daemonset :
apiVersion: apps/v1
kind: Deployment
metadata:
name: promtail
namespace: monitoring
spec:
replicas: 3
selector:
matchLabels:
app: promtail
template:
metadata:
labels:
app: promtail
spec:
serviceAccount: promtail-serviceaccount
containers:
- name: promtail-container
image: grafana/promtail:2.9.2
args:
- -config.file=/etc/promtail/config.yml
env:
- name: 'HOSTNAME'
valueFrom:
fieldRef:
fieldPath: 'spec.nodeName'
volumeMounts:
- name: logs
mountPath: /var/log
- name: promtail-config
mountPath: /etc/promtail
- mountPath: /var/lib/docker/containers
name: varlibdockercontainers
readOnly: true
volumes:
- name: logs
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: promtail-config
configMap:
name: promtail-configPuis il a fallu faire une config map pour la configuration de promtail
apiVersion: v1
kind: ConfigMap
metadata:
name: promtail-conf
namespace: monitoring
data:
config.yml: |
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /var/log/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
target_config:
sync_period: 10s
scrape_configs:
## Kubernetes job
- job_name: pod-logs
kubernetes_sd_configs:
- role: pod
pipeline_stages:
- docker: {}
relabel_configs:
- source_labels:
- __meta_kubernetes_pod_node_name
target_label: __host__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- action: replace
replacement: $1
separator: /
source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_pod_name
target_label: job
- action: replace
source_labels:
- __meta_kubernetes_namespace
target_label: namespace
- action: replace
source_labels:
- __meta_kubernetes_pod_name
target_label: pod
- action: replace
source_labels:
- __meta_kubernetes_pod_container_name
target_label: container
- replacement: /var/log/pods/*$1/*.log
separator: /
source_labels:
- __meta_kubernetes_pod_uid
- __meta_kubernetes_pod_container_name
target_label: __path__
## Syslog install
- job_name: syslog
syslog:
listen_address: 0.0.0.0:1514
labels:
job: syslog
relabel_configs:
- source_labels: [__syslog_message_hostname]
target_label: host
- source_labels: [__syslog_message_hostname]
target_label: hostname
- source_labels: [__syslog_message_severity]
target_label: level
- source_labels: [__syslog_message_app_name]
target_label: application
- source_labels: [__syslog_message_facility]
target_label: facility
- source_labels: [__syslog_connection_hostname]
target_label: connection_hostnameEt créer un service account pour promtail puisse accéder aux logs des différentes instances kubernetes. Voici la configuration
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: promtail-clusterrole
rules:
- apiGroups: [ "" ]
resources:
- nodes
- services
- pods
verbs:
- get
- watch
- listConfiguration de l’envoi des logs sur les différentes machines
Machine linux
Pour les machines linux standard l’envoi de logs ce fait comme précédemment expliqué, avec seulement Promtail.
Machines Vyos
Pour les machines vyos, nous avons décidé d’utiliser syslog et il faut donc configurer syslog à envoyer les logs sur notre machine de forward de log.
Voici la configuration à suivre
set system syslog console facility all level all
set system syslog host <address> facility all level all
set system syslog host <address> facility all protocol <udp|tcp>
Machine XCP-NG
Sur les hyperviseur XCP-NG, pour réaliser l’envoie de logs il faut configurer l’ip du serveur dans le pool

Dans l’onglet “Advanced” puis le champ remote syslog host est à remplacer par notre machine de forward de log.
Machine truenas
Pour envoyer les logs sur Truenas. Il faut aller dans le menu “System” puis “Advanced” puis “Syslog” et remplir les champs avec l’ip de notre machine de forward de log.
