Grup 4 - 7. Monitorització del sistema Proxmox. Notificació d’events (via email, SMS, IM, trucada telèfon, segons grau d’alarma).
Prometheus
Primero instalamos en los nodos los paquete que necesitamos para la exportación a Prometheus.
sudo apt install python3-venv
Creamos un entorno virtual de python3, con esta línea.
python3 -venv /opt/prometheus-pve-exporter
Ejecutamos esta línea para empezar la instalación de prometheus
/opt/prometheus-pve-exporter/bin/pip install prometheus-pve-exporter
Comprobamos con un help de que esta funcionando correctamente.
Ahora creamos la carpeta de Prometheus y con "cat" añadimos el pve.yml, con los datos de inicio de sesión del cluster.
mkdir -p /etc/prometheus cat <<EOF> /etc/promethes/pve.yml default: user: root@pam password: P@ssw0rd verify_ssl: false EOF
Por ultimo ejecutamos el prometheus-pve-exporter, para comprobar de que no nos da ningún fallo al conectarse.
Una vez vemos que funciona correctamente, creamos el servició, para habilitarlo en el arranque.
cat <<EOF> /etc/systemd/system/prometheus-pve-exporter.service [Unit] Description=Prometheus exporter for Proxmox VE Documentation=https://github.com/znerol/prometheus-pve-exporter [Service] Restart=always User=prometheus ExecStart=/usr/local/bin/pve_exporter /etc/prometheus/pve.yml [Install] WantedBy=multi-user.target EOF
Reiniciamos los servicio y comprobamos que arranca sin problema.
Por ultimo lo habilitamos para que cada vez que el servidor se encienda, arranque el pve-exporter.
systemctl enable prometheus-pve-exporter.service
Añadimos la iso de un Ubuntu en el almacenamiento local donde vamos a instalar el Prometheus.
Creamos la maquina en el CEPH-VMS, para la instalación.
Le ponemos un nombre y un ID al VM
En "Hard Disk" ponemos la pool del CEPH-VMS y en "Disk space" el espació de disco que queremos.
Arrancamos la maquina creada.
Al tener la iso del ubuntu en la maquina, arrancara directamente desde el disco.
Configuración del usuario y contraseña de la maquina Ubuntu.
Una vez arrancada la accedemos a la pagina de descarga de Prometheus oficial y descargamos el "*linux-amd64.tar.gz"
Descomprimimos el tar y creamos la carpeta para el Prometheus.
mkdir -p /etc/prometheus
Movemos todos los archivos descomprimimos a la raíz de "/etc/prometheus".
Realizamos una copia del "prometheus.yml".
Añadimos nuestra configuración.
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: - localhost:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: "prometheus" # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ["localhost:9090"] - job_name: 'pve' static_configs: - targets: - 192.168.88.6:9221 # Proxmox VE node with PVE exporter. - 192.168.88.7:9221 # Proxmox VE node with PVE exporter. metrics_path: /pve params: module: [default]
Realizamos un "nc" para comprobar que hay conexión con los nodos.
nc -v ip-nodo 9221
Cuando todo esta funcionando creamos el servició de prometheus.
nano /etc/systemd/system/prometheus.service [Unit] Description=Prometheus Wants=network-online.target After=network-online.target [Service] User=root Group=root Type=simple ExecStart=/etc/prometheus/prometheus --storage.tsdb.path=/etc/prometheus/data/ --web.external-url=http://localhost:9090 --config.file=/etc/prometheus/prometheus.yml [Install] WantedBy=multi-user.target
Iniciamos el servició y lo habilitamos como hicimos en los nodos y accedemos a la pagina web de Prometheus para comprobar de que esta funcionando.
Comprobamos en "Targets", que están los 2 nodos conectados.
Grafana
Accedemos a la pagina oficial de descarga de Grafana, y seleccionamos la versión OSS, que es la comunitaria y la gratuita.
Nos dará este comando, para descargar la versión desde terminal.
wget https://dl.grafana.com/oss/release/grafana-8.4.5.linux-amd64.tar.gz
Creamos la carpeta de Grafana y añadimos todos los archivos descargados.
mkdir -p /etc/grafana
Realizamos este comando para arrancar Grafana y comprobar de que funciona correctamente.
./etc/grafana/bin/grafana-server
Ahora creamos el servicio de Grafana, para habilitarlo y lo iniciamos.
nano /lib/systemd/system/grafana-server.service [Unit] Description=Grafana instance Documentation=http://docs.grafana.org Wants=network-online.target After=network-online.target After=postgresql.service mariadb.service mysqld.service [Service] EnvironmentFile=/etc/grafana/bin/grafana-server User=root Group=root Type=notify Restart=on-failure WorkingDirectory=/usr/share/grafana RuntimeDirectory=grafana RuntimeDirectoryMode=0750 ExecStart=/etc/grafana/bin/grafana-server \ --config=${CONF_FILE} \ --pidfile=${PID_FILE_DIR}/grafana-server.pid \ --packaging=rpm \ cfg:default.paths.logs=${LOG_DIR} \ cfg:default.paths.data=${DATA_DIR} \ cfg:default.paths.plugins=${PLUGINS_DIR} \ cfg:default.paths.provisioning=${PROVISIONING_CFG_DIR} LimitNOFILE=10000 TimeoutStopSec=20 CapabilityBoundingSet= DeviceAllow= LockPersonality=true MemoryDenyWriteExecute=false NoNewPrivileges=true PrivateDevices=true PrivateTmp=true ProtectClock=true ProtectControlGroups=true ProtectHome=true ProtectHostname=true ProtectKernelLogs=true ProtectKernelModules=true ProtectKernelTunables=true ProtectProc=invisible ProtectSystem=full RemoveIPC=true RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX RestrictNamespaces=true RestrictRealtime=true RestrictSUIDSGID=true SystemCallArchitectures=native UMask=0027 [Install] WantedBy=multi-user.target
Accedemos a la dirección de Grafana por ip:3000 y comprobamos si nos carga la pagina web de Grafana.
Login: Admin Password: Admin
Dentro de grafana nos vamos a la configuración de base de datos para añadir una nueva, dando ha "Add data source".
Seleccionamos la opción de Prometheus, que es la primera que nos sale.
Le ponemos un nombre, después en "URL", ponemos la dirección del Prometheus "http://localhost:9090" y no tocamos nada mas.
Bajamos y le damos al botón de "Save and Test" y comprobamos de que nos salga la notificación en verde.
Ahora buscamos la plantilla de Proxmox, que vamos a utilizar en la pagina de Dashboards de Grafana.
10347
Añadimos el template de la dashboord en el Grafana.
Comprobamos que recibimos los datos en los propios gráficos del Grafana y que todos funcionan correctamente.
Alertmanager (Prometheus)
Vamos a la pagina de prometheus, y buscamos el complemento de alertmanager y lo descargamos "*linux-amd64.tar.gz".
Creamos la carpeta para el Alertmanager y movemos todos los archivos descomprimidos del "tar.gz".
mkdir -p /etc/alertmanager
Realizamos una copia del "alertmanager.yml".
Creamos nuestro "alertmanager.yml" en "/etc/alertmanager".
global: resolve_timeout: 5m route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 24h receiver: 'email' receivers: - name: 'email' email_configs: - to: '[email protected], [email protected]' from: '[email protected]' smarthost: smtp.gmail.com:587 auth_username: '[email protected]' auth_identity: '[email protected]' auth_password: 'alertasieti123'
Creamos el servició del Alertmanager, para hacer lo mismo que con los otros 2, habilitarlo e iniciarlo.
nano /etc/systemd/system/alertmanager.yml [Unit] Description=Alertmanager Wants=network-online.target After=network-online.target [Service] User=root Group=root Type=simple ExecStart=/etc/alertmanager/alertmanager --storage.path=/etc/alertmanager/data/ --config.file=/etc/alertmanager/alertmanager.yml [Install] WantedBy=multi-user.target
Iniciamos el servicio del alertmanager.
Nos faltaría si no lo hemos hecho previamente acceder al "prometheus.yml" y añadir estas líneas si no las tenemos.
Accedemos a la pagina del alertmanager "http://ip:9093" y comprobamos si nos funciona.
Realizamos los "enable", para que se inicien los servicios, cada vez que la maquina de apague.
Ahora creamos las reglas para generar las alertas, dejo aquí las reglas que creamos.
#Alertas cpu nodos pve_cpu_usage_ratio{id="node/proyectovr5"} / pve_cpu_usage_limit {id="node/proyectovr5"} > 0.6 pve_cpu_usage_ratio{id="node/proyectovr6"} / pve_cpu_usage_limit {id="node/proyectovr6"} > 0.6 #Alerta RAM nodo pve_memory_usage_bytes{id="node/proyectovr5"} / pve_memory_size_bytes {id="node/proyectovr5"} > 0.9 pve_memory_usage_bytes{id="node/proyectovr6"} / pve_memory_size_bytes {id="node/proyectovr6"} > 0.9 #Alerta Almacenamiento pve_disk_usage_bytes {id="storage/proyectovr5/CEPH-VMS"} / pve_disk_size_bytes {id="storage/proyectovr5/CEPH-VMS"} > 0.5 pve_disk_usage_bytes {id="storage/proyectovr5/HDD"} / pve_disk_size_bytes {id="storage/proyectovr5/HDD"} > 0.5 pve_disk_usage_bytes {id="storage/proyectovr6/CEPH-VMS"} / pve_disk_size_bytes {id="storage/proyectovr6/CEPH-VMS"} > 0.5 pve_disk_usage_bytes {id="storage/proyectovr6/HDD"} / pve_disk_size_bytes {id="storage/proyectovr6/HDD"} > 0.5 #Alerta Nodo Caído pve_up {id="node/proyectovr5"} == 0 pve_up {id="node/proyectovr6"} == 0 #Alerta VM caidas pve_up {id="qemu/100"} == 0 pve_up {id="qemu/101"} == 0 pve_up {id="qemu/102"} == 0
Comprobación de las alertas en Alertmanager.
Comprobación de las alertas en Gmail.