Voici une solution pour superviser un serveur DELL via Prometheus, AlertManager et Grafana.

Pré-requis

  • Un Kubernetes
  • Un Prometheus
  • Un Alertmanager
  • Un Grafana
  • Dell OMSA avec le SNMP activé.

Sur votre poste de travail (ou ailleurs), au choix :

  • Golang >= 1.9
  • Docker pour utiliser l’image Docker fournie par Prometheus. J’ai plutôt utilisé directement Go.

Installer snmp-exporter

snmp-exporter va vous permettre de faire la passerelle entre votre OMSA qui devrait être accessible via SNMP et votre Prometheus. Pour commencer, il faut ajouter les OIDs DELL à snmp-exporter. Voici la procédure :

  • Installez sur votre machine snmp-exporter (il vous faudra peut-être la librairie libsnmp-dev) :
git clone https://github.com/prometheus/snmp_exporter.git
cd snmp_exporter/generator
go get -d
go build
  • Comme indiqué dans la documentation, il faut récupérer quelques mibs pour fonctionner avec les OIDs déjà déclarés dans le fichier generator.yml.
cd $HOME/.snmp/mibs
wget ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
tar xvf v2.tar.gz
mv auto/mibs/v2/* .
rm -fr auto
wget ftp://ftp.servertech.com/Pub/SNMP/sentry3/Sentry3.mib
wget http://dl.ubnt-ut.com/snmp/UBNT-UniFi-MIB
wget http://dl.ubnt-ut.com/snmp/UBNT-MIB
wget ftp://ftp.apc.com/apc/public/software/pnetmib/mib/421/powernet421.mib
wget https://global.download.synology.com/download/Document/MIBGuide/Synology_MIB_File.zip
unzip Synology_MIB_File.zip
wget https://www.arista.com/assets/data/docs/MIBS/ARISTA-SW-IP-FORWARDING-MIB.txt
wget https://www.paloaltonetworks.com/content/dam/pan/en_US/assets/zip/technical-documentation/snmp-mib-modules/PAN-MIB-MODULES-7.0.zip
unzip PAN-MIB-MODULES-7.0.zip
wget https://www.arista.com/assets/data/docs/MIBS/ARISTA-ENTITY-SENSOR-MIB.txt
wget https://www.arista.com/assets/data/docs/MIBS/ARISTA-SMI-MIB.txt
wget https://dl.ubnt.com/firmwares/airos-ubnt-mib/ubnt-mib.zip
unzip ubnt-mib.zip
rm *.zip *.tar.gz
wget http://www.circitor.fr/Mibs/Html/D/DELL-RAC-MIB.php
wget http://www.circitor.fr/Mibs/Mib/D/DELL-SHADOW-MIB.mib
  • Dans les MIBs DELL, on retrouve souvent du type DellString qui est traduit par le générateur de snmp-exporter comme du OctetString. Pour que cette supervision fonctionne, il faut passer par du DisplayString. Deux méthodes pour y arriver :
    • patcher le générateur. J’avais commencé comme ça, mais avec la récente mise à jour le patch ne fonctionne plus.
    • remplacer les DellString par du DisplayString. Ce n’est peut-être pas le mieux, mais pour le besoin, ça ira !
sed -i 's/DellString/DisplayString/g' 10892.mib
sed -i 's/DellString/DisplayString/g' DELL-RAC-MIB.txt
  • On rajoute les OIDs DELL qui nous intéressent dans le fichier generator.yml :
  dell:
    walk:
      - 1.3.6.1.4.1.674.10892 # dell server3
      - 1.3.6.1.4.1.674.10893 # dell storage
  • On peut maintenant générer le snmp.yml :
 ./generator generate
INFO[0000] Loading MIBs from $HOME/.snmp/mibs:/usr/share/snmp/mibs  source="net_snmp.go:122"
[...]
INFO[0004] Config written to snmp_exporter/generator/snmp.yml  source="main.go:71"
  • Récupérez ce snmp.yml, il faudra le passer en paramètre de snmp-exporter. Plusieurs façons de le faire (stocker ce fichier sur un volume Kubernetes, recréer l’image docker snmp-exporter en y incluant votre version du fichier snmp.yml…). Je pensais le stocker dans un ConfigMap, mais la taille du ConfigMap est limitée et le fichier snmp.yml trop gros !

J’ai fait le choix de partir sur un InitContainer qui récupère mon fichier snmp.yml sur un serveur web interne pour le stocker dans un volume de type EmptyDir. Mon pod qui partage donc ce volume peut ensuite y accéder. En cas de mise à jour du fichier snmp.yml, un simple delete du pod et votre nouveau fichier sera récupéré.

Deployment k8s

Voilà le deployment que j’ai utilisé pour snmp-exporter :

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: snmp-exporter
  name: snmp-exporter
  namespace: prometheus
spec:
  selector:
    matchLabels:
      app: snmp-exporter
  template:
    metadata:
      labels:
        app: snmp-exporter
    spec:
      initContainers:
      - image: debian:stable-slim
        name: get-snmp-conf
        command:
            - /bin/bash
            - -c
            - |
              apt-get update
              apt-get install --no-install-recommends -y wget
              cd /etc/snmp_exporter
              wget http://votre_serveur/snmp.yml
        volumeMounts:
        - mountPath: /etc/snmp_exporter
          name: snmp-mibs
      containers:
      - image: prom/snmp-exporter:v0.10.0
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /metrics
            port: 9116
            scheme: HTTP
          initialDelaySeconds: 60
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 10
        name: snmp-exporter
        ports:
        - containerPort: 9116
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /metrics
            port: 9116
            scheme: HTTP
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 10
        resources:
          limits:
            cpu: 500m
            memory: 128Mi
          requests:
            cpu: 500m
            memory: 128Mi
        volumeMounts:
        - mountPath: /etc/snmp_exporter
          name: snmp-mibs
      volumes:
      - name: snmp-mibs
        emptyDir: {}

Service k8s

Pour chaque serveur DELL à superviser, il vous suffira de créer un service Kubernetes comme cet exemple pour que Prometheus scrape les métriques fournies par snmp-exporter.

apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/module: dell
    prometheus.io/path: /snmp
    prometheus.io/scheme: http
    prometheus.io/scrape: "true"
    prometheus.io/target: 1.2.3.4
  name: mon_serveur
spec:
  ports:
  - port: 9116
    protocol: TCP
    targetPort: 9116
  selector:
    app: snmp-exporter
  clusterIP: None

Configuration Prometheus

Dans la configuration de votre Prometheus, il faudra rajouter la configuration suivante à la suite des relabel_configs du kubernetes-service-endpoints afin de pouvoir exploiter l’annotation module du service Kubernetes :

  - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_module]
    separator: ;
    regex: (.*)
    target_label: __param_module
    replacement: $1
    action: replace

Rechargez la configuration de Prometheus (ou laissez faire votre configmap-reloader).

Vous devriez voir apparaître votre serveur DELL :

service_dell.png

TODO : je n’ai pas encore créé mon alerting via AlertManager !

Grafana

Voilà une première version de mon dashboard DELL.

Status DELL.png

RAID + hard.png

Le dashboard est disponible ici.