Aller au contenu principal

Centralisation de logs des serveurs avec Loki

· 3 minutes de lecture
Stéphane ROBERT

logo

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

loki promtail node server

On sélectionne devbox3 > Show Logs

loki promtail node server

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