Comment configurer la surveillance de cluster DigitalOcean Kubernetes avec Helm et l’opérateur Prometheus

introduction

Outre le traçage et la journalisation, la surveillance et l’alerte sont des composants essentiels de la pile d’observabilité de Kubernetes. La configuration de la surveillance de votre cluster Kubernetes vous permet de suivre l'utilisation de vos ressources et d'analyser et de déboguer les erreurs des applications.

Un système de surveillance consiste généralement en une base de données chronologique contenant des données métriques et une couche de visualisation. En outre, une couche d'alerte crée et gère les alertes, en les transférant aux intégrations et aux services externes selon les besoins. Enfin, un ou plusieurs composants génèrent ou exposent les données de métrique qui seront stockées, visualisées et traitées pour les alertes par cette pile de surveillance.

Une solution de surveillance populaire est la pile open-sourcePrometheus,Grafana etAlertmanager:

  • Prometheus est une base de données chronologique et un outil de surveillance qui fonctionne en interrogeant les points de terminaison de métriques et en récupérant et en traitant les données exposées par ces points de terminaison. Il vous permet d'interroger ces données à l'aide dePromQL, un langage d'interrogation de données de séries chronologiques.

  • Grafana est un outil de visualisation et d'analyse de données qui vous permet de créer des tableaux de bord et des graphiques pour vos données de métriques.

  • Alertmanager, généralement déployé aux côtés de Prometheus, forme la couche d'alerte de la pile, gérant les alertes générées par Prometheus et les dédupliquant, les regroupant et les acheminant vers des intégrations comme les e-mails ouPagerDuty.

En outre, des outils tels quekube-state-metrics etnode_exporter exposent des métriques d'objets Kubernetes au niveau du cluster ainsi que des métriques au niveau de la machine telles que l'utilisation du processeur et de la mémoire.

Implémenter cette pile de surveillance sur un cluster Kubernetes peut être compliqué, mais heureusement, une partie de cette complexité peut être gérée avec le gestionnaire de packagesHelm et les projetsPrometheus Operator etkube-prometheus de CoreOS. Ces projets cuisent dans des configurations standard et des tableaux de bord pour Prometheus et Grafana et font abstraction de certaines définitions d’objets de Kubernetes de niveau inférieur. Helmprometheus-operator chart vous permet de mettre en place une solution complète de surveillance de cluster en installant Prometheus Operator et le reste des composants répertoriés ci-dessus, ainsi qu'un ensemble par défaut de tableaux de bord, de règles et d'alertes utiles pour surveiller les clusters Kubernetes.

Dans ce didacticiel, nous montrerons comment installer le graphique Helmprometheus-operator sur un cluster DigitalOcean Kubernetes. À la fin du didacticiel, vous aurez installé une pile de surveillance complète dans votre cluster.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

[[step-1 -—- creation-a-custom-values-file]] == Étape 1 - Création d'un fichier de valeurs personnalisées

Avant d'installer le graphique Helm deprometheus-operator, nous allons créer un fichier de valeurs personnalisées qui remplacera certaines des valeurs par défaut du graphique par des paramètres de configuration spécifiques à DigitalOcean. Pour en savoir plus sur le remplacement des valeurs de graphique par défaut, consultez la sectionHelm Install de la documentation Helm.

Pour commencer, créez et ouvrez un fichier appelécustom-values.yaml sur votre machine locale en utilisantnano ou votre éditeur préféré:

nano custom-values.yaml

Copiez et collez les valeurs personnalisées suivantes, qui activent le stockage persistant pour les composants Prometheus, Grafana et Alertmananger, et désactivent la surveillance des composants du plan de contrôle Kubernetes non exposés sur DigitalOcean Kubernetes:

custom-values.yaml

# Define persistent storage for Prometheus (PVC)
prometheus:
  prometheusSpec:
    storageSpec:
      volumeClaimTemplate:
        spec:
          accessModes: ["ReadWriteOnce"]
          storageClassName: do-block-storage
          resources:
            requests:
              storage: 5Gi

