Prometheus Operator

L'opérateur Prometheus pour Kubernetes fournit des définitions de surveillance faciles pour les services Kubernetes ainsi que le déploiement et la gestion d'instances Prometheus.

Nous allons utiliser l’opérateur Prometheus pour:

  • Effectuer l'installation et la configuration initiales de la stack complète de Kubernetes-Prometheus Serveurs :

Prometheus

Gestionnaire d'alertes Grafana

Hôte_noeud_exporter

kube-state-metrics

  • Définir la configuration automatique du point de terminaison de la métrique à l'aide des entités
  • ServiceMonitor Personnalisez et mettez à l'échelle les services à l'aide des CRD de l'opérateur et des ConfigMaps, ce qui rend notre configuration entièrement portable et déclarative.

L'opérateur agit sur les définitions de ressources personnalisées (CRD) suivantes:

  • Prometheus, qui définit le déploiement souhaité de Prometheus.
  • L'opérateur s'assure à tout moment qu'un déploiement correspondant à la définition de ressource est en cours d'exécution.
  • ServiceMonitor, qui spécifie de manière déclarative comment les groupes de services doivent être surveillés.
  • L’opérateur génère automatiquement la configuration de scrap de Prometheus en fonction de la définition.
  • PrometheusRule, qui définit un fichier de règles Prometheus souhaité, pouvant être chargé par une instance de Prometheus contenant des règles d’alerte et d’enregistrement Prometheus.
  • Alertmanager, qui définit un déploiement Alertmanager souhaité.
  • L'opérateur s'assure à tout moment qu'un déploiement correspondant à la définition de ressource est en cours d'exécution.

Le répertoire kube-prometheus dans le repository Operator contient les services et les configurations par défaut. Vous obtenez ainsi non seulement l'opérateur Prometheus, mais également une configuration complète que vous pouvez commencer à utiliser et à personnaliser dès le début.

Pour ce faire on commence par cloner le repository sur notre poste de développement :

git clone https://github.com/coreos/prometheus-operator.git
git clone https://github.com/mateobur/prometheus-monitoring-guide.git

Et voici le schéma d'infrastructure cible :

On commence par chercher le contact correspondant à notre compte Gke en utilisation sur notre terminal :

MBP-de-admin:~ admin$ gcloud info | grep Account
Account: [gsagnard2006@gmail.com]

Puis on va appliquer un Rbac à notre cluster via le compte Gcloud que nous utilisons sur ce cluster :

MBP-de-admin:~ admin$ kubectl create clusterrolebinding myname-cluster-admin-binding --clusterrole=cluster-admin --user=gsagnard2006@gmail.com
clusterrolebinding.rbac.authorization.k8s.io "myname-cluster-admin-binding" created

MBP-de-admin:~ admin$ kubectl create -f prometheus-operator/contrib/kube-prometheus/manifests/
clusterrole.rbac.authorization.k8s.io "prometheus-operator" created
servicemonitor.monitoring.coreos.com "prometheus-operator" created
alertmanager.monitoring.coreos.com "main" created
servicemonitor.monitoring.coreos.com "alertmanager" created
servicemonitor.monitoring.coreos.com "grafana" created
clusterrole.rbac.authorization.k8s.io "kube-state-metrics" created
role.rbac.authorization.k8s.io "kube-state-metrics" created
servicemonitor.monitoring.coreos.com "kube-state-metrics" created
clusterrole.rbac.authorization.k8s.io "node-exporter" created
servicemonitor.monitoring.coreos.com "node-exporter" created
clusterrole.rbac.authorization.k8s.io "prometheus-adapter" created
clusterrole.rbac.authorization.k8s.io "resource-metrics-server-resources" created
clusterrole.rbac.authorization.k8s.io "prometheus-k8s" created
prometheus.monitoring.coreos.com "k8s" created
role.rbac.authorization.k8s.io "prometheus-k8s-config" created
role.rbac.authorization.k8s.io "prometheus-k8s" created
role.rbac.authorization.k8s.io "prometheus-k8s" created
role.rbac.authorization.k8s.io "prometheus-k8s" created
prometheusrule.monitoring.coreos.com "prometheus-k8s-rules" created
servicemonitor.monitoring.coreos.com "prometheus" created
servicemonitor.monitoring.coreos.com "kube-apiserver" created
servicemonitor.monitoring.coreos.com "coredns" created
servicemonitor.monitoring.coreos.com "kube-controller-manager" created
servicemonitor.monitoring.coreos.com "kube-scheduler" created
servicemonitor.monitoring.coreos.com "kubelet" created

