Monitoring DELL avec Prometheus
-
Voici une solution pour superviser un serveur DELL via Prometheus/AlertManager/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 duOctetString
. Pour que cette supervision fonctionne, il faut passer par duDisplayString
. 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 duDisplayString
. 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 fichiersnmp.yml
…). Je pensais le stocker dans unConfigMap
, mais la taille duConfigMap
est limitée et le fichiersnmp.yml
trop gros !
J’ai fait le choix de partir sur un
InitContainer
qui récupère mon fichiersnmp.yml
sur un serveur web interne pour le stocker dans un volume de typeEmptyDir
. Monpod
qui partage donc ce volume peut ensuite y accéder. En cas de mise à jour du fichiersnmp.yml
, un simpledelete
dupod
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
dukubernetes-service-endpoints
afin de pouvoir exploiter l’annotationmodule
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 :
TODO : je n’ai pas encore créé mon alerting via AlertManager !
Grafana
Voilà une première version de mon dashboard DELL.
Le dashboard est disponible ici.