# Define persistent storage for Grafana (PVC)
grafana:
  # Set password for Grafana admin user
  adminPassword: your_admin_password
  persistence:
    enabled: true
    storageClassName: do-block-storage
    accessModes: ["ReadWriteOnce"]
    size: 5Gi

# Define persistent storage for Alertmanager (PVC)
alertmanager:
  alertmanagerSpec:
    storage:
      volumeClaimTemplate:
        spec:
          accessModes: ["ReadWriteOnce"]
          storageClassName: do-block-storage
          resources:
            requests:
              storage: 5Gi

# Change default node-exporter port
prometheus-node-exporter:
  service:
    port: 30206
    targetPort: 30206

# Disable Etcd metrics
kubeEtcd:
  enabled: false

# Disable Controller metrics
kubeControllerManager:
  enabled: false

# Disable Scheduler metrics
kubeScheduler:
  enabled: false

Dans ce fichier, nous remplaçons certaines des valeurs par défaut fournies avec le graphique dans sesvalues.yaml file.

Nous activons tout d'abord le stockage persistant pour Prometheus, Grafana et Alertmanager afin que leurs données persistent lors des redémarrages de pod. En arrière-plan, cela définit une revendication de volume persistant (PVC)5 Gi pour chaque composant, en utilisant la classe de stockage DigitalOceanBlock Storage. Vous devez modifier la taille de ces PVC en fonction de vos besoins en stockage de surveillance. Pour en savoir plus sur les PVC, consultezPersistent Volumes de la documentation officielle de Kubernetes.

Ensuite, remplacezyour_admin_password par un mot de passe sécurisé que vous utiliserez pour vous connecter au tableau de bord des métriques deGrafana avec l'utilisateuradmin.

Nous allons ensuite configurer un port différent pournode-exporter. Node-exporter s'exécute sur chaque nœud Kubernetes et fournit des métriques de système d'exploitation et de matériel à Prometheus. Nous devons modifier son port par défaut pour contourner les paramètres par défaut du pare-feu DigitalOcean Kubernetes, qui bloquera le port 9100 tout en autorisant les ports situés dans la plage 30000 à 32767. Vous pouvez également configurer une règle de pare-feu personnalisée pour un exportateur de noeud. Pour savoir comment procéder, consultezHow to Configure Firewall Rules de la documentation officielle sur les pare-feu Cloud DigitalOcean.

Enfin, nous désactiverons la collecte de métriques pour trois Kubernetescontrol plane components qui n'exposent pas de métriques sur DigitalOcean Kubernetes: le Kubernetes Scheduler et Controller Manager, et le magasin de données de cluster etcd.

Pour voir la liste complète des paramètres configurables pour le graphiqueprometheus-operator, consultez la sectionConfiguration du fichier README du référentiel de graphiques ou du fichier de valeurs par défaut.

Lorsque vous avez terminé, enregistrez et fermez le fichier. Nous pouvons maintenant installer la carte en utilisant Helm.

[[step-2 -—- installation-the-prometheus-operator-chart]] == Étape 2 - Installation du graphiqueprometheus-operator