C'est alors qu'en utilisant cette commande pour vérifier l'état de tous les pods déployés :

MBP-de-admin:~ admin$ kubectl get pods -n monitoring
NAME                                   READY     STATUS    RESTARTS   AGE
alertmanager-main-0                    2/2       Running   0          6m
alertmanager-main-1                    0/2       Pending   0          6m
grafana-7489c49998-nfcgv               1/1       Running   0          10m
kube-state-metrics-54d68d977c-xh8gj    4/4       Running   0          7m
node-exporter-25plk                    2/2       Running   0          10m
node-exporter-lblrr                    2/2       Running   0          10m
prometheus-adapter-84cd9c96c9-ghzvt    1/1       Running   0          10m
prometheus-k8s-0                       3/3       Running   1          6m
prometheus-k8s-1                       0/3       Pending   0          6m
prometheus-operator-7b74946bd6-4g8zb   1/1       Running   5          10m

Je me suis rendu compte que certains pods ne s'installaient pas et restaient a l'état de pending. Il ne faut surtout pas oublier de créer les RBAC (cf. commande ci-dessus).

Une fois que tous les pods sont en état "running", relevez le numéro du pod Grafana et utilisez la commande suivante depuis le terminal :

kubectl port-forward grafana-5568b65944-nwbct -n monitoring 3000:3000

Cela vous permettra d'ouvrir une instance web Grafana depuis localhost, soit votre poste de développement sur le port 3000, vous devriez alors trouver cette page en vous connectant avec vos identifiants par défaut (pour rappel admin et admin).

http://localhost:3000

Changer le mot de passe par défaut

Puis vous y trouverez des dashboards par défaut mais vous êtes libres d'y ajouter ceux que vous souhaitez, bien évidemment.

Et voilà tout un beau assemblage de dashboards pour votre cluster.

Pour rappel les dashboards existants sont ici.

Interaction avec l'opérateur Prometheus via des objets CRD

Pour modifier ce déploiement de stack Prometheus, au lieu de modifier chaque composant Deployment ou StatefulSet comme vous le souhaitez dans Kubernetes, vous allez personnaliser directement les définitions et laisser l’opérateur gérer l’orchestration pour vous.

Commençons par un exemple simple: disons que 3 modules Alertmanager sont trop nombreux pour ce scénario et que nous en voulons juste un.  Dans un premier temps, nous allons explorer le CRD alertmanager:

MBP-de-admin:~ admin$ kubectl get alertmanager main -n monitoring -o yaml
apiVersion: monitoring.coreos.com/v1
kind: Alertmanager
metadata:
  creationTimestamp: 2019-02-22T08:11:58Z
  generation: 1
  labels:
    alertmanager: main
  name: main
  namespace: monitoring
  resourceVersion: "1323919"
  selfLink: /apis/monitoring.coreos.com/v1/namespaces/monitoring/alertmanagers/main
  uid: 86863319-3679-11e9-80a2-42010a8400cf
spec:
  baseImage: quay.io/prometheus/alertmanager
  nodeSelector:
    beta.kubernetes.io/os: linux
  replicas: 3
  securityContext:
    fsGroup: 2000
    runAsNonRoot: true
    runAsUser: 1000
  serviceAccountName: alertmanager-main
  version: v0.16.0

À partir de là, vous pouvez modifier les étiquettes de pod, serviceAccount, nodeSelector et ce que nous recherchions: le nombre de réplicas.

Modifiez le paramètre réplicas en «1», en corrigeant l’objet API (vous pouvez trouver la version corrigée dans le repository prometheus-monitoring-guide):

MBP-de-admin:~ admin$ kubectl create -f prometheus-monitoring-guide/operator/alertmanager.yaml --dry-run -o yaml | kubectl apply -f -
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
alertmanager.monitoring.coreos.com "main" configured

Si vous répertoriez à nouveau les pods dans le namespace monitoring, vous ne verrez qu'un pod d'Alertmanager et l'événement resize dans les logs de l'opérateur Prometheus lui-même:

