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 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 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 :
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.