Le graphique Helmprometheus-operator installera les composants de surveillance suivants dans votre cluster DigitalOcean Kubernetes:

  • Prometheus Operator, un KubernetesOperator qui vous permet de configurer et de gérer les clusters Prometheus. Les opérateurs Kubernetes intègrent une logique spécifique à un domaine dans le processus de création, de déploiement et de gestion des applications avec Kubernetes. Pour en savoir plus sur les opérateurs Kubernetes, consultez lesCoreOS Operators Overview. Pour en savoir plus sur l'opérateur Prometheus, consultezthis introductory post sur l'opérateur Prometheus et l'opérateur PrometheusGitHub repo. Prometheus Operator sera installé en tant queDeployment.

  • Prometheus, installé en tant queStatefulSet.

  • Alertmanager, un service qui gère les alertes envoyées par le serveur Prometheus et les achemine vers des intégrations telles que PagerDuty ou par courrier électronique. Pour en savoir plus sur Alertmanager, consultezAlerting de la documentation Prometheus. Alertmanager sera installé en tant que StatefulSet.

  • Grafana, un outil de visualisation de données chronologiques qui vous permet de visualiser et de créer des tableaux de bord pour vos métriques Prometheus. Grafana sera installé en tant que déploiement.

  • node-export, exportateur Prometheus qui s'exécute sur des nœuds de cluster et fournit des métriques de système d'exploitation et de matériel à Prometheus. Consultez lesnode-exporter GitHub repo pour en savoir plus. node-exporter sera installé en tant queDaemonSet.

  • kube-state-metrics, agent complémentaire qui écoute le serveur d'API Kubernetes et génère des métriques sur l'état des objets Kubernetes tels que Deployments et Pods. Vous pouvez en savoir plus en consultant leskube-state-metrics GitHub repo. kube-state-metrics sera installé en tant que déploiement.

Par défaut, avec les métriques de récupération générées par le noeud exportateur, les métriques de l'état du kube et les autres composants répertoriés ci-dessus, Prometheus sera configuré pour extraire des métriques des composants suivants:

  • kube-apiserver, lesKubernetes API server.

  • CoreDNS, le serveur DNS du cluster Kubernetes.

  • kubelet, l'agent de nœud principal qui interagit avec kube-apiserver pour gérer les pods et les conteneurs sur un nœud.

  • cAdvisor, un agent de noeud qui découvre les conteneurs en cours d'exécution et collecte leurs métriques d'utilisation du processeur, de la mémoire, du système de fichiers et du réseau.

Sur votre ordinateur local, commençons par installer le graphique Helmprometheus-operator et en passant le fichier de valeurs personnalisées que nous avons créé ci-dessus:

helm install --namespace monitoring --name doks-cluster-monitoring -f custom-values.yaml stable/prometheus-operator

Ici, nous exécutonshelm install et installons tous les composants dans l'espace de nomsmonitoring, que nous créons en même temps. Cela nous permet de séparer proprement la pile de surveillance du reste du cluster Kubernetes. Nous nommons la version Helmdoks-cluster-monitoring et transmettons le fichier de valeurs personnalisées que nous avons créé dansStep 1. Enfin, nous précisons que nous souhaitons installer le graphiqueprometheus-operator depuis Helmstabledirectory.

Vous devriez voir la sortie suivante:

OutputNAME:   doks-cluster-monitoring
LAST DEPLOYED: Mon Apr 22 10:30:42 2019
NAMESPACE: monitoring
STATUS: DEPLOYED

RESOURCES:
==> v1/PersistentVolumeClaim
NAME                             STATUS   VOLUME            CAPACITY  ACCESS MODES  STORAGECLASS  AGE
doks-cluster-monitoring-grafana  Pending  do-block-storage  10s

==> v1/ServiceAccount
NAME                                              SECRETS  AGE
doks-cluster-monitoring-grafana                   1        10s
doks-cluster-monitoring-kube-state-metrics        1        10s

. . .

==> v1beta1/ClusterRoleBinding
NAME                                                  AGE
doks-cluster-monitoring-kube-state-metrics            9s
psp-doks-cluster-monitoring-prometheus-node-exporter  9s


NOTES:
The Prometheus Operator has been installed. Check its status by running:
  kubectl --namespace monitoring get pods -l "release=doks-cluster-monitoring"

Visit https://github.com/coreos/prometheus-operator for instructions on how
to create & configure Alertmanager and Prometheus instances using the Operator.

Cela indique que l'opérateur Prometheus, Prometheus, Grafana et les autres composants répertoriés ci-dessus ont été installés avec succès dans votre cluster DigitalOcean Kubernetes.

À la suite de la remarque dans la sortiehelm install, vérifiez l'état des pods de la version à l'aide dekubectl get pods:

