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.

Il aurait été intéressant de mettre en place un système de stockage distribué pour les logs de loki. Car l’autre fonction principal de loki est de faire ingester des logs. Et de les stocker et archiver sur long terme. Mais cela est très complexe a mettre en place car il faut avoir un stockage distribué très performant. Et cela demande beaucoup de ressources. Et nous n’avons pas eu les ressources de réaliser cela.

Schema de fonctionnement des logs sous kubernetes

kubernetes log

Schéma de fonctionnement des logs sous rsyslog

classic syslog

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 rsyslog

Ensuite, 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-journald

Pour 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 promtail

Configuration 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-config

Puis 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_hostname

Et 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
      - list

Configuration 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

xcp-pool-syslog.png

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.

Truenas Log