MBP-de-admin:~ admin$ kubectl logs prometheus-operator-7b74946bd6-4g8zb -n monitoring | tail -n 1
level=info ts=2019-02-27T13:12:42.51534361Z caller=operator.go:970 component=prometheusoperator msg="sync prometheus" key=monitoring/k8s

Prometheus Operator autoconfiguration

La prochaine étape consiste à utiliser cette configuration pour surveiller tous les autres services déployés dans votre cluster.  Deux ressources personnalisées sont impliquées dans ce processus:

Le CRD Prometheus :

  • Définit les métadonnées du pod du serveur Prometheus
  • Définit le nombre de répliques de serveur Prometheus
  • Définit le point final Alertmanager (s) pour l'envoi des règles d'alerte déclenchée
  • Définit les étiquettes et les filtres de namespace pour les CRD ServiceMonitor qui seront appliqués par ce déploiement de serveur Prometheus
  • Les objets ServiceMonitor fourniront la configuration de point de terminaison cible dynamique

Le CRD ServiceMonitor

  • Filtre les points de terminaison par noms, libellés, etc.
  • Définit les différents ports de scraping
  • Définit tous les paramètres de scraping supplémentaires tels que l'intervalle de raclage, le protocole à utiliser, les informations d'identification TLS, les stratégies de scraping etc.

L'objet Prometheus filtre et sélectionne N objets ServiceMonitor qui, à leur tour, filtrent et sélectionnent N points de terminaison métriques Prometheus.  Si un nouveau point de terminaison de métriques correspond aux critères ServiceMonitor, cette cible est automatiquement ajoutée à tous les serveurs Prometheus qui sélectionnent ce ServiceMonitor.

Comme vous pouvez le constater dans le diagramme ci-dessus, ServiceMonitor cible les services Kubernetes et non les points d'extrémité directement exposés par le ou les pod (s).  Nous disposons déjà d'un déploiement Prometheus surveillant toutes les métriques internes de Kubernetes (kube-state-metrics, node-exporter, API Kubernetes, etc.), mais nous avons maintenant besoin d'un déploiement séparé pour prendre en charge toute autre application s'exécutant au-dessus du cluster.

Pour effectuer ce nouveau déploiement, examinons d’abord ce CRD Prometheus avant de l’appliquer au cluster (vous pouvez trouver ce fichier dans le repository comme indiqué ci-dessous):

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  labels:
    app: prometheus
    prometheus: service-prometheus
  name: service-prometheus
  namespace: monitoring
spec:
  alerting:
    alertmanagers:
    - name: alertmanager-main
      namespace: monitoring
      port: web
  baseImage: quay.io/prometheus/prometheus
  logLevel: info
  paused: false
  replicas: 2
  retention: 2d
  routePrefix: /
  ruleSelector:
    matchLabels:
      prometheus: service-prometheus
      role: alert-rules
  serviceAccountName: prometheus-k8s
  serviceMonitorSelector:
    matchExpressions:
    - key: serviceapp
      operator: Exists

Par souci de brièveté, nous allons réutiliser les configurations alertmanager et serviceAccount trouvées dans l'autre déploiement.  Dans ce fichier de configuration du serveur Prometheus, nous pouvons trouver:

  • Le nombre de réplicas Prometheus utilisant cette configuration (2) RuleSelector qui configurera de manière dynamique les règles d'alerte
  • Le déploiement d’Alertmanager (qui peut comporter plus d’un pod pour la redondance) qui recevra les alertes déclenchées
  • ServiceMonitorSelector, c’est-à-dire le filtre qui décidera si un serviceMonitor donné sera utilisé pour configurer ce serveur Prometheus.

Pour cet exemple, nous avons décidé qu'un serviceMonitor serait associé à ce déploiement de Prometheus s'il contenait le libellé serviceapp dans ses métadonnées. Une fois adaptés à nos besoins, nous pouvons appliquer la nouvelle configuration directement à partir du repository.

kubectl create -f prometheus-monitoring-guide/operator/service-prometheus.yaml

Ici, l’opérateur Prometheus remarquera le nouvel objet API et créera le déploiement souhaité pour vous:

prometheus-service-prometheus-0        3/3       Running   1          9m
prometheus-service-prometheus-1        3/3       Running   1          9m

Et voilà pour aujourd'hui.