kubectl --namespace monitoring get pods -l "release=doks-cluster-monitoring"

Vous devriez voir ce qui suit:

OutputNAME                                                         READY   STATUS    RESTARTS   AGE
doks-cluster-monitoring-grafana-9d7f984c5-hxnw6              2/2     Running   0          3m36s
doks-cluster-monitoring-kube-state-metrics-dd8557f6b-9rl7j   1/1     Running   0          3m36s
doks-cluster-monitoring-pr-operator-9c5b76d78-9kj85          1/1     Running   0          3m36s
doks-cluster-monitoring-prometheus-node-exporter-2qvxw       1/1     Running   0          3m36s
doks-cluster-monitoring-prometheus-node-exporter-7brwv       1/1     Running   0          3m36s
doks-cluster-monitoring-prometheus-node-exporter-jhdgz       1/1     Running   0          3m36s

Cela indique que tous les composants de surveillance sont opérationnels et que vous pouvez commencer à explorer les métriques Prometheus à l'aide de Grafana et de ses tableaux de bord préconfigurés.

[[step-3 -—- access-grafana-and-explore-metrics-data]] == Étape 3 - Accéder à Grafana et explorer les données de métriques

Le graphique Helmprometheus-operator expose Grafana en tant que serviceClusterIP, ce qui signifie qu'il n'est accessible que via une adresse IP interne au cluster. Pour accéder à Grafana en dehors de votre cluster Kubernetes, vous pouvez soit utiliserkubectl patch pour mettre à jour le service en place vers un type public commeNodePort ouLoadBalancer, oukubectl port-forward pour transférer un port local vers un port Grafana Pod.

Dans ce didacticiel, nous transférerons les ports, mais pour en savoir plus sur les types de servicekubectl patch et Kubernetes, vous pouvez consulterUpdate API Objects in Place Using kubectl patch etServices à partir de la documentation officielle de Kubernetes.

Commencez par lister les services en cours d'exécution dans l'espace de nomsmonitoring:

kubectl get svc -n monitoring

Vous devriez voir les services suivants:

OutputNAME                                               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
alertmanager-operated                              ClusterIP   None                     9093/TCP,6783/TCP   34m
doks-cluster-monitoring-grafana                    ClusterIP   10.245.105.130           80/TCP              34m
doks-cluster-monitoring-kube-state-metrics         ClusterIP   10.245.140.151           8080/TCP            34m
doks-cluster-monitoring-pr-alertmanager            ClusterIP   10.245.197.254           9093/TCP            34m
doks-cluster-monitoring-pr-operator                ClusterIP   10.245.14.163            8080/TCP            34m
doks-cluster-monitoring-pr-prometheus              ClusterIP   10.245.201.173           9090/TCP            34m
doks-cluster-monitoring-prometheus-node-exporter   ClusterIP   10.245.72.218            30206/TCP           34m
prometheus-operated                                ClusterIP   None                     9090/TCP            34m

Nous allons rediriger le port local8000 vers le port80 du servicedoks-cluster-monitoring-grafana, qui à son tour redirigera vers le port3000 d'un Grafana Pod en cours d'exécution. Ces ports de service et de pod sont configurés dans le graphique Helmstable/grafanavalues file:

kubectl port-forward -n monitoring svc/doks-cluster-monitoring-grafana 8000:80

Vous devriez voir la sortie suivante:

OutputForwarding from 127.0.0.1:8000 -> 3000
Forwarding from [::1]:8000 -> 3000

Cela indique que le port local8000 est transféré avec succès vers un pod Grafana.

Visitezhttp://localhost:8000 dans votre navigateur Web. Vous devriez voir la page de connexion Grafana suivante:

Grafana Login Page

Entrezadmin comme nom d'utilisateur et le mot de passe que vous avez configuré danscustom-values.yaml. Ensuite, appuyez surLog In.

Vous serez redirigé vers lesHome Dashboard suivants:

Grafana Home Page

