Aller au contenu principal

Centralisation de logs des serveurs avec Loki

· 3 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Dans le billet précédent, je vous montrais comment remonter les logs de k3s dans prometheus avec loki. Comme pour la surveillance, j'aimerais aussi centraliser les logs des serveurs Linux où tournent mes applications sur des machines virtuelles avec libvirt.

Installation de promtail

Comme d'habitude j'ai pris la documentation du produit et j'ai écrit le playbook ansible en conséquence. J'ai géré le changement de version.

- hosts: libvirt
  gather_facts: yes
  become: true
  vars:
    promtail_version: 2.4.1
    loki_url:  https://loki.robert.local/loki/api/v1/push
  tasks:
    - name: Create group promtail
      ansible.builtin.group:
        name: promtail
        state: present
    - name: Create user promtail
      ansible.builtin.user:
        name: promtail
        groups:
          - promtail
          - systemd-journal
        state: present
    - name: Get actual promtail version
      command: /usr/local/bin/promtail-linux-amd64 --version
      register: actual_promtail_version
      ignore_errors: true
    - name: stop promtail service
      ansible.builtin.service:
        name: promtail
        state: stopped
      when: promtail_version not in actual_promtail_version.stdout
      ignore_errors: true
    - name: Install Promtail
      ansible.builtin.unarchive:
        src: "https://github.com/grafana/loki/releases/download/v{{ promtail_version }}/promtail-linux-amd64.zip"
        dest: /usr/local/bin/
        mode: 0755
        owner: root
        group: root
        remote_src: yes
      when: promtail_version not in actual_promtail_version.stdout
    - name: Create service
      ansible.builtin.copy:
        src: templates/promtail.service
        dest: /etc/systemd/system/
        owner: root
        group: root
        mode: 0644
    - name: Create Promtail config
      ansible.builtin.template:
        src: templates/promtail-config.yml.j2
        dest: /etc/promtail.yml
        owner: root
        group: root
        mode: 0644
    - name: set acl to /var/log
      ansible.posix.acl:
        path: /var/log
        recursive: true
        permissions: rX
        entity: promtail
        etype: user
        state: present
    - name: touch positions tmp file
      ansible.builtin.file:
        path: /tmp/positions.yaml
        owner: promtail
        group: promtail
        mode: 0600
    - name: Start promtail service
      ansible.builtin.service:
        name: promtail
        state: restarted
        enabled: true

Quelques explications :

  • la version à installer se trouve dans la variable promtail_version

  • l'adresse du serveur loki qui se trouve dans k3s est indiqué dans la variable loki_url. Il faudra créer un ingress comme pour prometheus :

    apiVersion: networking.k8s.io/v1
    
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: traefik
        traefik.ingress.kubernetes.io/frontend-entry-points: http,https
        traefik.ingress.kubernetes.io/redirect-entry-point: https
        traefik.ingress.kubernetes.io/redirect-permanent: "true"
      name: prometheus-ingress
      namespace: prometheus
    spec:
      rules:
    
    - host: loki.robert.local
        http:
          paths:
      - path: /
            pathType: Prefix
            backend:
              service:
                name: loki
                port:
                  number: 3100
      tls:
    - hosts:
      - loki.robert.local
        secretName: wildcard-tls-cert
    
  • On créé le user/group promatail

  • On récupère la version installée (ou pas)

  • Si on a une nouvelle version alors on l'installe :

    • stop du service
    • téléchargement de la version
  • On créé le service

  • On créé la configuration

  • On change les droits sur le fichier temporaire positions.yml (le service avec le user promtail)

  • On rédemarre le service

Vérification des logs dans Grafana

Maintenant que tout est en place, il suffit de vérifier que dans loki nous retrouvions bien la trace des node_name devbox2 et devbox3 (les labels défini dans la configuration de promtail).

Explorer > Loki > Log Browser > Node_Name

On sélectionne devbox3 > Show Logs

Voilà toutes les logs de mon home lab devops sont consultables via loki.

J'ai déposé le code sur le projet infra as code du home lab. Pour lancer le playbook :

ansible-playbook -i inventory/hosts playbooks/install-promtail.yml