Dans la barre de navigation de gauche, sélectionnez le boutonDashboards, puis cliquez surManage:

Grafana Dashboard Tab

Vous serez redirigé vers l'interface de gestion de tableau de bord suivante, qui répertorie les tableaux de bord installés par le graphique Helm deprometheus-operator:

Grafana Dashboard List

Ces tableaux de bord sont générés parkubernetes-mixin, un projet open-source qui vous permet de créer un ensemble standardisé de tableaux de bord Grafana de surveillance de cluster et d'alertes Prometheus. Pour en savoir plus, consultez lesKubernetes Mixin GitHub repo.

Cliquez sur le tableau de bordKubernetes / Nodes, qui visualise l'utilisation du processeur, de la mémoire, du disque et du réseau pour un nœud donné:

Grafana Nodes Dashboard

Décrire chaque tableau de bord et son utilisation pour visualiser les données de métriques de votre cluster dépasse le cadre de ce didacticiel. Pour en savoir plus sur la méthode USE permettant d’analyser les performances d’un système, vous pouvez consulter la pageThe Utilization Saturation and Errors (USE) Method de Brendan Gregg. LesSRE Book de Google sont une autre ressource utile, en particulier le chapitre 6:Monitoring Distributed Systems. Pour apprendre à créer vos propres tableaux de bord Grafana, consultez la pageGetting Started de Grafana.

Dans la prochaine étape, nous suivrons un processus similaire pour nous connecter et explorer le système de surveillance Prometheus.

[[step-4 -—- access-prometheus-and-alertmanager]] == Étape 4 - Accéder à Prometheus et Alertmanager

Pour se connecter aux pods Prometheus, nous devons à nouveau utiliserkubectl port-forward pour rediriger un port local. Si vous avez terminé d'explorer Grafana, vous pouvez fermer le tunnel de transfert de port en appuyant surCTRL-C. Vous pouvez également ouvrir un nouveau shell et une nouvelle connexion de port.

Commencez par lister les services en cours d'exécution dans l'espace de nomsmonitoring:

kubectl get svc -n monitoring

Vous devriez voir les services suivants:

OutputNAME                                               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
alertmanager-operated                              ClusterIP   None                     9093/TCP,6783/TCP   34m
doks-cluster-monitoring-grafana                    ClusterIP   10.245.105.130           80/TCP              34m
doks-cluster-monitoring-kube-state-metrics         ClusterIP   10.245.140.151           8080/TCP            34m
doks-cluster-monitoring-pr-alertmanager            ClusterIP   10.245.197.254           9093/TCP            34m
doks-cluster-monitoring-pr-operator                ClusterIP   10.245.14.163            8080/TCP            34m
doks-cluster-monitoring-pr-prometheus              ClusterIP   10.245.201.173           9090/TCP            34m
doks-cluster-monitoring-prometheus-node-exporter   ClusterIP   10.245.72.218            30206/TCP           34m
prometheus-operated                                ClusterIP   None                     9090/TCP            34m

Nous allons transférer le port local9090 vers le port9090 du servicedoks-cluster-monitoring-pr-prometheus:

kubectl port-forward -n monitoring svc/doks-cluster-monitoring-pr-prometheus 9090:9090

Vous devriez voir la sortie suivante:

OutputForwarding from 127.0.0.1:9090 -> 9090
Forwarding from [::1]:9090 -> 9090

Cela indique que le port local9090 est transféré avec succès vers un pod Prometheus.

Visitezhttp://localhost:9090 dans votre navigateur Web. Vous devriez voir la page PrometheusGraphuivante:

Prometheus Graph Page

À partir de là, vous pouvez utiliser PromQL, le langage de requête Prometheus, pour sélectionner et regrouper les métriques de série temporelle stockées dans sa base de données. Pour en savoir plus sur PromQL, consultezQuerying Prometheus de la documentation officielle de Prometheus.

Dans le champExpression, tapezmachine_cpu_cores et appuyez surExecute. Vous devriez voir une liste de séries temporelles avec la métriquemachine_cpu_cores qui indique le nombre de cœurs de processeur sur un nœud donné. Vous pouvez voir quel nœud a généré la métrique et quel travail a récupéré la métrique dans les étiquettes de métriques.

Enfin, dans la barre de navigation supérieure, cliquez surStatus puis surTargets pour voir la liste des cibles que Prometheus a été configuré pour gratter. Vous devriez voir une liste de cibles correspondant à la liste des points de terminaison de surveillance décrits au début deStep 2.

Pour en savoir plus sur Promtheus et comment interroger vos métriques de cluster, consultez lesPrometheus docs officiels.

Nous suivrons un processus similaire pour nous connecter à AlertManager, qui gère les alertes générées par Prometheus. Vous pouvez explorer ces alertes en cliquant surAlerts dans la barre de navigation supérieure de Prometheus.

Pour nous connecter aux pods Alertmanager, nous utiliserons à nouveaukubectl port-forward pour rediriger un port local. Si vous avez fini d'explorer Prometheus, vous pouvez fermer le tunnel de transfert de port en appuyant surCTRL-C. Vous pouvez également ouvrir un nouveau shell et une nouvelle connexion de port.

Commencez par lister les services en cours d'exécution dans l'espace de nomsmonitoring:

kubectl get svc -n monitoring

Vous devriez voir les services suivants:

OutputNAME                                               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
alertmanager-operated                              ClusterIP   None                     9093/TCP,6783/TCP   34m
doks-cluster-monitoring-grafana                    ClusterIP   10.245.105.130           80/TCP              34m
doks-cluster-monitoring-kube-state-metrics         ClusterIP   10.245.140.151           8080/TCP            34m
doks-cluster-monitoring-pr-alertmanager            ClusterIP   10.245.197.254           9093/TCP            34m
doks-cluster-monitoring-pr-operator                ClusterIP   10.245.14.163            8080/TCP            34m
doks-cluster-monitoring-pr-prometheus              ClusterIP   10.245.201.173           9090/TCP            34m
doks-cluster-monitoring-prometheus-node-exporter   ClusterIP   10.245.72.218            30206/TCP           34m
prometheus-operated                                ClusterIP   None                     9090/TCP            34m

Nous allons transférer le port local9093 vers le port9093 du servicedoks-cluster-monitoring-pr-alertmanager.

kubectl port-forward -n monitoring svc/doks-cluster-monitoring-pr-alertmanager 9093:9093

Vous devriez voir la sortie suivante:

OutputForwarding from 127.0.0.1:9093 -> 9093
Forwarding from [::1]:9093 -> 9093

Cela indique que le port local9093 est transféré avec succès vers un pod Alertmanager.

Visitezhttp://localhost:9093 dans votre navigateur Web. Vous devriez voir la page suivante AlertmanagerAlerts:

Alertmanager Alerts Page

À partir de là, vous pouvez explorer les alertes de déclenchement et les désactiver éventuellement. Pour en savoir plus sur Alertmanager, consultez lesofficial Alertmanager documentation.

Conclusion

Dans ce didacticiel, vous avez installé une pile de surveillance Prometheus, Grafana et Alertmanager dans votre cluster DigitalOcean Kubernetes avec un ensemble standard de tableaux de bord, de règles Prometheus et d'alertes. Puisque cela a été fait à l'aide de Helm, vous pouvez utiliserhelm upgrade,helm rollback ethelm delete pour mettre à niveau, restaurer ou supprimer la pile de surveillance. Pour en savoir plus sur ces fonctions, consultezHow To Install Software on Kubernetes Clusters with the Helm Package Manager.

Le graphiqueprometheus-operator vous aide à démarrer rapidement la surveillance du cluster à l'aide de Helm. Vous souhaiterez peut-être créer, déployer et configurer manuellement Prometheus Operator. Pour ce faire, consultez les dépôts GitHubPrometheus Operator etkube-prometheus.

Related